*autocmd.txt* For
Vim バージョン 7.3. Last change: 2012 Feb 22
VIM REFERENCE MANUAL by Bram Moolenaar
自動コマンド
*autocommand*
基本的な説明については、ユーザマニュアルの
|40.3| 章を参照。
1. はじめに
|autocmd-intro|
2. 自動コマンドの定義
|autocmd-define|
3. 自動コマンドの削除
|autocmd-remove|
4. 自動コマンドの列挙
|autocmd-list|
5. イベント
|autocmd-events|
6. パターン
|autocmd-patterns|
7. バッファローカルな自動コマンド
|autocmd-buflocal|
8. グループ
|autocmd-groups|
9. 自動コマンドの実行
|autocmd-execute|
10.自動コマンドの使用
|autocmd-use|
11.自動コマンドを無効にする
|autocmd-disable|
{Vi にはこういったコマンドは全くない。}
{only: |+autocmd| の機能は、コンパイル時に有効にされていなければ使えない。}
==============================================================================
1. はじめに
*autocmd-intro*
ファイルを読み込んだり書き込むときや、バッファやウィンドウに入ったり出たりし
たとき、あるいはVimを終了させるときに、コマンドを自動的に実行するように指定で
きる。 例えば "*.c" にマッチするファイルに対して、オプション
'cindent' をオン
にする自動コマンドを作ることができる。また自動コマンドでさらに高度な機能を実
装することができる。圧縮ファイルを編集するといったような機能だ (
|gzip-example|
を参照)。こういった自動コマンドはファイル .vimrc かファイル .exrc に書き込む。
*E203* *E204* *E143* *E855*
注意:自動コマンドは大変強力であるので、思いも寄らない副作用をもたらすことがあ
る。テキストを壊さないように注意しなければならない。
- 捨ててもよいようなファイルのコピーに対して、最初にテストしておくのがよい。例
えば、ファイルの編集開始時にファイルを解凍する自動コマンドを使うときには、
書き込みするときに圧縮を行う自動コマンドが正しく働くか確かめること。
- 実行中のエラー (例えばディスクが満杯になる) に対して、対処の準備をしておかな
ければならない。バッファへの変更に対しては大抵アンドゥができるが、他のファイ
ルへの変更は、自分で処理しなければならないかもしれない (例えば、解凍されたファ
イルを圧縮する、等)。
- もしイベント BufRead* の自動コマンドによって圧縮ファイルを編集できるなら、
FileRead* でも同じ事ができるようにするべきである (こうすることで復旧可能にな
る場合がたまにある)。可能であれば、イベント File* や Buf* には同じ自動コマン
ドを使うのはよい考えだ。
==============================================================================
2. 自動コマンドの定義
*autocmd-define*
Note: コマンド ":autocmd" には他のコマンドを続けることはできない。'|' はみなコ
マンドの一部と認識されるからである。
*:au* *:autocmd*
:au[tocmd]
[group] {event} {pat} [nested] {cmd}
{pat} |autocmd-patterns| に一致するファイルで、
{event}
のときに自動的に実行するコマンドのリストに、
{cmd} を加
える。
{cmd} は常に既存の自動コマンドの後に追加されるので、
自動コマンドは指定された順に実行される。
[nested] につ
いては
|autocmd-nested| を参照。
特殊なパターン
<buffer>や<buffer=
N>はバッファローカルな自動コマンドを定義する。
|autocmd-buflocal|を参照.
Note ":autocmd" の引数の中の特別な文字 (例えば "%" や "
<cword>" 等) は、
自動コマンドが定義されたときに展開されるのではなく、イベントの発生が認識され、
{cmd} が実行されるときに展開されることに注意せよ。唯一の例外は、"
<sfile>" が
自動コマンドが定義されたときに展開されることである。例:
ここで
<sfile> は、この行を含むファイルの名前に展開される。
ファイル .vimrc が2回読み込まれるとき、自動コマンドは二度現れる。これを避ける
ため、このコマンドをファイル .vimrc の自動コマンドを定義する所の前に入れてお
く必要がある。
もし全ての自動コマンドを消去したくなかったら、代わりに変数を使って
自動コマンドを読み込むのがただ1度だけにすることができる。
引数
[group] が指定されないと、現在のグループが使われる (":augroup" で定義さ
れたもの)。そうでなければ、Vimは
[group] で定義されたグループを使う。
Note [group] はあらかじめ定義されていなければならないことに注意。
":au group ..." で新しいグループを定義することはできない。それには ":augroup"
を使うこと。
自動コマンドをテストするとき、オプション
'verbose' が便利かもしれない。
この設定により、Vimは自動コマンドが実行されるとそれらを表示するようになる。
スクリプト内で自動コマンドを定義するときには、スクリプト内でのみ有効なローカ
ル関数とローカルキーマップを利用できる。イベントが発生してコマンドが実行される
とき、コマンドは自分の定義されたスクリプト内での設定に従って働く。これはコマン
ドに
|<SID>| が使われているときに問題になる。
コマンドを実行するとき、あるコマンドからのメッセージは前のメッセージを上書きし
てしまう。これはコマンドを手動で実行するときとは違う動作である。大抵、メッセー
ジスクリーンはスクロールしないので、「続けるには」というプロンプトは現れない。
また1個のコマンドが2つのメッセージを出すときには、何にせよメッセージは上書きさ
れてしまう。
==============================================================================
3. 自動コマンドの除去
*autocmd-remove*
:au[tocmd]!
[group] {event} {pat} [nested] {cmd}
{event} と
{pat} に関連づけられた全ての自動コマンドを
除去し、コマンド
{cmd} を加える。
[nested] については
|autocmd-nested| を参照。
:au[tocmd]!
[group] {event} {pat}
{event} と
{pat} に関連づけられた全ての自動コマンドを
除去する。
:au[tocmd]!
[group] *
{pat}
{pat} に関連づけられた、全てのイベントに関する
自動コマンドを全て除去する。
:au[tocmd]!
[group] {event}
{event} に関連づけられた「全ての」自動コマンドを除去す
る。
:au[tocmd]!
[group] 「全ての」自動コマンドを除去する。
引数
[group] が指定されないと、現在のグループが使われる (":augroup" で定義され
たもの)。そうでなければ、
[group] で定義されたグループが使われる。
==============================================================================
4. 自動コマンドの列挙
*autocmd-list*
:au[tocmd]
[group] {event} {pat}
{event} と
{pat} に関連づけられた全ての自動コマンドを
表示する。
:au[tocmd]
[group] *
{pat}
{pat} に関連づけられた、全てのイベントに関する
自動コマンドを表示する。
:au[tocmd]
[group] {event}
{event} に関連づけられた全ての自動コマンドを表示する。
:au[tocmd]
[group] 全ての自動コマンドを表示する。
引数
[group] を指定すると、
[group] に関する自動コマンドのみが列挙される。そ
うでなければ、「全ての」グループに関する自動コマンドが表示される。
Note ここで
の引数による動作の違いは、自動コマンドを定義したり除去するときとは違うことに注
意。
バッファローカルな自動コマンドを列挙するには、
<buffer>または<buffer=
N>という形
のパターンを使う。
|autocmd-buflocal|を参照。
*:autocmd-verbose*
'verbose'がゼロでないならば、自動コマンドを列挙するときに、それが最後にどこで
定義されたかも表示する。例:
より詳しい情報は
|:verbose-cmd|を参照。
==============================================================================
5. イベント
*autocmd-events* *E215* *E216*
複数のイベントをコンマ(,)で区切ったリストにして指定することもできる。そのリス
トにはスペースを含めてはいけません。そのコマンドは指定したリストにある全てのイ
ベントに適用されます。
「ファイル読み込み」には次の4種類のイベントが発生しうる。
BufNewFile 存在しないファイルの編集を開始する。
BufReadPre BufReadPost 既存のファイルの編集を開始する。
FilterReadPre FilterReadPost フィルタの出力による一時ファイルを読み
込む。
FileReadPre FileReadPost その他のファイルを読み込む。
Vimはファイルを読み込むときにこの4種類のうちどれか1つを利用する。"Pre"と"Post"
のイベントは、ファイル読み込みの前後で両方とも起動される。
Note イベント *ReadPre や、全てのイベント Filter に関する自動コマンドは、カレ
ントバッファを変更してはならないことに注意 (これが起きると、エラーメッセージが
表示される)。これは、間違ったバッファにファイルを読み込むのを防ぐためである。
Note オプション
'modified' は、BufReadPost と BufNewFile の自動コマンドを実行
した「後に」オフに設定されることに注意。しかし
'modified' が自動コマンドから
オンに設定されたときはそうならない。
'eventignore' は、いくつかあるいは全てのイベントを無視するために使える。
*autocommand-events* *{event}*
Vimは以下のイベントを認識する。イベント名が大文字か小文字かは無視される (例え
ば "BufRead" の代わりに "BUFread" や "bufread" が使える)。
まず機能ごとに短い説明とともに概要を解説する。それから完全な説明とともにアル
ファベット順のリストを載せる
|autocmd-events-abc|。
名前 発生するとき
読み込み
|BufNewFile| 存在しないファイルの編集を始めたとき
|BufReadPre| 新しいバッファの編集を始めたとき。ファイルを読み込む前
|BufRead| 新しいバッファの編集を始めたとき。
ファイルを読み込んだ後
|BufReadPost| 新しいバッファの編集を始めたとき。
ファイルを読み込んだ後
|BufReadCmd| 新しいバッファの編集を始める前
|Cmd-event|
|FileReadPre| ":read"でファイルを読み込む前
|FileReadPost| ":read"でファイルを読み込んだ後
|FileReadCmd| ":read"でファイルを読み込む前
|Cmd-event|
|FilterReadPre| フィルタコマンドでファイルを読み込む前
|FilterReadPost| フィルタコマンドでファイルを読み込んだ後
|StdinReadPre| 標準入力からバッファに読み込む前
|StdinReadPost| 標準入力からバッファに読み込んだ後
書き込み
|BufWrite| バッファ全体をファイルに書き込むとき
|BufWritePre| バッファ全体をファイルに書き込むとき
|BufWritePost| バッファ全体をファイルに書き込んだ後
|BufWriteCmd| バッファ全体をファイルに書き込む前
|Cmd-event|
|FileWritePre| バッファの一部をファイルに書き込むとき
|FileWritePost| バッファの一部をファイルに書き込んだ後
|FileWriteCmd| バッファの一部をファイルに書き込む前
|Cmd-event|
|FileAppendPre| ファイルに追加するとき
|FileAppendPost| ファイルに追加した後
|FileAppendCmd| ファイルに追加する前
|Cmd-event|
|FilterWritePre| フィルタコマンドやdiff用にファイルを書き込むとき
|FilterWritePost| フィルタコマンドやdiff用にファイルを書き込んだ後
バッファ
|BufAdd| バッファリストにバッファを追加した直後
|BufCreate| バッファリストにバッファを追加した直後
|BufDelete| バッファリストからバッファを削除する前
|BufWipeout| 完全にバッファを削除する前
|BufFilePre| カレントバッファの名前を変える前
|BufFilePost| カレントバッファの名前を変えた後
|BufEnter| バッファに入った後
|BufLeave| 別のバッファへ移る前
|BufWinEnter| バッファがウィンドウに表示された後
|BufWinLeave| バッファがウィンドウから削除される前
|BufUnload| バッファをアンロードする前
|BufHidden| バッファが隠れバッファになった直後
|BufNew| 新規バッファを作成した直後
|SwapExists| 既存のスワップファイルを検出したとき
オプション
|FileType| オプション
'filetype'がセットされたとき
|Syntax| オプション
'syntax'がセットされたとき
|EncodingChanged| オプション
'encoding'が変更された後
|TermChanged| オプション
'term'が変更された後
起動と終了
|VimEnter| 全ての起動処理が終わった後
|GUIEnter| GUIの起動が成功した後
|TermResponse| |t_RV|に対する端末の反応を受け取った後
|VimLeavePre| Vimを終了する前、viminfoファイルを書き出す前
|VimLeave| Vimを終了する前、viminfoファイルを書き出した後
その他
|FileChangedShell| 編集を始めた後にファイルが変更されたことを検出したとき
|FileChangedShellPost| 編集を始めた後にファイルが変更されたことに対処した後
|FileChangedRO| 読み込み専用ファイルに対して最初に変更を加える前
|ShellCmdPost| シェルコマンドを実行した後
|ShellFilterPost| シェルコマンドでフィルタをかけた後
|FuncUndefined| 呼び出そうとしたユーザ定義関数が定義されていなかったと
き
|SpellFileMissing| スペリングファイルを使おうとしたが見つからなかったとき
|SourcePre| Vimスクリプトを読み込む前
|SourceCmd| Vimスクリプトを読み込む前
|Cmd-event|
|VimResized| Vimのウィンドウサイズが変わったとき
|FocusGained| Vimが入力フォーカスを得たとき
|FocusLost| Vimが入力フォーカスを失ったとき
|CursorHold| ユーザが一定時間キーを押さなかったとき
|CursorHoldI| インサートモードでユーザが一定時間キーを押さなかった
とき
|CursorMoved| ノーマルモードでカーソルが移動したとき
|CursorMovedI| インサートモードでカーソルが移動したとき
|WinEnter| 別のウィンドウに入った後
|WinLeave| ウィンドウから離れる前
|TabEnter| 別のタブページに入った後
|TabLeave| タブページから離れる前
|CmdwinEnter| コマンドラインウィンドウに入った後
|CmdwinLeave| コマンドラインウィンドウから離れる前
|InsertEnter| インサートモードを開始したとき
|InsertChange| インサートや上書きモードで
<Insert>をタイプしたとき
|InsertLeave| インサートモードを抜けるとき
|InsertCharPre| インサートモードで文字が入力されたとき、その文字が挿入
される前
|ColorScheme| カラースキームを読み込んだ後
|RemoteReply| Vimサーバからの返答を受け取ったとき
|QuickFixCmdPre| QuickFixコマンドを実行する前
|QuickFixCmdPost| QuickFixコマンドを実行した後
|SessionLoadPost| セッションファイルを読み込んだ後
|MenuPopup| ポップアップメニューを表示する直前
|User| ":duautocmd"との組合せで使われる
自動コマンドイベントのアルファベット順リスト:
*autocmd-events-abc*
*BufCreate* *BufAdd*
BufAdd or BufCreate バッファリストに追加されるバッファを作った直後
か、バッファをバッファリストに追加した直後。
バッファリスト内のバッファがリネームされた直後
にも発生する。
イベント BufCreate は歴史上の理由で存在してい
る。
NOTE: このイベントで自動コマンドが実行された
ときは、"%" で表されるカレントバッファと
"
<afile>" で表される作成されたバッファは異なる
かもしれないことに注意。
*BufDelete*
BufDelete バッファリストからバッファを削除する前。(バッ
ファが読み込まれているなら) BufUnload が最初に
呼び出されるだろう。
また、バッファリスト内のバッファがリネームされ
た直前にも使われる。
NOTE: このイベントで自動コマンドが実行された
ときは、"%" で表されるカレントバッファと
"
<afile>" と "
<abuf>" で表される解放されるバッ
ファとは異なるかもしれないことに注意。
他のバッファに切り替えないこと。もしすると問題
が発生するだろう。
*BufEnter*
BufEnter バッファに入った後。ファイルタイプに関するオプ
ションの設定に便利である。バッファの編集を始め
るときにも、BufReadPost の自動コマンドの後に
実行される。
*BufFilePost*
BufFilePost 現在のバッファの名前をコマンド ":file" または
":saveas" で変更した後。
*BufFilePre*
BufFilePre 現在のバッファの名前をコマンド ":file" または
":saveas" で変更する前。
*BufHidden*
BufHidden バッファが隠れ状態 (hidden) になった直後。つま
りそのバッファを表示するウィンドウがもう存在し
ないのに、バッファが解放されなかったり、削除さ
れないとき。":qa" や "q" でVimを終了するときに
は使われない。
NOTE: このイベントで自動コマンドが実行された
ときは、"%" で表されるカレントバッファと
"
<afile>" で表される解放されるバッファとは異な
るかもしれないことに注意。
*BufLeave*
BufLeave 他のバッファに移る前。カレントウィンドウを離れ
たり、閉じたりするときで、新しいカレントウィン
ドウが同じバッファを開いていないとき。":qa" や
"q" でVimを閉じるときには使われない。
*BufNew*
BufNew 新しいバッファを作った直後。バッファがリネーム
された直後にも発生する。バッファがバッファリス
トに追加されると、イベント BufAdd も発生する。
NOTE: このイベントで自動コマンドが実行された
ときは、"%" で表されるカレントバッファと
"
<afile>" で表される解放されるバッファとは異な
るかもしれないことに注意。
*BufNewFile*
BufNewFile 存在しないファイルの編集を始めたとき。スケルト
ンファイル (訳注: テンプレートファイルともいう)
に読み込むときに使える。
*BufRead* *BufReadPost*
BufRead or BufReadPost 新しいバッファの編集を始めたときの、ファイルを
バッファに読み込んだ後で、モードラインを実行す
る前。モードラインを実行した後に何かするには
|BufWinEnter|を参照してください。これは ":r
file" には「動作しない」。ファイルが存在しない
ときも使えない。またファイルの復旧に成功したと
きにも使われる。
*BufReadCmd*
BufReadCmd 新しいバッファの編集を始める前。ファイルをバッ
ファ内に読み込む役目を負う。
|Cmd-event|
*BufReadPre* *E200* *E201*
BufReadPre 新しいバッファの編集を始めたときの、ファイルを
バッファに読み込む前。読み込むファイルが存在し
ないときは使えない。
*BufUnload*
BufUnload バッファを解放する前。これは、バッファ内のテキ
ストが解放されるときである。BufWritePost の後
で、BufDelete の前かもしれない。Vimが終了しよ
うとしているとき、読み込まれた全てのバッファに
ついて発生する。
NOTE: このイベントで自動コマンドが実行された
ときは、"%" で表されるカレントバッファと
"
<afile>" で表される解放されるバッファとは異な
るかもしれないことに注意。
他のバッファに切り替えないこと。もしすると問題
が発生するだろう。
終了時に v:dying が 2 以上のときはこのイベント
は発生しません。
*BufWinEnter*
BufWinEnter バッファがウィンドウ内に表示された後。これはバッ
ファが読み込まれたとき (モードラインの処理後)
か、隠れ (hidden) バッファがウィンドウ内に表示
されたとき (もう隠れバッファでなくなったとき)。
引数なしで
|:split| をしたときや、既にウィンド
ウに表示されているバッファを指定して ":split"
をしたときは、同じバッファを開いたままなので、
このイベントは発生しない。既存のバッファがその
まま使われるためである。しかし、カレントバッファ
の名前を指定して":split" をすると、そのバッファ
を再読み込みすることになるので、発生する。
*BufWinLeave*
BufWinLeave バッファがウィンドウから取り除かれる前。そのバッ
ファが別のウィンドウ内で表示中ならば発生しない。
Vimの終了時にも発生する。イベント BufUnload や
BufHidden よりも前に発生する。
NOTE: このイベントで自動コマンドが実行された
ときは、"%" で表されるカレントバッファと
"
<afile>" で表される解放されるバッファとは異な
るかもしれないことに注意。
他のバッファに切り替えないこと。もしすると問題
が発生するだろう。
終了時に v:dying が 2 以上のときはこのイベント
は発生しません。
*BufWipeout*
BufWipeout バッファを完全に削除する前。イベント BufUnload
と BufDelete が先に発生するかもしれない (バッ
ファが読み込まれていて、バッファリスト内に存在
するなら)。バッファがリネームされる直前にも発
生する (そのバッファがバッファリスト内になくと
も)。
NOTE: このイベントで自動コマンドが実行された
ときは、"%" で表されるカレントバッファと
"
<afile>" で表される解放されるバッファとは異な
るかもしれないことに注意。
*BufWrite* *BufWritePre*
BufWrite or BufWritePre バッファ全体をファイルに書き込む前。
*BufWriteCmd*
BufWriteCmd バッファ全体をファイルに書き込む前。ファイルへ
の書き込みの役目を負い、成功したときはオプショ
ン
'modified' をオフにする。バッファの内容を変
更すべきではない。
'modified' をオフにすると、以前の undo 状態が
'modified' (変更あり) になるように undo 情報が
調整されます (
|:write| と同様)。
|Cmd-event|
*BufWritePost*
BufWritePost バッファ全体をファイルに書き込んだ後 (イベント
BufWritePre によるコマンドをアンドゥする役目を
果たす)。
*CmdwinEnter*
CmdwinEnter Command-lineウィンドウに入った後。この特殊なウィ
ンドウに対してのみオプションを設定するのに便利
である。このイベントはイベント BufEnter や
WinEnter の「代わりに」発生する。
<afile> は、command-lineの種類を示す1文字に設
定される。
|cmdwin-char|
*CmdwinLeave*
CmdwinLeave Command-lineウィンドウから出る前。イベント
CmdwinEnter で行ったグローバル設定を消去するの
に便利である。このイベントは BufLeave や
WinLeave の「代わりに」発生する。
<afile> は、command-lineの種類を示す1文字に設
定される。
|cmdwin-char|
*ColorScheme*
ColorScheme カラースキームを読み込んだ後。
|:colorscheme|
*CursorHold*
CursorHold
'updatetime' の時間の間、ユーザがキーを押さな
かったとき。ユーザーが何かキーを押すまで、再び
発生することはない (例えば、もしあなたがコーヒー
を入れるためにVimの前を離れても、その間の
'updatetime' ミリ秒ごと発生することはない :-)。
タグをプレビューするためには、
|CursorHold-example| を参照。
このイベントはノーマルモードのときのみ呼ばれる。
コマンドの引数の入力待ち状態、またはオペレータ
の後の移動コマンド入力待ち状態のときは発生しな
い。
レコーディングの最中にはCursorHoldイベントは発
生しない。
|q|
Note: このイベントには対話的なコマンドは使えな
いことに注意。「続けるには」プロンプトは現れず、
スクリーンは必要に応じて直接更新される。
Note: 近いうちに、発生するまでの時間を設定する
別のオプションができるだろう。
ヒント: ステータスラインの更新を強制的に行うに
は、これを使うこと:
{VimのAmiga版、Unix版、Win32版、MSDOS版および
全てのGUI 版でのみ有効}
*CursorHoldI*
CursorHoldI CursorHoldと同様だが、インサートモードのとき発
生する。
*CursorMoved*
CursorMoved ノーマルモードでカーソルが移動した後。カーソル
行のテキストが変更されたときにも発生する
(例: "x", "rx", "p"などで)。
先行入力があったりオペレータが実行待ちになって
いる場合は発生しない。
|match-parens|の例を参照。
注意: ユーザが予期しないことや時間のかかる処理
は行わないこと。
*CursorMovedI*
CursorMovedI インサートモードでカーソルが移動した後。
ポップアップメニューが表示されているときは発行
されない。
それ以外はCursorMovedと同じ。
*EncodingChanged*
EncodingChanged オプション
'encoding' が変更されたとき。例えば、
フォント等の設定に便利である。
*FileAppendCmd*
FileAppendCmd ファイルに追加する前。ファイルへの追加の役目を
負う。
|Cmd-event|
*FileAppendPost*
FileAppendPost ファイルに追加した後。
*FileAppendPre*
FileAppendPre ファイルに追加する前。
*FileChangedRO*
FileChangedRO 読み込み専用ファイルに最初の変更を加える前。ソー
ス管理システム (訳注: CVSやRCS) からファイルを
チェックアウトするのに使われる。変更が
自動コマンドによるときには発生しない。
このイベントが発生するのは、バッファに最初の変
更を行うときや、
'readonly'がセットされた後に最
初の変更を行うときの、変更が適用される直前であ
る。
警告:自動コマンドでカーソルが動かされるときの動作は、
定義されていない。
*E788*
ここで他のバッファに変更をしてはならない。バッ
ファを再読み込みするとはよいが、他のバッファを
編集してはならない。
*FileChangedShell*
FileChangedShell ファイルのタイムスタンプが、ファイルの編集が始
まってから変更されたことを発見したとき。
ファイルの属性が変更されたときにも使われる。
|timestamp|
大抵はシェルコマンドの実行後に発生する。またコ
マンド
|:checktime| の実行後や、Vimが入力フォー
カスを一度失い、再び得たときにも発生する。
このイベントは変更されたファイルそれぞれに対し
て発生する。オプション
'autoread' がオンであり、
かつバッファが変更されていないときには使われな
い。もし FileChangedShell の自動コマンドが存
在しても、警告メッセージやプロンプトは現れない。
変数
|v:fcs_reason|に何が起こったのかが設定さ
れ、
|v:fcs_choice|によってVimに次に何をすべき
かを指示できる。
NOTE: このイベントで自動コマンドが実行された
ときは、"%" で表されるカレントバッファと
"
<afile>" で表される解放されるバッファとは異な
るかもしれないことに注意。
NOTE: この自動コマンドはカレントバッファを変
更したり、別のバッファにジャンプしたり、バッ
ファを消去してはいけない。
*E246* *E811*
NOTE: このイベントは、無限ループを避けるために
決してネストしてはいけない (入れ子にならない)。
つまり、FielChangedShellイベントの処理中は他の
FileChangedShellイベントは呼ばれない。
*FileChangedShellPost*
FileChangedShellPost Vimの外部でファイルが変更されたのを検出・対処
した後。ステータスラインを更新するのに使える。
*FileEncoding*
FileEncoding 時代遅れである。まだ有効だがイベント
|EncodingChanged| と同等である。
*FileReadCmd*
FileReadCmd コマンド ":read" でファイルを読み込む前。ファ
イルを読み込む役目を負う。
|Cmd-event|
*FileReadPost*
FileReadPost コマンド ":read" でファイルを読み込んだ後。
Note 読み込んだテキストの先頭行と末尾行には、
マーク '[ と '] が設定されることに注意。これは、
読み込まれた行に対して操作を行うのに使われる。
*FileReadPre*
FileReadPre コマンド ":read" でファイルを読み込む前。
*FileType*
FileType オプション
'filetype' が設定されたとき。
パターンはファイルタイプに対して照合される。
<afile> は
'filetype' が設定されたファイルの名
前として使える。
<amatch> は
'filetype' の新し
い値として使える。
|filetypes| を参照。
*FileWriteCmd*
FileWriteCmd バッファ全体を書き込まない場合の、ファイルに書
き込む前。ファイルへの書き込みの役目を負う。バッ
ファを変更すべきではない。
|Cmd-event|
*FileWritePost*
FileWritePost バッファ全体を書き込まない場合の、ファイルに書
き込んだ後。
*FileWritePre*
FileWritePre バッファ全体を書き込まない場合の、ファイルに書
き込む前。
*FilterReadPost*
FilterReadPost フィルタコマンドからファイルを読み込んだ後。
Vimは FilterReadPre と同様に、現在のバッファの
名前に対してパターンを調べる。
*FilterReadPre* *E135*
FilterReadPre フィルタコマンドからファイルを読み込む前。Vim
は、フィルタコマンドの出力である一時ファイルの
名前ではなく、現在のバッファの名前に対してパター
ンを調べる。
*FilterWritePost*
FilterWritePost フィルタコマンド用のファイルを書き込んだり、差
分表示用のファイルを作った後。
Vimは FilterWritePre と同様、現在のバッファの
名前に対してパターンをチェックする。
'shelltemp'がオフのときは発生しない。
*FilterWritePre*
FilterWritePre フィルタコマンド用のファイルを書き込んだり、差
分表示用のファイルを作る前。
Vimはフィルタコマンドの出力である一時ファイル
の名前ではなく、現在のバッファの名前に対してパ
ターンをチェックする。
'shelltemp'がオフのときは発生しない。
*FocusGained*
FocusGained Vimが入力フォーカスを得たとき。GUI版と、入力
フォーカスを認識できるいくつかのコンソール版で
のみ有効。
*FocusLost*
FocusLost Vimが入力フォーカスを失ったとき。GUI版と、入力
フォーカスを認識できるいくつかのコンソール版で
のみ有効。
*FuncUndefined*
FuncUndefined ユーザ定義関数が使われたが、定義されていなかっ
たとき。必要なときのみ関数を定義するのに便利で
ある。パターンは関数名に対して照合される。
<amatch> と
<afile> の両方とも関数名に設定され
る。
|autoload-functions|を参照。
*GUIEnter*
GUIEnter GUI の開始に成功し、ウィンドウを開いた後。
gvim を使ったときは、VimEnter の前に発生する。
ファイル .gvimrc からウィンドウの配置場所を設
定するために使うことができる。
*GUIFailed*
GUIFailed GUIの開始に失敗した後。可能ならば、Vimはターミ
ナル内で実行を継続する(Unix系のみ。Xサーバへ接
続が失敗したとき)。ここでVimを終了させるには、
次のようにする:
*InsertChange*
InsertChange インサート・上書きモードで
<Insert>をタイプした
とき。変数
|v:insertmode|が新しいモードを示す。
カーソルを移動したりなどユーザが予期しないこと
は行わないように注意。
*InsertCharPre*
InsertCharPre インサートモードで文字が入力されたとき、その文
字が挿入される前。
|v:char| 変数に入力された文字が入っている。イ
ベント内でそれを変更することで実際に挿入される
文字を変更できる。
|v:char| に 2 つ以上の文字を
入れた場合はそのテキストはそのまま (literally)
挿入される。
テキストを変更することはできない
|textlock|。
このイベントは
'paste' がオンに設定されている
ときは発行されない。
*InsertEnter*
InsertEnter インサートモード・上書きモード・Virtual上書き
モードを開始する直前。変数
|v:insertmode|がモー
ドを示す。カーソルを移動したりなどユーザが予期
しないことは行わないように注意。
*InsertLeave*
InsertLeave インサートモードを抜けるとき。
CTRL-O
|i_CTRL-O|を使ったときにも発生する。
|i_CTRL-C|
のときは発生しない。
*MenuPopup*
MenuPopup (マウス右ボタンで)ポップアップメニューを表示す
る直前。カーソル下やマウスポインタの下にあるも
のによってメニューを調整するのに便利。
パターンにはモードを表す文字を記述する:
n ノーマル
v ビジュアル
o オペレータ実行待ち
i インサート
c コマンドライン
*QuickFixCmdPre*
QuickFixCmdPre QuickFixコマンドが実行される前 (
|:make|,
|:lmake|,
|:grep|,
|:lgrep|,
|:grepadd|,
|:lgrepadd|,
|:vimgrep|,
|:lvimgrep|,
|:vimgrepadd|,
|:lvimgrepadd|,
|:cscope|,
|:cfile|,
|:cgetfile|,
|:caddfile|,
|:lfile|,
|:lgetfile|,
|:laddfile|,
|:helpgrep|,
|:lhelpgrep|)。
パターンには実行されるコマンドを記述する。
|:grep| が書かれていると、
'grepprg' が
"internal" にセットされていても実行される。
このコマンドを使って変数
'makeprg' と
'grepprg' を設定することはできない。
このコマンドでエラーになるとQuickFixコマンドは
実行されない。
*QuickFixCmdPost*
QuickFixCmdPost QuickFixCmdPreと同様だが、QuickFixコマンドが実
行された後、最初の位置にジャンプする前に発生す
る。
|:cfile| コマンドと
|:lfile| コマンドの場
合はイベントはエラーファイルを読み込んだ後、最
初のエラーに移動する前に実行される。
|QuickFixCmdPost-example| を参照。
*RemoteReply*
RemoteReply サーバとして働くVimからの応答を受け取ったとき
|server2client()|。パターンは
{serverid}に対し
て照合される。
<amatch> は応答が送られてきたサーバの
{serverid} になり、
<afile> は応答の実際の内容
になる。
Note これに自動コマンドを定義したときも、応答
を読み込むのには、読み込んだ応答を処理できるよ
うに関数
|remote_read()| を使うべきであること
に注意。
*SessionLoadPost*
SessionLoadPost
|:mksession|で作られたセッションファイルを読み
込んだ後。
*ShellCmdPost*
ShellCmdPost
|:!cmd|,
|:shell|,
|:make|,
|:grep|を使って
シェルコマンドを実行した後。変更されたファイル
をチェックするのに使える。
*ShellFilterPost*
ShellFilterPost ":
{range}!cmd", ":w !cmd", ":r !cmd"を使って
シェルコマンドを実行した後。変更されたファイル
をチェックするのに使える。
*SourcePre*
SourcePre Vimスクリプトを読み込む前。
|:source|
<afile>は読み込まれるファイルの名前となる。
*SourceCmd*
SourceCmd Vimスクリプトを読み込むとき。
|:source|
<afile>は読み込まれるファイルの名前となる。こ
の自動コマンドはこのファイルを読み込まねばなら
ない。
*SpellFileMissing*
SpellFileMissing スペルチェックファイルを読み込もうとしたが、見
つからなかったとき。パターンは言語に対して照合
される。
<amatch>は言語。
'encoding'も関係する。
|spell-SpellFileMissing|を参照。
*StdinReadPost*
StdinReadPost 標準入力からバッファへ読み込んだ後で、モードラ
インを実行する前。Vimを開始したときに引数 "-"
が使われた場合のみ使われる (
|--| 参照)。
*StdinReadPre*
StdinReadPre 標準入力からバッファへ読み込む前。Vimを開始し
たときに引数 "-" が指定された場合のみ使われる
(
|--| 参照)。
*SwapExists*
SwapExists ファイルの編集を始めようとしてスワップファイル
が存在することを検出したとき。この状況に対応す
る方法を選択できるときだけユーザにどうするか問
い合わせる。
変数
|v:swapname|が見つかったスワップファイルの
名前を保持する。
<afile>は編集しようとしている
ファイルである。
|v:swapcommand|が開かれたファ
イルで実行するコマンドを含んでいるかもしれな
い。
このコマンドは変数
|v:swapchoice|をVimが次にど
うするべきかを示す1文字の文字列にセットしなけ
ればならない:
'o' 読み込み専用で開く
'e' とにかくファイルを編集する
'r' 復元する
'd' スワップファイルを削除する
'q' ファイルを編集せずに終了する
'a'
CTRL-Cを押したのと同様に強制終
了する
これが空文字列にセットされると、自動コマンド
SwapExistsが存在しないときと同様にユーザに問い
合わせをする。
注意: バッファを変更しようとしてはならない。そ
うすると予測できない結果になる。
*E812*
ここでは他のバッファに切り替えること、バッファ
名を変更すること、ディレクトリを変更することは
許可されていない。
*Syntax*
Syntax オプション
'syntax' が設定されたとき。
パターンは構文名に対して照合される。
<afile> は
'syntax' が設定されたファイルの名前
として使える。
<amatch> は
'syntax' の新しい値
として使える。
|:syn-on| を参照。
*TabEnter*
TabEnter タブページに入った直後
|tab-page|。WinEnterが
発生した後、BufEnterが発生する前。
*TabLeave*
TabLeave タブページを離れる直前
|tab-page|。最初に
WinLeaveが発生する。
*TermChanged*
TermChanged オプション
'term' を変更した後。色やフォント等、
ターミナル依存の設定を更新するために構文定義ファ
イルを再読み込みするのに便利である。読み込まれ
たバッファ全てで発生する。
*TermResponse*
TermResponse
|t_RV| に対する応答をターミナルから受け取った
とき。Vim変数
|v:termresponse| の値を使って、
ターミナルのヴァージョンに応じた処理ができる。
Note: このイベントは他のイベントの処理中にも発
行されることがあります。特に、ファイル入出力、
シェルコマンドの実行、時間の掛かる処理など。
*User*
User 自動的に実行されることはない。コマンド
":doautocmd" によってのみ実行される
自動コマンドのために使用される。
*UserGettingBored*
UserGettingBored ユーザが
CTRL-C を打ち込んだとき。
ただの冗談! :-)
*VimEnter*
VimEnter ファイル .vimrc の読み込みを含む、全てのスター
トアップ処理を行い、"-c cmd" の引数を実行し、
全てのウィンドウを構築し、それらにバッファを読
み込んだ後。
*VimLeave*
VimLeave Vim を終了する前で、ファイル .viminfo を書き込
んだ後。VimLeavePre のように、ただ1度だけ実行
される。
異常終了の検出には
|v:dying| を使うこと。
終了時に v:dying が 2 以上のときはこのイベント
は発生しません。
*VimLeavePre*
VimLeavePre Vim を終了する前で、ファイル .viminfo を書き込
む直前。これは終了時にたまたまカレントバッファ
になったバッファの名前とマッチしたときに、ただ
1度だけ実行される。 大抵、パターンには "*" を
使うと便利である。
異常終了の検出には
|v:dying| を使うこと。
終了時に v:dying が 2 以上のときはこのイベント
は発生しません。
*VimResized*
VimResized Vimウィンドウのサイズが変わったとき。よって
'lines'と
'columns'が変更される。しかし開始時
には発生しない。
*WinEnter*
WinEnter 別のウィンドウに入った後。Vimの開始直後、1個目
のウィンドウに入ったときは発生しない。ウィンド
ウの高さを設定するのに便利である。
そのウィンドウで他のバッファを開いていたときは、
イベント Winenter の後に BufEnter が発生する。
Note: ":split fname" を実行したとき、WinEnter
が発生するのは、ウィンドウ分割の後だがファイル
"fname" が読み込まれる前の時点である。
*WinLeave*
WinLeave ウィンドウを離れる前。次に入るウィンドウで他の
バッファを開いていたときは、イベント WinLeave
の前に BufLeave が発生する (ただし ":new" を使っ
たときはそうならない)。
":qa" や"q" でVimを終了するときには発生しない。
==============================================================================
6. パターン
*autocmd-patterns* *{pat}*
ファイルパターン
{pat} がファイル名とマッチするかどうかは、2通りの方法で調べら
れる。
1. パターンに '/' が含まれないとき: Vimはファイル名の後ろの部分からのみマッチ
を調べる (ファイル名の前につくディレクトリパスは除く)。
2. パターンに '/' が含まれるとき: Vimは短いファイル名 (ユーザが打ち込んだもの)
と長いファイル名 (短いファイル名をフルパスに展開し、シンボリックリンクなら
その実体を探したもの) との両方から一致を調べる。
例:
全てのテキストファイルに対しオプション
'expandtab' をオンにする。
ディレクトリ /vim/src 内のC言語ファイルに対しオプション
'cindent' をオンにす
る。
"/tmp/test.c" から "/home/nobody/vim/src/test.c" にリンクを張っていると、
"/tmp/test.c" の編集を始めたとき、この自動コマンドは実行される。
Note: パスの途中だけにマッチさせ、ルートディレクトリにマッチさせたくないとき
は、最初の1文字目に '*' を使う。例:
この自動コマンドは、例えば "/tmp/doc/xx.txt" や "/usr/home/piet/doc/yy.txt"
にマッチする。ここで、ディレクトリの深さは関係ない。
パターンがマッチするファイル名は、ワイルドカードを展開した後のものである。その
ため、次のコマンドを実行すると
まずコマンドの引数は、ファイル名が自動コマンドのパターンにマッチする前に、次
のように展開される。
イベント FileReadCmd 等を使うときにはこれに注意すること。
<amatch> の値が、ユー
ザの予期するものと違うかもしれない。
パターンの中で環境変数を使うこともできる。
環境変数 $HOME が定義されているなら、~ をホームディレクトリとして使うこともで
きる。
環境変数は、自動コマンドが定義されるときに展開される。自動コマンドが実行される
ときではない。これは command とは違っている!
*file-pattern*
パターンの解釈方法は、ファイル名の解釈方法と大体同じである。
* はあらゆる文字の列にマッチ
? はあらゆる1文字にマッチ
\? は '?' にマッチ
. は '.' にマッチ
~ は '~' にマッチ
, はパターンを分割する
\, は ',' にマッチ
{ } は
|pattern| の \( \) と同様
, ('{' '}' の内側では)
|pattern| の \| と同様
\ は
|pattern| で使われるものと同様の特別な意味を持つ
[ch] は 'c' または 'h' にマッチ
[^ch] は 'c' と 'h' 以外の文字にマッチ
'/' という文字は、全てのシステムでパスの区切り文字に使われることに注意すること
(MS-DOSとOS/2でさえも)。これは、パターン内でバックスラッシュを使うことが難しい
上に、別々のシステムでも自動コマンドが動作するようにするためである。
*autocmd-changes*
パターンマッチの検索は、イベントの発生時に行われる。自動コマンドのどれかでバッ
ファ名を変更しても、それどころかバッファを削除しても、実行される 自動コマンド
は変わらない。例:
これはカレントバッファを削除し、代わりにカレントバッファになったバッファ内でオ
プション
'modified' をオンにする。Vimは "*.foo" が新しいカレントバッファのバッ
ファ名にマッチしなくとも気にしない。"*.foo" はイベントが発生した時点でのバッファ
名にマッチする。
しかし、
|:bwipe|でワイプアウトされたバッファに対しては、バッファローカルな
自動コマンドは実行されない。
|:bdel|で削除されたバッファは実際にはまだ存在して
いる(リストされなくなっただけ)なので、自動コマンドは実行される。
==============================================================================
7. バッファローカルな自動コマンド
*autocmd-buflocal*
*autocmd-buffer-local*
*<buffer=N>* *<buffer=abuf>* *E680*
バッファローカルな自動コマンドは特定のバッファに結びつけられている。これは名前
を持たないバッファや特定のパターンにマッチしない名前のバッファに使うと便利であ
る。しかしそれぞれのバッファに明示的に追加する必要がある。
バッファローカルな自動コマンドはパターンの代わりに以下の形式のどれかを使う:
<buffer> カレントバッファ
<buffer=99> バッファ番号99
<buffer=abuf>
<abuf> の使用(自動コマンドを実行するときのみ)
|<abuf>|
例:
自動コマンドに対するコマンドは全てバッファローカルな自動コマンドに対しても機能
する。パターンの代わりに特別な文字列を使う。例: >
:au! *
<buffer> " カレントバッファのバッファローカル自動
" コマンドを削除する
:au! * <buffer=33> " バッファ#33のバッファローカル自動コマン
" ドを削除する。
:bufdo :au! CursorHold
<buffer> " 全バッファから指定されたイベントに対す
" る自動コマンドを削除する
:au *
<buffer> " カレントバッファのバッファローカル自動
" コマンドをリストする
カレントバッファに対して自動コマンドを定義するとき、それがバッファ番号とともに
保存されることに注意。つまりカレントバッファ番号が12なら"<buffer=12>"という形
になる。例えば自動コマンドをリストするときこの形式で表示される。
バッファローカル自動コマンドが存在するかを判定するには関数
|exists()|を次のよう
に使う:
バッファがワイプアウトされると当然バッファローカル自動コマンドも失われる。
":bdel"などでバッファを削除するときは、それがリストからなくなるだけで、自動コ
マンドはまだ存在していることに注意。バッファローカル自動コマンドの削除を表示さ
せるにはこうする:
存在しないバッファに対してバッファローカル自動コマンドを定義することはできな
い。
==============================================================================
8. グループ
*autocmd-groups*
自動コマンドはグループにまとめることができる。これは一連の自動コマンドを取り
除いたり実行したりする際に便利である。例えば、構文強調表示のための全ての
自動コマンドはグループ "highlight" に入っていて、GUIの開始時に
":doautoall highlight BufRead" で実行できる。
特定のグループが選択されないとき、既定のグループが使われる。既定のグループには
名前がない。既定のグループから個別に自動コマンドを実行することはできない。そ
れらを実行できるのは、全てのグループに対する自動コマンドを実行するときのみで
ある。
普通、自動コマンドを自動的に実行するときは、全てのグループに対する 自動コマンド
が使われる。グループが問題になってくるのは、":doautocmd" や ":doautoall" によっ
て自動コマンドを実行するときと、自動コマンドを定義したり削除するときである。
グループ名には空白を除く全ての文字が使える。"end" というグループ名は予約語になっ
ている (大文字も)。
グループ名では大文字と小文字を区別して扱う。イベントの名前とは違うことに注意し
てください。
*:aug* *:augroup*
:aug[roup]
{name} 後に続くコマンド ":autocmd" のためのグループ名
を定義する。
{name} を "end" や "END" にすると
既定のグループが選ばれる。
*:augroup-delete* *E367*
:aug[roup]!
{name} 自動コマンドのグループ
{name} を削除する。その
グループを使っている自動コマンドがまだあるな
ら、これは使わないこと!その点はチェックされな
い。
特定のグループとして自動コマンドを定義するには、次の手順に従うこと。
1. ":augroup
{name}" によってグループを選択する。
2. ":au!" によって古い自動コマンドを全て消去する。
3.自動コマンドを定義する。
4. ":augroup END" によって既定のグループに戻る。
例:
これで自動コマンドを (例えばファイル .vimrc を再び読み込んだ後) 2回定義するこ
とが防げる。
==============================================================================
9. 自動コマンドの実行
*autocmd-execute*
自動コマンドは「自動的」でなくとも実行できる。これはあなたが自動コマンドを変
更したときや、間違った自動コマンドが実行されたとき (つまりファイルパターンの
マッチングが間違っていたとき) に便利である。
NOTE オプション
'eventignore' はここにも適用されることに注意。ここに列挙された
イベントでは、どんな自動コマンドも実行されない。
*:do* *:doau* *:doautocmd* *E217*
:do[autocmd] [
<nomodeline>]
[group] {event} [fname]
[fname] (省略するとカレントファイルの名前) にマッチす
る、
{event} のための自動コマンドをカレントバッファに
適用する。カレントファイル名が正しいファイルパターンに
マッチしないときや設定を変えた後、またはあるイベントの
ために自動コマンドを実行するために使用できる。
これを自動コマンドの内部で実行することも可能である。
だから、ある拡張子用の自動コマンドを元にして別の拡張
子用のものを作ることができる。例:
無限の循環に陥らないよう注意すること。また
|autocmd-nested| を参照すること。
引数
[group] が省かれると、全てのグループの
自動コマンドが実行される。
[group] が指定されると、そ
れにマッチするグループの自動コマンドのみが実行される。
NOTE 定義されていないグループ名を使うと、エラーメッ
セージが表示される。
*<nomodeline>*
自動コマンドを適用した後にモードラインが処理される。
ファイルを編集するときと同じように、自動コマンドでなさ
れた設定を上書きするためである。
<nomodeline> が指定さ
れている場合はモードラインは処理されない。バッファの
ロード以外で使われるイベント (例えば
|User|) などは
<nomodeline> を指定したほうがいいかもしれません。
*:doautoa* *:doautoall*
:doautoa[ll] [
<nomodeline>]
[group] {event} [fname]
":doautocmd" と似ているが、読み込まれたバッファそれぞ
れに自動コマンドを適用する。[fname]は自動コマンドを選
択するのに使われます。コマンドを適用するバッファではあ
りません。(訳注:
|:autocmd|の
{pat}に使う?)
注意: このコマンドで、バッファを削除したり、バッファを
変えたり、バッファの内容を変えるような自動コマンドを
実行しないこと。結果は予期できない。このコマンドは、オ
プションを設定したり、構文強調表示を変えたりする
自動コマンドのためのものである。
==============================================================================
10. 自動コマンドを使う
*autocmd-use*
「ファイルの書き込み」には、4組のイベントが起こりうる。1回の書き込みコマンドで
は、これらのうち1組しか使われない。
BufWriteCmd BufWritePre BufWritePost バッファ全体を書き込む
FilterWritePre FilterWritePost フィルタ用一時ファイルに書込む
FileAppendCmd FileAppendPre FileAppendPost ファイルに追加する
FileWriteCmd FileWritePre FileWritePost その他の書き込み
"*Cmd" にマッチする自動コマンドがあるときは、それが書き込み作業を行うものと想
定される。書き込みはそれ以上行われず、他のイベントも発生しない。
|Cmd-event|
Note イベント *WritePost による自動コマンドは、イベント *WritePre による
自動コマンドの引き起こしたバッファに対する変化を、どのようなものでもアンドゥす
べきであることに注意。さもないと、ファイルの書き込みがバッファを変更するという
副作用を持ってしまう。
あるバッファの中の行をファイルに書き込むとき、自動コマンドを実行する前にそのバッ
ファが一時的にカレントバッファになる。自動コマンドがカレントバッファを変更した
り、元のカレントバッファを消去しない限り、カレントバッファは再び元に戻る。
イベント *WritePre や *AppendPre による自動コマンドは、書き込み元のバッファを
削除してはならない。
マーク '[ と '] は特別な位置を記憶している。
- イベント *ReadPre の前に、新しい行が挿入される所の上の行にマーク '[ が設定
される。
- イベント *ReadPost の前に、読み込まれた最初の行にマーク '[ が、最後の行にマー
ク '] が設定される。
- イベント *WriteCmd, *WritePre と *AppendPre による自動コマンドが実行される前
に、書き込まれる最初の行にマーク '[ が、最後の行にマーク '] が設定される。
注意: バッファを変更するコマンドを使うと、'[ と '] の場所も変更される。
ファイル名を必要とするコマンドでは、読み込まれるファイル名に "
<afile>" を使う
ことができる (カレントファイル名に "%" を使うこともできる)
|:<afile>|。現在有
効なバッファ番号には "
<abuf>" を使うことができる。これは名前を持たないバッファ
に対しても有効だが、バッファを持たないファイルには使えない (例えば、":r file"
で読み込まれたファイル)。
*gzip-example*
圧縮されたファイルを読み書きする例:
グループ "gzip" は、":autocmd!" で既存の自動コマンドを全て削除できるようにす
るために使われている。これはスクリプトファイルが2回読み込まれたときのためであ
る。
("
<afile>:r" は拡張子のないファイル名である。
|:_%:| を参照)
イベント BufNewFile, BufRead/BufReadPost, BufWritePost, FileAppendPost,
VimLeave によって実行された自動コマンドは、バッファの被修正フラグを切り替えな
い。BufReadPost による自動コマンドで、圧縮されているバッファを解凍したときは、
":q" でVimを終了することができる。BufWritePre による自動コマンドの起こした変
更を戻すために BufWritePost で ":undo" を使ったときも、":q" を使うことができる
("ZZ" も可)。バッファが変更されたことにしたいなら、":set modified" とすること。
自動コマンドからノーマルモードのコマンドを実行したいときは、コマンド ":normal"
を使うこと。使うときは注意!ノーマルモードのコマンドが完結していないと、ユーザ
が文字を打ち込まないといけない (例えば、":normal m" の後にはマーク名を打ち込ま
ないといけない)。
バッファの内容を変更した後に、変更されていないことにしたいなら、オプション
'modified' をオフにすること。こうすると ":q!" ではなく ":q" でもVimを終了でき
る。
*autocmd-nested* *E218*
既定では、自動コマンドはネストしない (入れ子にならない)。自動コマンド内で ":e"
や ":w" を使っても、これらに対してはイベント BufRead や BufWrite による
自動コマンドは実行されない。もしこれを実行してほしいなら、ネストしてほしいコマ
ンド内でフラグ "nested" を使うこと。例:
再帰的ループを避けるために、ネストは10段階までに制限されている。
自動コマンドの中でコマンド ":au" を使うこともできる。これは自己修正的 (訳注:
原文 "self-modifying") なコマンドになりうる! これは1回だけ実行すべき
自動コマンドに便利である。
あるコマンドを実行するときだけ自動コマンドをスキップしたい場合は、修飾子
|:noautocmd|を使うかオプション
'eventignore'を使う。
Note (":read file" やフィルタコマンドで) 読み込んだファイルの最後の行に
<EOL>
がないとき、Vimはこのことを記憶する。その次の (":write file" やフィルタコマン
ドでの) 書き込みで、先ほどの最後の行が再び最後の行として書き込まれ、かつオプショ
ン
'binary' がオンになっていると、
<EOL> は付け足されない。これにより、読み込ま
れた行に対するフィルタコマンドで、読み込まれた通りに書き出すことができる。また、
フィルタ処理された行に対する書き込みのコマンドで、フィルタが出力した通りに書き
出すことができる。例えば、圧縮されたファイルを書き込むもう一つの例は以下のよう
になる。
*autocommand-pattern*
コンマで区切られた複数のパターンを指定することもできる。以下にいくつか例を挙げ
る。
Makefile (makefile, Makefile, imakefile, makefile.unix 等) にマッチさせるには
こうする。
Cソースファイルを編集するとき、常に最初の関数から始めるにはこうする。
上の "1;" がないと、検索が始まる場所はファイルの最初ではなく、ファイルの挿入さ
れた場所になる。
*skeleton* *template*
新しいファイルを作るときにスケルトン (テンプレート) ファイルを読み込むにはこう
する。
HTMLファイルを書き込むときに現在の日付と時刻を挿入したいならこうする (訳注:
KoRoN氏作成のautodate.vimを使った方がよい)
これを機能させるためには、ファイルの先頭から20行以内に"Last modified: <date
time>" という行を入れる必要がある。Vimは <date time> (とその行内のそれ以後を)
を現在の日付と時刻に置き換える。説明:
ks 現在の位置をマーク 's' に設定する
call LastMod() 関数 LastMod() を呼び出して実際の作業を行う
's カーソルを元の位置に戻す
関数 LastMod() はファイルの長さが20行以下であるかを調べ、キーワード
"Last modified: " の含まれる行を探すためにコマンド ":g" を実行する。キーワード
の含まれる行に対しては ":s" が実行され、既存の日付を現在のものに置き換える。
":execute" は ":g" や ":s" で expression を使えるようにするためのものである。
日付は関数 strftime() から得られる。 strftime() の引数を変更して、別の形の日付
を得ることもできる。
コマンドラインから自動コマンドを入力すると、(
<Tab> や
CTRL-D などで) イベント
とコマンド名が適切に補完される。
Vimはマッチする全ての自動コマンドをユーザの指定した順に実行する。ユーザが実行
させる最初の自動コマンドにはファイルパターンに "*" を使い、全てのファイルに適
用されるようにするとよい。これはつまり、あらゆる設定のための既定を好きなように
定義することができ、もしマッチする自動コマンドが別にあれば、そちらの方が設定
を上書きできるということである。しかしマッチする自動コマンドが他になければ、
少なくともあなたの設定した既定は回復される (もし自動コマンドがマッチした別の
ファイルから、マッチしなかったファイルに移っても)。
Note Unixのシェルと違い、
"*" は"." で始まるファイルにもマッチすることに注意。
*autocmd-searchpat*
自動コマンドは現在の検索パターンを変更しない。Vimは自動コマンドの実行前に現在
の検索パターンを保存し、自動コマンドが終了してから復元する。つまり 自動コマンド
はオプション
'hlsearch' で強調表示されている文字列に影響しないということである。
自動コマンド内でも、例えばコマンド "n" 等で、検索パターンは普通に使用できる。
もし自動コマンドの中で終了後に使う検索パターンを設定したいなら、 ":let @/ ="
とすること。
自動コマンドの中で ":nohlsearch" を使って、検索語の強調表示を無効にすることは
できない。Vimの開始時に検索語の強調表示を行わないためには、
'viminfo' のフラグ
'h' を使うこと。
*Cmd-event*
イベント "*Cmd" のうちどれかを使うと、それによる自動コマンドが読み込み、書き
込み、またはsourceを行うものと想定される。これは特殊なファイル、例えばリモート
システム上のファイルに作業をするときに使える。
注意: これらのイベントを誤った方法で使うと、そのイベントが発生するファイルの読
み書きが不可能になってしまう。自分の自動コマンドをしっかりテストすること。最
良の方法は、普通のファイル名には決してマッチしないパターン (例えば "ftp://*")
を使うことである。
BufReadCmd に対して自動コマンドを定義すると、クラッシュしたセッションの復旧が
難しくなる。元のファイルから復旧するとき、Vimはスワップファイル内に見つからな
かった部分のみを読み込む。それは BufReadCmd の自動コマンドを使ったときは不可
能なので、コマンド
|:preserve| を使って元のファイルが復旧に必要ないようにする
こと。そうするのはファイルが変更を受けたと判断したときのみでもよい。
読み込みと書き込みのコマンドの場合、Vim変数
|v:cmdarg| は引数 "++enc=" と
"++ff=" の、有効だったものを保持している。これらはファイルを読み書きするコマン
ドで使われるべきである。Vim変数
|v:cmdbang|はコマンドに"!"が使われたときに 1。
そうでないときに 0 が設定される。
例は標準プラグイン $VIMRUNTIME/plugin/netrwPlugin.vim を参照。
==============================================================================
11. 自動コマンドを無効にする
*autocmd-disable*
一時的に自動コマンドを無効にするにはオプション
'eventignore'を使う。これは予期
しない振るまいを引き起こす可能性がある。
|:finally|つきの
|:try|ブロックを使って
後で
'eventignore'を元に戻すようにすること。
*:noautocmd* *:noa*
1つのコマンドを実行する間だけ自動コマンドを無効にするには修飾子":noautocmd"を
使う。これは後に続くコマンドを実行する間だけ、
'eventignore'を"all"にセットす
る。例:
これはgzipプラグインで定義された自動コマンドを発生させずにファイルを書き込む。
vim:tw=78:ts=8:ft=help:norl: