効率厨の俺が紹介する時短ツール&テクニック(シュチュエーション別)

wan, 2015-12-21(月), Vim

Vim

効率厨の俺が紹介する時短ツール&テクニック(シュチュエーション別)

これは「 Tech YuruYuru 」アドベントカレンダー21日目の記事です。
「 Djangoのform関連かRaspberryPi関連について書きます。 」とか言っておきながらこれです、許してにゃん


だいぶ Vim 成分多め、というかほぼ Vim 、言語関係ない部分の話です。
もっと楽できるいい方法あったら教えろください!

unite.vim(neomru.vim) × vimfiler × ag(The Silver Searcher)

作業が振られる → 該当部を調べ修正

普通業務の流れって大まかに言えば上記、その中でも

上記の作業って結構多いような気がするので、これを
unite.vim(neomru.vim) × vimfiler × ag(The Silver Searcher) を使って効率化します

一度開いたファイルなら neomru.vim(neomru.vimはunite.vimの拡張)unite.vim でファイルの一覧表示・絞り込みができるのでファイルの切り替えはこれを使いましょう
(正直色々uniteの拡張プラグイン入れているけど、今のとこneomru.vimだけで十分)

開いた事がないファイルだったりツリー表示でファイルやディレクトリの構成を知りたかったら vimfiler を使いましょう。
ファイルの作成や解除、リネームやパスのコピー等の作業もvimfilerから行えるので時短に繋がる

grepにはVimから ag(The Silver Searcher) を使いましょう(今なら highway とかもあり)
unite_grepからag(The Silver Searcher)を使う事でいちいちターミナルに戻って云々とかが無くなります

vim-mercenary

例えばこんなシュチュエーション

上司:「 あーここの部分でエラーが出ててんじゃねーか(チャットにコードペター) 」
  僕: (やべっ!このファイル最近いじったけどもしかして俺かな...?)
そんな時は vim-mercenary:HGblame を入力するだけで誰がコードを書いたのかを突き止めます。
もしこれで自分が犯人だった場合は即刻スライディング土下座の準備に入りましょう
該当部のチェンジセットも日付も表示されるので、どの作業でバグが発生したのか追跡も容易ですね!

Gitな人はおとなしく vim-fugitive 使っとこうな

caw.vim

以外とコードを書いてるとコメントアウトする事が多かったりします。
これを手動で行うのは時間の無駄

なので caw.vim 入れましょう。

以下の様にトグルで行える様にするのが俺のジャスティス!
範囲選択でもコメントアウトできるので便利
NeoBundle 'tyru/caw.vim'
nmap <Leader>c <Plug>(caw:I:toggle)
vmap <Leader>c <Plug>(caw:I:toggle)

percol

シェルでのディレクトリの移動だったり、Control+rだったり、死んだプロセス調べてkillだったり結構めんどくさくないですか?
時短したいなら全部 percol に任せちゃいましょう。

ナウいPeco使えッ!とか言われても困りますしおすし
最低限コマンド履歴の検索・絞り込みはできるように設定しとこうな、というかこれだけで十分時短に繋がる
じゃないとペアプロ時に先輩をイライラさせちゃうぞ!

mycli

Sequel Pro とかいらんやろ!漢ならCUIでゴリゴリいくぜッツ!
あっ、 mycli だけはいれさせろくださいすいませんすいません

r!

例えばVim開いている時にシェル出力の内容をVimに貼り付けたい時ってありませんか?

そんな時は read!(r!) を使いましょう。
:r! hg diff -r hoge:huga
" 現在のVimのバッファにdiffが出力される

-R と + と -

全部Vimの起動時のオプションです。


例えば初見のコードを眺める時、コードを追っていく作業の中で誤爆とかしたくないですよね?
そういう時はVimを -R オプションをつけて起動しましょう。これで編集中のファイルはreadonlyで開かれます

例えばVimを開いてファイル内の文字列を検索する際に、一度Vimを開いて/hogehuga とか打つのめんどくさいっすよね?
そういう場合はVimを +/検索文字列 をつけて起動しましょう。 Vim開いた後に/検索文字とした時と同じ動作になります。

上で紹介したr!とは逆にターミナルにいる時にシェルの出力をVimに持っていきたい時とかありませんか?
そういう時は - オプションを使用しましょう
hg diff|vim -
# ただこれだと環境によっては文字化けしたりするので以下の方が無難

vim +"r! hg diff"
# これだと文字化け等の心配はない

vim +"r! echo 'select * from hoge'|mysql -u root database"
# 上記とかたまに使う

gundo.vim × persistent_undo

過去に対象のファイルに行った変更内容が必要になった事ありませんか?
いやそれコミットしとけよ!って話なんですけど忘れてたり、粒度が小さい変更を書いては消してとかしてる事ありますよね

そんな時は gundo.vim × persistent_undo を使いましょう

