Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5608

おさらい autocmd/augroup

$
0
0

本記事は 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/


Viewing all articles
Browse latest Browse all 5608

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>