Help us understand the problem. What is going on with this article?

おさらい 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/

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした