3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Vim 起動中、または特定ファイル拡張子のときのみ処理を実行するやりかたを調べた

Posted at

はじめに

Vim を起動した直後、あるいはあるファイル拡張子の場合のみ、何か処理を実行したいと思うときがあると思います。

そのやり方を調べてみました。

Vim 起動中に処理を実行する

以下のような記述で実現できます。

if has('vim_starting')
  echo 'HelloWorld'
endif

組み込み関数 has({feature}) で、指定された feature が有効かどうかを判定します。

また feature vim_startingVim の feature-list の1つです。以下のように明記されています。

vim_starting Vimの初期化プロセス中は真となる。

Vim マニュアルの startup の項目には、Vim の初期化の最後のステップに以下のように書いてあります。起動中は vim_starting が 1 になっているということですね。

スタートフラグがリセットされ、has("vim_starting") がゼロを返すようになる。

特定のファイル拡張子のときに処理を実行する

autocmd という自動コマンドを定義することで使えるようです。使い方は以下のような形です。

autocmd <イベント> <ファイルパターン> <実行コマンド>

Vim マニュアルの autocmd-events

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 の意味が何なのかわかってなかったのですが、調べられてよかったです。

参考

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?