はじめに
Vim を起動した直後、あるいはあるファイル拡張子の場合のみ、何か処理を実行したいと思うときがあると思います。
そのやり方を調べてみました。
Vim 起動中に処理を実行する
以下のような記述で実現できます。
if has('vim_starting')
echo 'HelloWorld'endif
組み込み関数 has({feature})
で、指定された feature が有効かどうかを判定します。
また feature vim_starting
は Vim の feature-listの1つです。以下のように明記されています。
vim_starting Vimの初期化プロセス中は真となる。
Vim マニュアルの startup の項目には、Vim の初期化の最後のステップに以下のように書いてあります。起動中は vim_starting
が 1 になっているということですね。
スタートフラグがリセットされ、has("vim_starting") がゼロを返すようになる。
特定のファイル拡張子のときに処理を実行する
autocmd
という自動コマンドを定義することで使えるようです。使い方は以下のような形です。
autocmd <イベント> <ファイルパターン> <実行コマンド>
Vim のイベント一覧を見てもらうとわかると思いますが、非常にたくさんのイベントがあります。上記の vim_starting
は、Vim の起動処理中だったのに対し、様々なタイミングに対して処理を追加できます。
その中で例えば「特定のファイル拡張子のファイルを開いた後」としたい場合、新規作成・既存ファイル開くいずれも対応するには以下2つのイベントで良さそうです。
- BufNewFile: 存在しないファイルの編集を始めたとき
- BufRead: 新しいバッファの編集を始めたとき、ファイルを読み込んだ後
拡張子が .rb
のファイルを開いたときに Hello World
と表示したい場合は以下のような処理を書いておきます。
autocmd BufNewFile,BufRead *.rb echo 'Hello World'
ただ、上記を .vimrc
などに記載した場合、:source .vimrc
などで再度スクリプトを読み込んだ場合、自動コマンドが読み込まれるたびに登録されてしまいます。
そのために、augroup
という、自動コマンドの処理をグループ化するコマンドに、autocmd!
というすべての自動コマンドを削除する処理を入れておくことで重複登録を回避できます。
augroup Hello
autocmd!
autocmd BufNewFile,BufRead *.rb echo 'Hello World'
augroup END
おわりに
たまに他の人の .vimrc
を読んだときに書いてあった autocmd
の意味が何なのかわかってなかったのですが、調べられてよかったです。