本記事は Vim Advent Calendar 2013 の 20 日目の記事です。
19 日目は @orga_chem さんによる、vim-splashを使い倒してこそ真のVimmerですぞ でした。@orga_chem さんは VAC2013 のトップ絵も書かれています。素敵ですよね、Vimgirl かわいい。
最近巷で噂の vimrc 読書会 ですが、この最中によく指摘される事柄として、autocmd に付随する augroup の定義がない、というものがあります。
autocmd は便利かつ多用されますが、その裏で気づかれにくい・知られにくいこの件について今回は記事を書いてみます。
autocmd の概要
autocmd は Vim で指定したイベントが起きた際に自動的に実行するコマンドを指定するコマンドです。
autocmd BufNewFile * put ='ビムゥ'
例えばこのような autocmd
を定義すると、存在しない新しいファイルの編集を始める際に自動で
ビムゥ
と入力され、大変便利です。ここでは BufNewFile というイベントを指定しており、存在しないファイルの編集を始めたときにコマンドを実行させることができます。
イベント一覧については:help {event}
を参照してください。
問題点
ところで .vimrc をモリモリ編集した後、再読み込みすると思います。:source ~/.vimrc
上記の設定がある .vimrc を再読み込みした後、新しいファイルを編集します。
ビムゥ
ビムゥ
上記のようになってしまうはずです。これは大事なことなので 2 回出たわけではなく、autocmd
は上書きされずに複数回定義されてしまうからです。
au BufNewFile *
で確認することができます。
.vimrc を読み込む際に autocmd!
することで定義済みの autocmd
が削除されこの問題は回避することができますが、想定していない autocmd の定義まで削除されてしまう恐れがあります。
augroup
そこで augroup
を使っていきます。
augroup
は autocmd
をグループ化します。
augroup vimrc_loading
autocmd!
autocmd BufNewFile * put ='ビムゥ'
augroup END
このように記述することで、autocmd
は augroup vimrc_loading
に属することとなります。グループの中で行われた autocmd!
コマンドは同じグループの autocmd
定義のみを削除します。
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/