pockestrap

Programmer's memo

vimのautocmd、augroupを便利に使う

vimrc には、augroupを書くことが一般的です。

augroup MyVimrc
  autocmd!
augroup END

vimrcの上の方にこの3行を書いて、autocmdを使用する度に以下のように書きます。

autocmd MyVimrc FileType help nnoremap <buffer> q <C-w>c

こうすることにより、vimrcを複数回読み込んでもautocmd複数回実行されなくなります。

ですが、毎回MyVimrcと書くのはめんどくさいですね。忘れてしまうかもしれません。 そんな問題が、rhysdさんのvimrcを読んでいたら解決しました。

dotfiles/vimrc at 2adcc01ffad9873f69441dab9bf0d3ac5cf337e2 · rhysd/dotfiles · GitHub

" Vimrc augroup
augroup MyVimrc
    autocmd!
augroup END
command! -nargs=* Autocmd autocmd MyVimrc <args>
command! -nargs=* AutocmdFT autocmd MyVimrc FileType <args>
" XXX
AutocmdFT vim highlight def link myVimAutocmd vimAutoCmd
AutocmdFT vim match myVimAutocmd /\<\(Autocmd\|AutocmdFT\)\>/

このようにすると、先ほどのautocmdがこのように書けます。

Autocmd FileType help nnoremap <buffer> q <C-w>c

便利ですね。しかし、これには問題があります。 上記のシンタックス設定だと、続くFileTypeなどのイベント名が正しくハイライトされません

そのため、先ほどのvimrcでhighlightmatchしている下2行を削除し、~/.vim/after/syntax/vim.vim に次のように書きましょう。

highlight def link myVimAutoCmd vimAutoCmd
syntax keyword myVimAutoCmd Autocmd skipwhite nextgroup=vimAutoEventList

これで、FileTypeなども正しくハイライトされるようになりました。

この設定で、Autocmdを使い続けている限りは問題なくハイライトされます。 ですが、実は普通にaugroupを使った場合ではイベント名がハイライトされません。

そのため、先ほどの~/.vim/after/syntax/vim.vimに次の2行を追記しましょう。

syntax match    vimAutoGroup contained "\S\+" nextgroup=vimAutoEventList skipwhite
syntax keyword  vimAutoCmd  au[tocmd] do[autocmd] doautoa[ll]  skipwhite nextgroup=vimAutoEventList,vimAutoGroup

これで、augroupを使用した場合にきちんとイベント名がハイライトされるようになりました。