Edited at

おさらい autocmd/augroup

More than 3 years have passed since last update.

本記事は Vim Advent Calendar 2013 の 20 日目の記事です。

19 日目は @orga_chem さんによる、vim-splashを使い倒してこそ真のVimmerですぞ でした。@orga_chem さんは VAC2013 のトップ絵も書かれています。素敵ですよね、Vimgirl かわいい。

最近巷で噂の vimrc 読書会 ですが、この最中によく指摘される事柄として、autocmd に付随する augroup の定義がない、というものがあります。

autocmd は便利かつ多用されますが、その裏で気づかれにくい・知られにくいこの件について今回は記事を書いてみます。


autocmd の概要

autocmd は Vim で指定したイベントが起きた際に自動的に実行するコマンドを指定するコマンドです。


.vimrc

autocmd BufNewFile * put ='ビムゥ'


例えばこのような autocmd を定義すると、存在しない新しいファイルの編集を始める際に自動で

ビムゥ

と入力され、大変便利です。ここでは BufNewFile というイベントを指定しており、存在しないファイルの編集を始めたときにコマンドを実行させることができます。

イベント一覧については:help {event}を参照してください。


問題点

ところで .vimrc をモリモリ編集した後、再読み込みすると思います。:source ~/.vimrc

上記の設定がある .vimrc を再読み込みした後、新しいファイルを編集します。

ビムゥ

ビムゥ

上記のようになってしまうはずです。これは大事なことなので 2 回出たわけではなく、autocmd は上書きされずに複数回定義されてしまうからです。

au BufNewFile * で確認することができます。

.vimrc を読み込む際に autocmd! することで定義済みの autocmd が削除されこの問題は回避することができますが、想定していない autocmd の定義まで削除されてしまう恐れがあります。


augroup

そこで augroup を使っていきます。

augroupautocmd をグループ化します。


.vimrc

augroup vimrc_loading

autocmd!
autocmd BufNewFile * put ='ビムゥ'
augroup END

このように記述することで、autocmdaugroup vimrc_loading に属することとなります。グループの中で行われた autocmd! コマンドは同じグループの autocmd 定義のみを削除します。


.vimrc

augroup erase

autocmd!
autocmd BufNewFile * put ='ビムゥ' " 消える
augroup END

autocmd erase BufNewFile * put ='ビムゥ?' " 消える

augroup erase
autocmd BufNewFile * put ='ビムゥッ' " 消える
augroup END

augroup not_erase
autocmd BufNewFile * put ='ビムゥ!!' " 消えない
augroup END


このようにして目的の autocmd だけを再定義する、リローダブルな .vimrc を書くことができます。


補足

実際のところ日本人の vimrc ではきちんと設定されていることがほとんどで、読書会で上がる際は大抵外国の方の vimrc ばかりだったりします。

ただ英語力が Vim 始めたての方がわかりにくいところでもあると思うので、そういう方のお役に立てばと思います。

以上 Vim Advent Calendar 2013 21 日目の記事でした、次回 22 日目は @harukey2525 さんです。


参考

http://whileimautomaton.net/2008/08/vimworkshop3-kana-presentation

http://vim-users.jp/2009/07/hack40/

http://vim-users.jp/2009/09/hack74/

http://vim-users.jp/2011/10/hack234/