surround.vimにドットコマンドを効かせる

surround.vimはカッコやクォートなどのペアを消したり置換したりできるコマンドを加えるplugin。ダブルクォートになっているものをシングルクォートにしたいことなどよくあるので便利。

複数箇所に同じ置換を行いたい場合、少数ならドットコマンドで繰り返し適用することが多いが、これはvimのデフォルトの機能しか認識してくれないためsurround.vimのコマンドなどには適用されない。

これを解消してくれるのがrepeat.vim
https://github.com/tpope/vim-repeat
ただ入れるだけでOK、私はdeinを使ってるのでこれだけ

[[plugins]]
repo = 'tpope/vim-repeat'
on_idle = 1

READMEを読むとsurround.vim以外にもいくつかのpluginに対応している模様
その中に地味に便利そうなpluginがあったのでもう一つ
https://github.com/tpope/vim-speeddating

これはCtrl-a, Ctrl-xの機能を拡張するpluginで、対応する文字列がdateのformatだった場合はそれに合わせてincrement, decrementしてくれるというもの。2016-10-29 00:00:00みたいな文字列の29を30にincrementしようとしてCtrl-aしたら28になったということは誰もが経験してるはず。

こちらのpluginもただ入れるだけでOKなので楽ちん

Neomake - 非同期実行のSyntastic

syntasticを使っていると大きなファイルでsyntax checkなどするとしばらく応答が返らないことがよくある。neovimには非同期でjobを実行する機能があり、それを活かしたpluginとしてNeomakeというsyntasticと同様の機能をもつものがあることを知ったので使ってみた

deinを使っていれば以下のような設定だけでOK

 [[plugins]]                               
 repo = 'neomake/neomake'                  
 hook_add = '''                            
 autocmd! BufWritePost * Neomake           
 '''                                       

ファイルを開いて最初にNeomakeを実行するときだけ一瞬固まるが、その後はNeomake実行時にもカーソルが動かせること確認できた
ちなみにvimでも動くが非同期実行はできない

デフォルトの設定ではerrorを見つけた際もlocation listが開かないので:lopenを使う
もしくは以下の設定を入れれば自動で開くようになる

let g:neomake_open_list = 2

syntasticと同じく、:NeomakeInfoで現在どのmakerが有効なのか確認できる(makerとはsyntasticで言うcheckerのこと)

また、makerのカスタマイズもsyntasticと同様の形でできる

"let g:neomake_{ filetype }_{ makername }_maker
let g:neomake_javascript_jshint_maker = {
    \ 'args': ['--verbose'],
    \ 'errorformat': '%A%f: line %l\, col %v\, %m \(%t%*\d\)',
    \ }
let g:neomake_javascript_enabled_makers = ['jshint']

errorを示すsignの変更も可能
もちろんwarningやinfoなども別々に可能

let g:neomake_error_sign = {
  \ 'text': 'E',
  \ 'texthl': 'ErrorMsg',
  \ }

詳しくはhelpで

参考

vimでコマンドの出力をキャプチャする

特定のファイルにコマンドの出力を書き出したいときはこれ
!をつけることで新規のファイルでも書き込める

:redir! > file
:echo 'aaa'
:redir end

これでaaaという文字列がfileに書かれる
ちなみにredirはrediと省略して書ける
また、rediはredirectの略
ファイルに追記したい場合は>>を使えばよい

:redi >> %
:echo 'bbb'
:redi end

これでbbbという文字列が現在編集中のファイルの末尾に追記される(bufferに反映させるには:e!する必要あり)

出力をレジスタに入れることもできる

:redi @a
:echo 'testtest'
:redi end

レジスタに入れてしまえば後はbufferで好きなように使える

redi endが実行されるまでの出力すべてがキャプチャされるため、その間にエラーなどが発生すればそれもすべてキャプチャされることに注意