2013-11-02

Vim中級者を脱する augroup編

augroup, autocmdを理解する

所要時間 3分

この記事を読むべき人

  • augroupを理解していない人
  • :sourceコマンドを使う人

そもそもautocmdって?

これは何をしているコマンドなのか分解してみましょう。

autocmd BufNewFile * echo 'This is new file'
  1. autocmdのコマンドを開始しますよ
  2. BufNewFileというタイミングでこのコマンドを実行しますよ
  3. 全てのバッファでecho 'This is new file'を実行しますよ

となります。

このように、保存時や新規のファイルといったタイミングでコマンドを実行できます。

では、augroupはなんのために存在するの?

augroupは、autocmdをグループでまとめるためのコマンドです。こんな感じて使われます。

augroup EditNewFile
  autocmd!
  autocmd BufNewFile * echo 'This is new file'
augroup END

例えば、autocmdが設定されているvimrcを、:source ~/.vimrcで再度読み込むとしましょう。

するとどうなるかというと、通常は**autocmdが重複して2度設定されます** 当然、そのautocmdが発火するときに2度実行されるので、実行が遅くなります。

それを防ぐためにaugroupを使います。

ベストプラクティスは?

つまるところ、augroupautocmdをまとめて初期化する場合に使用します。 具体例を上げると、下記のような形になります。

augroup MyAutoCmd
  autocmd! " => このaugroupに紐づいたautocmdを消し去ります
augroup END

...

augroup MyAutoCmd
  autocmd BufNewFile * echo 'This is new file'
  autocmd BufNewFile,BufRead *.haml setf haml
augroup END

こうすることで、2重に設定されることのない設定になります。

もう一歩踏み込んでみる

autocmdの設定方法をVimのRuntimeから学んでみましょう。

:edit $VIMRUNTIME/filetype.vim

これはファイルタイプの定義を行っているファイルです。

augroupが宣言されているので、一覧を:autocmd filetypedetectでみれることが分かります。

驚くことに、もの凄い数のコマンドを実行してファイルタイプを設定していることが分かります。

ftdetectを知る

filetype.vimにてruntime! ftdetect/*.vimと書かれており、~/.vim/ftdetect/*を読み込んでいることが分かります。

つまり、ファイルタイプの設定はftdetect以下で設定するのがベターとされています。

" ~/.vim/ftdetect/coffee.vim
autocmd BufNewFile,BufRead *.coffee    setf coffee

といった設定にて、ファイルタイプを検出できるようになります。 augroup filetypedetectの宣言内なので、グループの宣言は不要です。

本日の脱Vim中級者

vimrcでファイルタイプの検出をしている方は、~/.vim/ftdetect以下に設定を移してみましょう。