gundo.vim はファイルの変更履歴をバージョン管理ツールのGUIみたく操作できます。
これはVimのundoの情報を見て辿っているのですが、一度Vimを終了するとこのundo情報は消えます。

僕の作業スタイルは必要になった時だけVimを起動して作業後消すというスタイルの為、undo情報が消え去ってしまうのですがvimrcで persistent_undo を設定しとけば、このundo情報をファイルとして残す事が可能です。

以下の様な感じで使っています
if has('persistent_undo')
  set undodir=/Users/wan/.vim/undo_history
  augroup vimrc-undofile
    autocmd!
    autocmd MyAutoCmd BufReadPre ~/* setlocal undofile
  augroup END
endif


NeoBundleLazy 'wanshot/gundo.vim', {
  \ 'autoload': {
  \   'commands': ['GundoToggle'],
  \ }}
nnoremap <Leader>z :GundoToggle<CR>

hjkl移動

ツールではないのですがこれができる様になると結構な時短になったので

ずっとカーソル移動だったけど、以下をvimrcに設定して矯正したら1週間ぐらいで慣れたん

noremap <Up> <Nop>
noremap <Down> <Nop>
noremap <Left> <Nop>
noremap <Right> <Nop>

vim-table-mode

reStructuredTextのテーブルって書くのめんどくさいって思いませんか? 僕はreStructuredTextでテーブルを書く事がいっぱいあるのでこれも時短する必要がありました。

reStructuredTextのテーブルの書き方はsimple-table、csv-table、list-table、grid-tableがあります。 しかし、どれも問題があると思います

そこで vim-table-mode を使いましょう!これはVimでテーブルを書きたい時に便利です。 主に以下のような動作をします

しかしこれはこれで便利なのですがreStructuredTextのgrid-tableはgridを崩して書かなければいけない時の方が多いので実はあまり役にたちません。

なので、消去法でcsv-tableを書く事になると思うのですが、これを人間にやさしい書き方で書ける様に雑なVimScriptを書きました

command! CSV call CsvTableDirective()
nnoremap csv :CSV<CR>

let s:option_parse = {
      \"h": "   :header: ",
      \"w": "   :widths: ",
      \"c": "   :class: ",
      \}

function! CsvTableDirective() range
  for num in range(a:firstline, a:lastline)
    if "" !=# matchstr(getline(num), '\v^csvtable\s*.*')
      let end = num + 1
      while "" !=# getline(end)
        let end += 1
      endwhile
      let csv_name = matchstr(getline(num), '\v^csvtable\s\zs.*')
      if csv_name == ""
        let csv_line = ".. csv-table::"
      else
        let csv_line = ".. csv-table:: " . csv_name
      endif
      let repl = substitute(getline(num), getline(num), csv_line, "g")
      call setline(num, repl)
      for n in range(num+1, end)
        if "" !=# matchstr(getline(n), '\v^-\a\s+\.*(,|.)*')
          let opt = matchstr(getline(n), '\v^-\zs\a\ze')
          let args = matchstr(getline(n), '\v^-\a\s+\zs.*(,|.)*')
          let convert_line = s:option_parse.table_option(opt, args)
          call setline(n, convert_line)
          let n += 1
          if "" == matchstr(getline(n), '\v^-\a\s+\.*(,|.)*')
            call append(n-1, "")
          endif
        endif
        if "" !=# matchstr(getline(n+1), '\v^\S+(.|,)*.$')
          let line = '   '
          let column_list = split(getline(n+1), ",")
          for column in column_list
            let line = line . '"' . column . '"' . ', '
          endfor
          let content_line = line[:-3]
          call setline(n+1, content_line)
        endif
      endfor
    endif
  endfor
endfunction

function! s:option_parse.table_option(opt, args) dict
  let line = eval("self." . a:opt)
  let column_list = split(a:args, ",")
  for column in column_list
    let line = line . column . ', '
  endfor
  return line[:-3]
endfunction

こんな感じでvimrcに書いてあげれば、以下の文章が

csvtable 純情ロマンチカ
-h 登場人物名,読み仮名,声優
-w 100,100,100
高橋美咲,たかはし みさき,櫻井孝宏
宇佐見秋彦,うさみ あきひこ,花田光

「csvtable 純情ロマンチカ」の行で csv と入力するだけで下記の様にゆるい感じで変換されます

.. csv-table:: 純情ロマンチカ
   :header: 登場人物名, 読み仮名, 声優
   :widths: 100, 100, 100

   "高橋美咲", "たかはし みさき", "櫻井孝宏"
   "宇佐見秋彦", "うさみ あきひこ", "花田光"

source-highlight

Vimとかターミナルとかはカラフルにしてんのに less 出力はモノクロってナンセンスだと思いませんか?

僕は結構な頻度でlessも使うので、遅い思考速度がさらに遅くならない為に source-highlight いれています。

まとめ

速さ is ぱわー!!

ツイート このエントリーをはてなブックマークに追加