Autocmd
Nvim :help
ページは、ソースからtree-sitter-vimdocパーサーを使用して生成されています。
基本的な説明については、ユーザーマニュアルの
40.3セクションを参照してください。
ファイルの読み書き時、バッファやウィンドウの出入り時、Vimの終了時に自動的に実行されるコマンドを指定できます。たとえば、
*.c
に一致するファイルに対して
'cindent'オプションを設定するautocommandを作成できます。また、autocommandを使用して、圧縮ファイルの編集(
gzip-exampleを参照)などの高度な機能を実装することもできます。autocommandを配置する通常の場所はvimrcファイルです。
E203 E204 E143 E855 E937 E952 警告: autocommandの使用は非常に強力であり、予期しない副作用を引き起こす可能性があります。テキストを破壊しないように注意してください。
最初にファイルの使い捨てコピーでテストすることをお勧めします。たとえば、編集開始時にファイルを解凍するautocommandを使用する場合は、書き込み時の圧縮用のautocommandが正しく機能することを確認してください。
途中でエラーが発生する可能性に備えてください(例:ディスクフル)。Vimはほとんどの場合、バッファへの変更を元に戻すことができますが、他のファイルへの変更を手動でクリーンアップする必要がある場合があります(例:解凍されたファイルを圧縮する)。
BufRead*イベントで圧縮ファイルを編集できる場合は、FileRead*イベントでも同じようにする必要があります(これにより、まれにリカバリが可能になります)。可能な場合は、File*イベントとBuf*イベントに同じautocommandを使用することをお勧めします。
:au :autocmd :au[tocmd] [group]
{event}
{aupat}
[++once] [++nested]
{cmd}
{aupat}
autocmd-patternに一致するファイルの
{event}
でVimが自動的に実行するコマンドのリストに
{cmd}
を追加します。
注: 引用符は:autocmdの引数と見なされ、コメントを開始しません。 Nvimは常に既存のautocommandの後に
{cmd}
を追加するため、定義された順序で実行されます。 [++nested]については、
autocmd-nestedを参照してください。
autocmd-once[++once]が指定されている場合、コマンドは一度だけ実行され、その後削除されます(「ワンショット」)。
特殊なパターン
<buffer>
または<buffer=N>は、バッファローカルautocommandを定義します。
autocmd-buflocalを参照してください。
注: ":autocmd"コマンドは、"|"がパターンの予期される位置に表示される場合にのみ、別のコマンドを続けることができます。これは機能します
:augroup mine | au! BufRead | augroup END
しかし、これは"augroup"を定義されたコマンドの一部と見なします
:augroup mine | au! BufRead * | augroup END
:augroup mine | au BufRead * set tw=70 | augroup END
代わりに、グループ名をコマンドに含めることができます
:au! mine BufRead *
:au mine BufRead * set tw=70
または、
:execute
を使用します
:augroup mine | exe "au! BufRead *" | augroup END
:augroup mine | exe "au BufRead * set tw=70" | augroup END
autocmd-expand ":autocmd"引数の特殊文字(例: "%"、 "<cword>")は、autocommandが定義されたときには展開されないことに注意してください。これらは、イベントが認識され、
{cmd}
が実行されたときに展開されます。唯一の例外は、"<sfile>"がautocmdの定義時に展開されることです。例
:au BufNewFile,BufRead *.html so <sfile>:h/html.vim
ここで、Vimは
<sfile>
をこの行を含むファイルの名前に展開します。
:autocmd
は、既に存在するかどうかに関係なく、autocommandのリストに追加されます。.vimrcファイルが2回ソースされると、autocommandは2回表示されます。これを回避するには、autocommandをグループ内で定義して、簡単にクリアできるようにします
augroup vimrc
" Remove all vimrc autocommands
autocmd!
au BufNewFile,BufRead *.html so <sfile>:h/html.vim
augroup END
すべてのautocommandを削除したくない場合は、代わりに変数を使用して、Vimがautocommandを一度だけ含めるようにすることができます
:if !exists("autocommands_loaded")
: let autocommands_loaded = 1
: au ...
:endif
[group]引数が指定されていない場合、Vimは現在のグループ(":augroup"で定義されているとおり)を使用します。それ以外の場合、Vimは[group]で定義されたグループを使用します。[group]は事前に定義されている必要があることに注意してください。":au group ..."で新しいグループを定義することはできません。その場合は":augroup"を使用してください。
autocommandをテストしている間は、
'verbose'オプションが役立つ場合があります
:set verbose=9
この設定により、Vimはautocommandを実行するときにそれらをエコーします。
スクリプトでautocommandを定義する場合、スクリプトにローカルな関数を呼び出し、スクリプトにローカルなマッピングを使用できます。イベントがトリガーされ、コマンドが実行されると、定義されたスクリプトのコンテキストで実行されます。これは、
<SID>がコマンドで使用されている場合に重要です。
コマンドを実行すると、1つのコマンドからのメッセージが前のメッセージを上書きします。これは、コマンドを手動で実行する場合とは異なります。ほとんどの場合、画面はスクロールアップされないため、Enterキーを押すプロンプトは表示されません。1つのコマンドが2つのメッセージを出力すると、とにかくこれが発生する可能性があります。
:au[tocmd]! [group]
{event}
{aupat}
[++once] [++nested]
{cmd}
{event}
および
{aupat}
に関連付けられたすべてのautocommandを削除し、コマンド
{cmd}
を追加します。 [++once]については、
autocmd-onceを参照してください。 [++nested]については、
autocmd-nestedを参照してください。
:au[tocmd]! [group] {event}
{aupat}
{event}
および{aupat}
に関連付けられたすべてのautocommandを削除します。
:au[tocmd]! [group] * {aupat}
すべてのイベントについて、{aupat}
に関連付けられたすべてのautocommandを削除します。
:au[tocmd]! [group]
{event}
{event}
のすべてのautocommandを削除します。
警告: BufReadやその他の一般的なイベントのグループなしでこれを行うべきではありません。プラグイン、構文の強調表示などが壊れる可能性があります。
:au[tocmd]! [group] すべてのautocommandを削除します。 注: 引用符は:autocmdの引数と見なされ、コメントを開始しません。 警告: 通常はグループなしでこれを行うべきではありません。プラグイン、構文の強調表示などが壊れます。
[group]引数が指定されていない場合、Vimは現在のグループ(":augroup"で定義されているとおり)を使用します。それ以外の場合、Vimは[group]で定義されたグループを使用します。
:au[tocmd] [group] {event}
{aupat}
{event}
および{aupat}
に関連付けられたautocommandを表示します。
:au[tocmd] [group] * {aupat}
すべてのイベントについて、{aupat}
に関連付けられたautocommandを表示します。
:au[tocmd] [group] {event}
{event}
のすべてのautocommandを表示します。
:au[tocmd] [group] すべてのautocommandを表示します。
[group]引数を指定すると、Vimは[group]のautocommandのみをリストします。それ以外の場合、Vimはすべてのグループのautocommandをリストします。この引数の動作は、autocommandの定義と削除の場合とは異なることに注意してください。
バッファローカルautocommandをリストするには、
<buffer>
または<buffer=N>形式のパターンを使用します。
autocmd-buflocalを参照してください。
:autocmd-verbose 'verbose'がゼロ以外の場合、autocommandをリストすると、最後に定義された場所も表示されます。例
:verbose autocmd BufEnter
FileExplorer BufEnter
* call s:LocalBrowse(expand("<amatch>"))
Last set from /usr/share/vim/vim-7.0/plugin/NetrwPlugin.vim
カンマ区切りのイベント名リストを指定できます。このリストには空白を使用できません。コマンドは、リスト内のすべてのイベントに適用されます。
ファイルの読み込みには、4種類のイベントが考えられます。BufNewFile 存在しないファイルの編集開始 BufReadPre BufReadPost 既存のファイルの編集開始 FilterReadPre FilterReadPost フィルタ出力で一時ファイルを読み込み FileReadPre FileReadPost その他のファイル読み込み Vimは、ファイルを読み込むときに、これら4種類のうちの1つだけを使用します。「Pre」イベントと「Post」イベントは両方とも、ファイルの読み込み前と後にトリガーされます。
"*ReadPre"イベントとすべてのFilterイベントのautocommandは、現在のバッファを変更できないことに注意してください(変更しようとするとエラーメッセージが表示されます)。これは、ファイルが間違ったバッファに読み込まれるのを防ぐためです。
'modified'フラグは、BufReadPostおよびBufNewFile autocommandを実行した後にリセットされることに注意してください。ただし、
'modified'オプションがautocommandによって設定された場合は、これは発生しません。
BufAdd BufAdd 新しいバッファまたは既存のリストされていないバッファをバッファリストに追加した後(起動中は除く、
VimEnterを参照)、またはリストされているバッファの名前を変更した後。
BufEnterの前。
注: 現在のバッファ "%" は、ターゲットバッファ "<afile>"、"<abuf>" ではありません。
<buffer=abuf> BufDeleteBufDelete バッファリストからバッファを削除する前。 BufUnloadが最初に呼び出される場合があります(バッファがロードされている場合)。また、バッファリスト内のバッファの名前を変更する直前にも使用されます。
注: 現在のバッファ "%" は、ターゲットバッファ "<afile>"、"<abuf>" ではありません。
<buffer=abuf> 別のバッファに変更しないでください。
BufEnterBufEnter 新規または既存のバッファに入った後(訪問、切り替え後)。ファイルタイプオプションの設定に役立ちます。既存のバッファではトリガーされない
BufNewと比較してください。
BufAddの後。
BufReadPostの後。
BufFilePostBufFilePost ":file"または":saveas"コマンドで現在のバッファの名前を変更した後。
BufFilePreBufFilePre ":file"または":saveas"コマンドで現在のバッファの名前を変更する前。
BufHiddenBufHidden バッファが非表示になる前:バッファを表示するウィンドウがなくなったが、バッファはアンロードまたは削除されていない場合。
Vimを終了する際の":qa"または":q"には使用されません。
注意:現在のバッファ"%"は、ターゲットバッファ"<afile>"、"<abuf>"ではありません。
<buffer=abuf>BufLeaveBufLeave 別のバッファに移動する前。また、現在のウィンドウを離れるか閉じるとき、新しい現在のウィンドウが同じバッファでない場合にも発生します。
Vimを終了する際の":qa"または":q"には使用されません。
BufModifiedSetBufModifiedSet バッファの`'modified'`値が変更された後。
BufNewBufNew 新しいバッファを作成した後(起動中は除く、
VimEnterを参照)、または既存のバッファの名前を変更した後。
BufEnterとは異なり、既存のバッファにアクセス(切り替え)しても、これは再びトリガーされません。
注意:現在のバッファ"%"は、ターゲットバッファ"<afile>"、"<abuf>"ではありません。
<buffer=abuf>BufAdd、
BufNewFileも参照してください。
BufNewFileBufNewFile 存在しないファイルの編集を開始する場合。スケルトンファイルの読み込みに使用できます。
BufReadBufReadPostBufReadまたはBufReadPost 新しいバッファの編集を開始するとき、ファイルをバッファに読み込んだ後、モードラインを処理する前。
BufWinEnterを参照して、モードラインを処理した後に何かを実行してください。また、トリガーされます
名前のないバッファを書き込む際に、バッファに名前が付けられる場合
ファイルを正常に回復した後
":filetype detect"を実行する際の"filetypedetect"グループの場合 トリガーされません
`:read file`コマンドの場合
ファイルが存在しない場合
BufReadCmdBufReadCmd 新しいバッファの編集を開始する前。ファイルをバッファに読み込む必要があります。
Cmd-eventBufReadPreE200E201BufReadPre 新しいバッファの編集を開始するとき、ファイルをバッファに読み込む前。ファイルが存在しない場合は使用されません。
BufUnloadBufUnload バッファをアンロードする前、バッファ内のテキストが解放される前。BufWritePostの後。BufDeleteの前。Vimが終了する際に、ロードされているすべてのバッファに対してトリガーされます。
注意:現在のバッファ"%"は、ターゲットバッファ"<afile>"、"<abuf>"ではありません。
<buffer=abuf>バッファまたはウィンドウを切り替えしないでください!終了時、かつv:dyingが2以上の場合、トリガーされません。
BufWinEnterBufWinEnter バッファがウィンドウに表示された後。これは、バッファがロードされたとき(モードラインを処理した後)、または非表示のバッファが表示されたとき(非表示ではなくなったとき)です。
引数のない
:splitの場合、バッファが変更されないため、またはウィンドウに既に開いているファイルで:splitを使用する場合、トリガーされません。現在のバッファの名前で":split"を使用すると、そのバッファがリロードされるため、トリガーされます。
BufWinLeaveBufWinLeave バッファがウィンドウから削除される前。別のウィンドウにまだ表示されている場合は発生しません。終了時にもトリガーされます。BufUnload、BufHiddenの前。
注意:現在のバッファ"%"は、ターゲットバッファ"<afile>"、"<abuf>"ではありません。
<buffer=abuf>終了時、かつv:dyingが2以上の場合、トリガーされません。
BufWipeoutBufWipeout バッファを完全に削除する前。BufUnloadおよびBufDeleteイベントが最初に呼び出される場合があります(バッファがロードされ、バッファリストに含まれていた場合)。また、バッファの名前を変更する直前にも使用されます(バッファリストにない場合も)。
注意:現在のバッファ"%"は、ターゲットバッファ"<afile>"、"<abuf>"ではありません。
<buffer=abuf>別のバッファに変更しないでください。
BufWriteBufWritePreBufWriteまたはBufWritePre バッファ全体をファイルに書き込む前。
BufWriteCmdBufWriteCmd バッファ全体をファイルに書き込む前。ファイルの書き込みを行い、成功した場合は
'modified'をリセットする必要があります。ただし、'+'が
'cpo'に含まれており、別のファイルに書き込む場合は除きます
cpo-+。バッファの内容は変更しないでください。コマンドが
'modified'をリセットすると、
:writeと同様に、古いアンドゥ状態を
'modified'としてマークするようにアンドゥ情報が調整されます。
Cmd-eventBufWritePostBufWritePost バッファ全体をファイルに書き込んだ後(BufWritePreのコマンドを元に戻す必要があります)。
ChanInfoChanInfo チャネルの状態が変更されました。たとえば、RPCチャネルのクライアントが自身を記述しました。これらの
v:eventキーを設定します:info info辞書の形式については、
nvim_get_chan_info()を参照してください。
ChanOpenChanOpen チャネルが開かれた直後。これらの
v:eventキーを設定します:info info辞書の形式については、
nvim_get_chan_info()を参照してください。
CmdUndefinedCmdUndefined ユーザーコマンドが使用されているが、定義されていない場合。使用されている場合にのみコマンドを定義する場合に役立ちます。パターンはコマンド名と照合されます。 `<amatch>`と`<afile>`はどちらもコマンド名に展開されます。
注意:コマンドが定義されるまでは、自動補完は機能しません。代わりに、常にユーザーコマンドを定義し、自動ロード関数を実行するようにすることができます。
autoloadを参照してください。
CmdlineChangedCmdlineChanged コマンドライン内のテキストが変更された後。コマンドラインを壊さないように注意してください。Vimがロックアップする可能性があります。`<afile>`は
cmdline-charに展開されます。
CmdlineEnterCmdlineEnter コマンドラインに入った後(マッピングで":"を非インタラクティブに使用する場合を含む:これを避けるには、代わりに
<Cmd>を使用してください)。パターンは
cmdline-charと照合されます。`<afile>`は
cmdline-charに展開されます。これらの
v:eventキーを設定します:cmdlevel cmdtype
CmdlineLeaveCmdlineLeave コマンドラインを離れる前(マッピングで":"を非インタラクティブに使用する場合を含む:これを避けるには、代わりに
<Cmd>を使用してください)。`<afile>`は
cmdline-charに展開されます。これらの
v:eventキーを設定します:abort(変更可能)cmdlevel cmdtype
注意:`abort`はfalseからtrueに変更することのみ可能です。既に中止されたcmdlineをfalseに変更して実行することはできません。
CmdwinEnterCmdwinEnter コマンドラインウィンドウに入った後。この特別なタイプのウィンドウ専用のオプションを設定する場合に役立ちます。`<afile>`は、コマンドラインのタイプを示す単一文字に展開されます。
cmdwin-charCmdwinLeaveCmdwinLeave コマンドラインウィンドウを離れる前。CmdwinEnterで行われたグローバル設定をクリーンアップする場合に役立ちます。`<afile>`は、コマンドラインのタイプを示す単一文字に展開されます。
cmdwin-charColorSchemeColorScheme カラースキームをロードした後。
:colorschemeカラースキームが見つからない場合はトリガーされません。パターンはカラースキーム名と照合されます。`<afile>`は、このオプションが設定された実際のファイルの名前、`<amatch>`は新しいカラースキームの名前に使用できます。
これらの
v:eventキーを設定します:completed_item
complete-itemsを参照してください。height 表示可能なアイテム数 width 画面セル数 row 上部の画面行 col 左端の画面列 size アイテムの総数 scrollbar 表示されている場合はTRUE
非再帰的(イベントは自身をトリガーできません)。テキストを変更できません。
textlock
これらの
v:eventキーを設定します:reason 補完が完了した理由。以下のいずれかになります
CursorHold CursorHold ユーザーが
'updatetime'で指定された時間、キーを押さない場合。ユーザーがキーを押すまでトリガーされません(つまり、Vimを離れてコーヒーを淹れている間、
'updatetime'ミリ秒ごとに発生するわけではありません:)タグのプレビューについては、
CursorHold-exampleを参照してください。このイベントは、ノーマルモードでのみトリガーされます。コマンドの引数の入力を待機しているとき、または演算子による移動の後にはトリガーされません。記録中は、CursorHoldイベントはトリガーされません。
q<CursorHold>内部的には、autocommand は
<CursorHold>
キーによってトリガーされます。式マッピングでは、
getchar() がこの文字を認識することがあります。
注意: 対話型コマンドはこのイベントには使用できません。入力待ちのプロンプトは表示されず、画面は(必要な場合)直接更新されます。
注意: 将来的には、時間を設定するための別のオプションが追加される予定です。ヒント: ステータスラインの更新を強制するには、以下を使用してください。
:let &ro = &ro
CursorMoved CursorMoved ノーマルモードまたはビジュアルモードで、または別のウィンドウにカーソルが移動した後。また、"x"、"rx"、"p" などでカーソル行のテキストが変更された場合にも発生します。タイプアヘッドがある場合、スクリプトファイルのコマンドを実行している間、またはオペレータが保留中の場合は、常にトリガーされるとは限りません。例については、
match-parens を参照してください。
注意: :noautocmd でスキップすることはできません。注意: これは非常に頻繁にトリガーされるため、ユーザーが予期しないことや処理が遅いことは行わないでください。
CursorMovedCCursorMovedC コマンドラインでカーソルが移動した後。コマンドラインを乱さないように注意してください。Vim がロックアップする可能性があります。
<afile>
は
cmdline-char に展開されます。
CursorMovedICursorMovedI 挿入モードでカーソルが移動した後。ポップアップメニューが表示されている場合はトリガーされません。それ以外の場合は CursorMoved と同じです。
DiffUpdatedDiffUpdated diff が更新された後。使用されている diff の種類(内部または外部)に応じて、変更ごとに、または
:diffupdate を実行したときにトリガーされます。
DirChangedカレントディレクトリ が変更された後。パターンは次のとおりです。"window" は
:lcd
でトリガーされます。"tabpage" は
:tcd
でトリガーされます。"global" は
:cd
でトリガーされます。"auto" は
'autochdir' でトリガーされます。以下の
v:event キーを設定します。cwd: 現在の作業ディレクトリ scope: "global"、"tabpage"、"window" changed_window: ウィンドウ(またはタブ)の切り替えでイベントが発生した場合、v:true
<afile>
は新しいディレクトリ名に設定されます。非再帰的(イベントは自身をトリガーできません)。
DirChangedPreDirChangedPre
DirChanged と同様に、
カレントディレクトリ が変更されようとしているとき。パターンは
DirChanged と同様です。以下の
v:event キーを設定します。directory: 新しい作業ディレクトリ scope: "global"、"tabpage"、"window" changed_window: ウィンドウ(またはタブ)の切り替えでイベントが発生した場合、v:true
<afile>
は新しいディレクトリ名に設定されます。非再帰的(イベントは自身をトリガーできません)。
ExitPreExitPre Vim を終了させる
:quit
、
:wq
を使用する場合、または
:qall
を使用する場合、
QuitPre の直後。重要でないウィンドウを閉じるために使用できます。自動的に保存されない変更されたバッファがある場合、終了はキャンセルされる可能性があります。本当に終了するには
VimLeavePre を使用してください。
QuitPre、
WinClosed も参照してください。
FileAppendCmdFileAppendCmd ファイルに追記する前。ファイルへの追記を行う必要があります。'[ および '] マークを行の範囲に使用します。
Cmd-event FileAppendPostFileAppendPost ファイルに追記した後。
FileAppendPreFileAppendPre ファイルに追記する前。'[ および '] マークを行の範囲に使用します。
FileChangedROFileChangedRO 読み取り専用ファイルに最初の変更を加える前。ソース管理システムからファイルをチェックアウトするために使用できます。変更が autocommand によって引き起こされた場合はトリガーされません。バッファで最初の変更を行うとき、または
'readonly' が設定された後の最初の変更を行うとき、変更がテキストに適用される直前にトリガーされます。
警告: autocommand がカーソルを移動した場合、変更の効果は未定義です。
E788バッファを切り替えることができません。バッファをリロードすることはできますが、別のバッファを編集することはできません。
E881行数が変更された場合、アンドゥのための保存が失敗し、変更が中止される可能性があります。
FileChangedShellFileChangedShell 編集開始以降にファイルの更新時刻が変更されたことを Vim が検出した場合。また、ファイルの属性が変更された場合、またはファイルのサイズが変更された場合にも発生します。
timestamp 変更されたファイルごとに、以下の後にトリガーされます。
シェルコマンドの実行
'autoread' が設定されていて、バッファが変更されていない場合は使用されません。FileChangedShell autocommand が存在する場合、警告メッセージとプロンプトは表示されません。
v:fcs_reason は何が起こったかを示します。次に何が起こるかを制御するには、
v:fcs_choice を設定します。
注意: 現在のバッファ "%" はターゲットバッファ "<afile>" および "<abuf>" ではありません。
<buffer=abuf> E246 E811 バッファの切り替え、ジャンプ、削除はできません。非再帰的(イベントは自身をトリガーできません)。
FileChangedShellPostFileChangedShellPost Vim の外部で変更されたファイルを処理した後。ステータスラインの更新に使用できます。
FileReadCmdFileReadCmd ":read" コマンドでファイルを読み取る前。ファイルの読み取りを行う必要があります。
Cmd-event FileReadPostFileReadPost ":read" コマンドでファイルを読み取った後。Vim は '[ および '] マークを読み取った最初の行と最後の行に設定することに注意してください。これは、読み取った行を操作するために使用できます。
FileReadPreFileReadPre ":read" コマンドでファイルを読み取る前。
FileTypeFileType
'filetype' オプションが設定されたとき。パターンはファイルタイプと照合されます。
<afile>
は、このオプションが設定されたファイルの名前です。
<amatch>
は
'filetype' の新しい値です。ウィンドウまたはバッファを切り替えることはできません。
filetypes を参照してください。
FileWriteCmdFileWriteCmd バッファ全体を書き込んでいないときに、ファイルに書き込む前。ファイルへの書き込みを行う必要があります。バッファを変更しないでください。'[ および '] マークを行の範囲に使用します。
Cmd-event FileWritePostFileWritePost バッファ全体を書き込んでいないときに、ファイルに書き込んだ後。
FileWritePreFileWritePre バッファ全体を書き込んでいないときに、ファイルに書き込む前。'[ および '] マークを行の範囲に使用します。
FilterReadPostFilterReadPost フィルタコマンドからファイルを読み取った後。Vim は FilterReadPre と同様に、現在のバッファの名前とパターンをチェックします。
'shelltemp' がオフの場合はトリガーされません。
FilterReadPre E135 FilterReadPre フィルタコマンドからファイルを読み取る前。Vim は、フィルタコマンドの出力である一時ファイルの名前ではなく、現在のバッファの名前とパターンをチェックします。
'shelltemp' がオフの場合はトリガーされません。
FilterWritePostFilterWritePost フィルタコマンドのためにファイルに書き込んだ後、または外部 diff を使用して diff を作成した後(内部 diff については
DiffUpdated を参照)。Vim は FilterWritePre と同様に、現在のバッファの名前とパターンをチェックします。
'shelltemp' がオフの場合はトリガーされません。
FilterWritePreFilterWritePre フィルタコマンドのためにファイルに書き込む前、または外部 diff を使用して diff を作成する前。Vim は、フィルタコマンドの出力である一時ファイルの名前ではなく、現在のバッファの名前とパターンをチェックします。
'shelltemp' がオフの場合はトリガーされません。
FocusGainedFocusGained Nvim がフォーカスを取得しました。
FocusLostFocusLost Nvim がフォーカスを失いました。また、GUI ダイアログがポップアップしたときにも(可能性があります)。
FuncUndefinedFuncUndefined ユーザー関数が使用されているが、定義されていない場合。関数が使用されている場合にのみ定義する場合に便利です。パターンは関数名と照合されます。
<amatch>
と
<afile>
はどちらも関数の名前に設定されます。
注意: Vim スクリプトを記述する場合、より良い代替手段は、自動ロード関数を使用することです。
autoload-functions を参照してください。
UIEnterUIEnter
nvim_ui_attach() 経由で UI が接続した後、または組み込み TUI が開始した後、
VimEnter の後。以下の
v:event キーを設定します。chan: UI の
channel-id UILeaveUILeave UI が Nvim から切断した後、または組み込み TUI が停止した後、
VimLeave の後。以下の
v:event キーを設定します。chan: UI の
channel-id InsertChangeInsertChange 挿入モードまたは置換モードで
<Insert>
を入力した場合。
v:insertmode 変数は新しいモードを示します。カーソルを移動したり、ユーザーが予期しないことを行ったりしないように注意してください。
InsertCharPreInsertCharPre 挿入モードで文字が入力されたとき、文字が挿入される前。
v:char 変数は入力された文字を示し、イベント中に変更して別の文字を挿入することができます。
v:char が複数の文字に設定されている場合、このテキストは文字通り挿入されます。
テキストを変更できません。
textlock InsertEnterInsertEnter 挿入モードを開始する直前。置換モードと仮想置換モードにも適用されます。
v:insertmode 変数はモードを示します。ユーザーが予期しない動作は避けてください。カーソルは後で復元されます。復元を望まない場合は、
v:char を空でない文字列に設定してください。
InsertLeavePreInsertLeavePre 挿入モードを終了する直前。
CTRL-O
i_CTRL-O を使用する場合にも適用されます。モードを変更したり、
:normal
を使用したりしないでください。問題が発生する可能性があります。
InsertLeaveInsertLeave 挿入モードを終了した直後。
CTRL-O
i_CTRL-O を使用する場合にも適用されます。ただし、
i_CTRL-C には適用されません。
MenuPopup ポップアップメニュー(マウスの右ボタンの下)を表示する直前。カーソルまたはマウスポインターの下にあるものに合わせてメニューを調整するのに便利です。パターンは、モードを表す1文字または2文字と照合されます。n 通常 v ビジュアル o オペレーター待機中 i 挿入 c コマンドライン tl ターミナル
ModeChangedModeChanged モード変更後。パターンは
'old_mode:new_mode'
と照合されます。たとえば、
*:c
と照合すると、
CmdlineEnter をシミュレートします。以下の
v:event の値が設定されます。old_mode 変更前のモード。new_mode 引数をゼロ以外で呼び出した
mode() によって返される新しいモード。ModeChanged がトリガーされると、old_mode はイベントが最後にトリガーされたときの new_mode の値を持ちます。これは、マイナーモードが変更されるたびにトリガーされます。ビジュアルモードに入ったときに相対行番号を使用する使用例
:au ModeChanged [vV\x16]*:* let &l:rnu = mode() =~# '^[vV\x16]'
:au ModeChanged *:[vV\x16]* let &l:rnu = mode() =~# '^[vV\x16]'
:au WinEnter,WinLeave * let &l:rnu = mode() =~# '^[vV\x16]'
注: この自動コマンド中に同じオプションを再設定しないでください。プラグインが壊れる可能性があります。
:noautocmd を使用して、OptionSet のトリガーを防ぐことができます。
非再帰的:自動コマンドの
:set は OptionSet を再度トリガーしません。
起動時にはトリガーされません。
ShellFilterPost ShellFilterPost ":{range}!cmd"、":w !cmd"、または ":r !cmd" でシェルコマンドを実行した後。変更されたファイルを確認するために使用できます。
SourcePreSourcePre Vimscript/Lua ファイルをソースする前。
:source <afile>
は、ソースされているファイルの名前です。
SourcePostSourcePost Vimscript/Lua ファイルをソースした後。
:source <afile>
は、ソースされているファイルの名前です。ソースが中断された場合はトリガーされません。SourceCmd 自動コマンドがトリガーされた後にもトリガーされます。
SourceCmdSourceCmd Vimscript/Lua ファイルをソースしているとき。
:source <afile>
は、ソースされているファイルの名前です。自動コマンドはそのファイルをソースする必要があります。
Cmd-event SpellFileMissingSpellFileMissing スペルチェックファイルをロードしようとしたときに、ファイルが見つからない場合。パターンは言語と照合されます。
<amatch>
は言語で、
'encoding' も関係します。
spell-SpellFileMissing を参照してください。
StdinReadPostStdinReadPost 起動中、stdin からバッファに読み込んだ後、modeline を実行する前に実行されます。
-- StdinReadPreStdinReadPre 起動中、stdin からバッファに読み込む前に実行されます。
-- SwapExistsSwapExists ファイルの編集を開始したときに既存のスワップファイルを検出した場合。Vim がユーザーにどうするかを尋ねる場合、つまり状況に対処する方法を選択できる場合にのみ実行されます。
v:swapname 変数には、見つかったスワップファイルの名前が格納され、
<afile>
には編集中のファイルが格納されます。
v:swapcommand には、開かれたファイルで実行されるコマンドが含まれている場合があります。コマンドは、
v:swapchoice 変数を、Vim に次に何をすべきかを指示する1文字の文字列に設定する必要があります。'o' 読み取り専用で開く 'e' 編集を続ける 'r' 復元する 'd' スワップファイルを削除する 'q' 終了する、ファイルを編集しない 'a' 中止する、
CTRL-C
を押したときのように 空の文字列に設定すると、SwapExists 自動コマンドがない場合と同様に、ユーザーに質問されます。
E812別のバッファに変更したり、バッファ名やディレクトリを変更したりすることはできません。
SyntaxSyntax
'syntax' オプションが設定されたとき。パターンは構文名と照合されます。
<afile>
は、このオプションが設定されたファイルの名前に展開されます。
<amatch>
は
'syntax' の新しい値に展開されます。
:syn-on を参照してください。
TabEnterTabEnter タブページに入った直後。
タブページ WinEnter の後。BufEnter の前。
TabLeaveTabLeave タブページを離れる直前。
タブページ WinLeave の後。
TabNewTabNew 新しいタブページを作成するとき。
タブページ WinEnter の後。TabEnter の前。
TabNewEnteredTabNewEntered 新しいタブページに入った後。
タブページ BufEnter の後。
TabClosedTabClosed タブページを閉じた後。
<afile>
はタブページ番号に展開されます。
TermOpenTermOpen
端末 ジョブの開始時。端末バッファの設定に使用できます。
TermEnterTermEnter
ターミナルモード に入った後。TermOpenの後。
TermLeaveTermLeave
ターミナルモード を抜けた後。TermCloseの後。
TermCloseTermClose
端末 ジョブの終了時。以下の
v:event キーを設定します: status
TermRequestTermRequest
:terminal 子プロセスが OSC または DCS シーケンスを発行したとき。
v:termrequest を設定します。
イベントデータ はリクエスト文字列です。
TermResponseTermResponse Nvim がホスト端末から OSC または DCS レスポンスを受信したとき。
v:termresponse を設定します。
イベントデータ はレスポンス文字列です。別のイベント(ファイル I/O、シェルコマンド、または時間がかかるその他の処理)中にトリガーされる場合があります。例
-- Query the terminal palette for the RGB value of color 1
-- (red) using OSC 4
vim.api.nvim_create_autocmd('TermResponse', {
once = true,
callback = function(args)
local resp = args.data
local r, g, b = resp:match("\027%]4;1;rgb:(%w+)/(%w+)/(%w+)")
end,
})
io.stdout:write("\027]4;1;?\027\\")
TextChanged TextChanged ノーマルモードで現在のバッファのテキストが変更された後。つまり、
b:changedtick が変更された後(TextChanged オートコマンドが定義される前に変更された場合も含む)。タイプアヘッドがある場合、またはオペレーターが保留中の場合はトリガーされません。
注意: :noautocmd
でスキップできません。注意: これは非常に頻繁にトリガーされるため、ユーザーが予期しないことや遅いことは行わないでください。
TextChangedITextChangedI 挿入モードで現在のバッファのテキストが変更された後。ポップアップメニューが表示されている場合はトリガーされません。それ以外の場合は TextChanged と同じです。
TextChangedPTextChangedP ポップアップメニューが表示されている場合にのみ、挿入モードで現在のバッファのテキストが変更された後。それ以外の場合は TextChanged と同じです。
TextChangedTTextChangedT
ターミナルモード で現在のバッファのテキストが変更された後。それ以外の場合は TextChanged と同じです。
TextYankPostTextYankPost
ヤンク または
削除 コマンドの直後。ただし、ブラックホールレジスタ
quote_ が使用されている場合、または
setreg() の場合は除く。パターンは "*" でなければなりません。以下の
v:event キーを設定します: inclusive operator regcontents regname regtype visual
inclusive
フラグと
'[ および
'] マークを組み合わせることで、操作の正確な範囲を計算できます。
非再帰的(イベントは自身をトリガーできません)。テキストを変更できません。
textlock UserUser 自動的には実行されません。
:doautocmd を使用してこれをトリガーします。通常はプラグインの「カスタムイベント」に使用します。例
:autocmd User MyPlugin echom 'got MyPlugin event'
:doautocmd User MyPlugin
UserGettingBored UserGettingBored ユーザーが同じキーを42回押したとき。冗談です! :-)
VimEnterVimEnter vimrc ファイルの読み込み、"-c cmd" 引数の実行、すべてのウィンドウの作成、およびそれらのバッファの読み込みを含む、すべての起動処理の後。このイベントがトリガーされる直前に
v:vim_did_enter 変数が設定されるため、次のようにすることができます
if v:vim_did_enter
call s:init()
else
au VimEnter * call s:init()
endif
VimLeave VimLeave Vim を終了する前、.shada ファイルを書き込んだ直後。VimLeavePre と同様に一度だけ実行されます。
v:dying を使用して異常終了を検出します。
v:exiting を使用して終了コードを取得します。
v:dying が 2 以上の場合、トリガーされません。
VimLeavePreVimLeavePre Vim を終了する前、.shada ファイルを書き込む直前。終了時に現在のバッファになるものの名前と一致する場合にのみ、一度だけ実行されます。" * "パターンで使用するのに最も役立ちます。
:autocmd VimLeavePre * call CleanupStuff()
v:dying を使用して異常終了を検出します。
v:exiting を使用して終了コードを取得します。
v:dying が 2 以上の場合、トリガーされません。
VimResizedVimResized Vim ウィンドウのサイズが変更された後、つまり
'lines' または
'columns' が変更された後。起動時には発生しません。
VimResumeVimResume Nvim が
サスペンド 状態から再開した後。
VimSuspendVimSuspend Nvim が
サスペンド 状態に入る前。
WinClosedWinClosed ウィンドウを閉じる際に、ウィンドウレイアウトから削除される直前。パターンは
ウィンドウID と照合されます。
<amatch>
と
<afile>
はどちらも
ウィンドウID に設定されます。WinLeaveの後。非再帰的(イベントは自身をトリガーできません)。
ExitPre、
QuitPre も参照してください。
WinEnterWinEnter 別のウィンドウに入った後。Vim が起動したばかりの最初のウィンドウには実行されません。ウィンドウの高さを設定するのに便利です。ウィンドウが別のバッファ用である場合、Vim は WinEnter オートコマンドの後に BufEnter オートコマンドを実行します。
注意: 分割コマンドとタブページコマンドの場合、WinEnter イベントは分割コマンドまたはタブコマンドの後、ファイルが読み込まれる前にトリガーされます。
WinLeave WinLeave ウィンドウを離れる前。次に移動するウィンドウが別のバッファ用である場合、Vim は WinLeave オートコマンドの前に BufLeave オートコマンドを実行します(ただし、":new" は除く)。Vim を終了する際の ":qa" または ":q" には使用されません。WinClosedの前。
WinNewWinNew 新しいウィンドウが作成されたとき。Vim が起動したばかりの最初のウィンドウには実行されません。WinEnterの前。
パターンは、スクロールまたはサイズ変更された最初のウィンドウの
ウィンドウID と照合されます。
<amatch>
と
<afile>
はどちらも
ウィンドウID に設定されます。
起動が完了し、最初の画面の再描画が行われた後にのみトリガーが開始されます。最初の WinScrolled または WinResized イベントを定義するときはトリガーされませんが、 المزيدを追加するとトリガーされる場合があります。
非再帰的: WinScrolled イベントのコマンドを実行している間は、イベントはトリガーされません。ただし、コマンドによってウィンドウがスクロールまたはサイズ変更された場合、後で別の WinScrolled イベントがトリガーされます。
:autocmd
の
{aupat}
引数は、カンマ区切りのリストにすることができます。これは、コマンドが各パターンで個別に指定されたかのように機能します。したがって、このコマンド
:autocmd BufRead *.txt,*.info set et
は以下と同等です
:autocmd BufRead *.txt set et
:autocmd BufRead *.info set et
ファイルパターン
{aupat}
は、次の 2 つの方法のいずれかでファイル名と照合されます。1. パターンに '/' がない場合、Vim はファイル名の末尾部分(先頭のディレクトリパスを除く)のみと照合します。2. パターンに '/' がある場合、Vim は短いファイル名(入力したとおり)と完全なファイル名(完全パスに展開し、シンボリックリンクを解決した後)の両方と照合します。
特殊なパターン
<buffer>
または <buffer=N> は、バッファローカルオートコマンド
autocmd-buflocal に使用されます。このパターンはバッファの名前とは照合されません。
例
:autocmd BufRead *.txt set et
すべてのテキストファイルに
'et' オプションを設定します。
:autocmd BufRead /vim/src/*.c set cindent
/vim/src ディレクトリにある C ファイルに
'cindent' オプションを設定します。
:autocmd BufRead /tmp/*.c set ts=5
"/tmp/test.c" から "/home/nobody/vim/src/test.c" へのリンクがあり、"/tmp/test.c" の編集を開始すると、このオートコマンドが一致します。
注意: パスの 一部を照合するが、ルートディレクトリからは照合しない場合は、最初の文字として "*" を使用します。例
:autocmd BufRead */doc/*.txt set tw=78
このオートコマンドは、たとえば "/tmp/doc/xx.txt" と "/usr/home/piet/doc/yy.txt" に対して実行されます。ここでのディレクトリ数は関係ありません。
パターンと照合されるファイル名は、ワイルドカードを展開した後のものです。したがって、次のコマンドを発行した場合
:e $ROOTDIR/main.$EXT
引数は最初に次のように展開されます
/usr/root/main.py
オートコマンドのパターンと照合される前。FileReadCmd などのイベントを使用する場合は、
<amatch>
の値が予期しない値になる可能性があるため注意してください。
環境変数をパターンで使用できます
:autocmd BufRead $VIMRUNTIME/doc/*.txt set expandtab
また、ホームディレクトリには ~ を使用できます($HOME が定義されている場合)
:autocmd BufWritePost ~/.config/nvim/init.vim so <afile>
:autocmd BufRead ~archive/* set readonly
環境変数は、オートコマンドが実行されるときではなく、定義されるときに展開されます。これはコマンドとは異なります!
ファイルパターン パターンは、主にファイル名で使用されるように解釈されます: * 任意の文字シーケンスに一致; 異常: パス区切り文字を含む ? 任意の単一文字に一致 \? '?' に一致 . '.' に一致 ~ '~' に一致 , パターンを区切る \, ',' に一致 { }
パターン の \( \) のように , { } 内:
パターン の \| のように \} リテラル } \{ リテラル { \\\{n,m\}
パターン の \{n,m} のように \
パターン のような特殊な意味 [ch] 'c' または 'h' に一致 [^ch] 'c' と 'h' 以外の任意の文字に一致
すべてのシステムで、パス区切り文字として '/' 文字が使用されることに注意してください(Windows でも)。これは、バックスラッシュをパターンで使用するのが難しく、オートコマンドを異なるシステム間で移植できるようにするために行われました。
パターン 項目を使用することは可能ですが、上記のための変換のため、期待どおりに動作しない場合があります。
autocmd-changes イベントがトリガーされたときに、パターンとのマッチングが行われます。 自動コマンドのいずれかでバッファ名を変更したり、バッファを削除したりしても、どの自動コマンドが実行されるかは変更されません。 例
au BufEnter *.foo bdel
au BufEnter *.foo set modified
これは現在のバッファを削除し、代わりに現在のバッファになったバッファで
'modified'を設定します。 Vimは "*.foo" がそのバッファ名と一致しないことを考慮しません。 イベントがトリガーされた時点のバッファの名前と "*.foo" を照合します。
ただし、
:bwipeで消去されたバッファに対しては、バッファローカルの自動コマンドは実行されません。
:bdelでバッファを削除した後も、バッファは実際にはまだ存在している(リストされていない状態になる)ため、自動コマンドは引き続き実行されます。
バッファローカル自動コマンドは、特定のバッファに関連付けられています。 バッファに名前がない場合や、名前が特定のパターンと一致しない場合に便利です。 ただし、各バッファに明示的に追加する必要があることも意味します。
パターンの代わりに、バッファローカル自動コマンドは次のいずれかの形式を使用します:
<buffer>
現在のバッファ <buffer=99> バッファ番号99 <buffer=abuf>
<abuf>
を使用 (自動コマンドの実行時のみ)
<abuf>
例
:au CursorHold <buffer> echo 'hold'
:au CursorHold <buffer=33> echo 'hold'
:au BufNewFile * au CursorHold <buffer=abuf> echo 'hold'
自動コマンドのすべてのコマンドは、バッファローカル自動コマンドでも機能します。パターンの代わりに特別な文字列を使用するだけです。 例
:au! * <buffer> " remove buffer-local autocommands for
" current buffer
:au! * <buffer=33> " remove buffer-local autocommands for
" buffer #33
:bufdo :au! CursorHold <buffer> " remove autocmd for given event for all
" buffers
:au * <buffer> " list buffer-local autocommands for
" current buffer
現在のバッファに対して自動コマンドが定義されている場合、それはバッファ番号とともに保存されることに注意してください。 したがって、"<buffer=12>" の形式を使用します。ここで、12は現在のバッファの番号です。 これは、たとえば、自動コマンドを一覧表示するときに表示されます。
バッファローカル自動コマンドの存在をテストするには、
exists() 関数を次のように使用します
:if exists("#CursorHold#<buffer=12>") | ... | endif
:if exists("#CursorHold#<buffer>") | ... | endif " for current buffer
バッファが消去されると、そのバッファローカル自動コマンドももちろん消えます。 たとえば、":bdel" でバッファを削除すると、リストから外れるだけで、自動コマンドは引き続き存在します。 バッファローカル自動コマンドの削除を確認するには
:set verbose=6
存在しないバッファに対してバッファローカル自動コマンドを定義することはできません。
自動コマンドはグループにまとめることができます。 これは、自動コマンドのグループを削除または実行する場合に便利です。 たとえば、構文の強調表示のすべての自動コマンドは「highlight」グループにまとめられ、GUIの起動時に ":doautoall highlight BufRead" を実行できます。
特定のグループが選択されていない場合、Vimはデフォルトグループを使用します。 デフォルトグループには名前がありません。 デフォルトグループの自動コマンドを個別に実行することはできません。 すべてのグループの自動コマンドを実行することによってのみ実行できます。
通常、自動コマンドを自動的に実行する場合、Vimはすべてのグループの自動コマンドを使用します。 グループは、":doautocmd" または ":doautoall" で自動コマンドを実行する場合、または自動コマンドを定義または削除する場合にのみ関係します。
グループ名には、空白以外の任意の文字を使用できます。 グループ名 "end" は予約されています (大文字の場合も)。
グループ名は大文字と小文字が区別されます。 これはイベント名とは異なることに注意してください!
:aug :augroup :aug[roup]
{name}
後続の ":autocmd" コマンドの自動コマンドグループ名を定義します。 名前 "end" または "END" はデフォルトグループを選択します。混乱を避けるため、名前は既存の
{event}
名と異なるようにしてください。そうしないと、意図したとおりに動作しない可能性が高くなります。
:augroup-delete E367 W19 E936 :aug[roup]!
{name}
自動コマンドグループ
{name}
を削除します。 このグループを使用している自動コマンドがまだある場合は、これを使用しないでください! それでも実行すると警告が表示されます。 グループが現在のグループである場合、エラーE936が発生します。
特定のグループの自動コマンドを入力するには、次の方法を使用します。1. ":augroup {name}
" でグループを選択します。 2. ":au!"ですべての古い自動コマンドを削除します。3.自動コマンドを定義します。4. "augroup END" でデフォルトグループに戻ります。
例
:augroup uncompress
: au!
: au BufEnter *.gz %!gunzip
:augroup END
これは、自動コマンドが2回定義されるのを防ぎます(たとえば、vimrcファイルを再度ソースした後)。
FileExplorer Vimによって認識されるグループが1つあります:FileExplorer。 このグループが存在する場合、Vimはディレクトリの編集が可能であると想定し、そのディレクトリ内のファイルを一覧表示するプラグインをトリガーします。 これは
netrwプラグインで使用されます。 これにより、次のことができます。
browse edit
Vimは自動コマンドを非自動的に実行することもできます。 これは、自動コマンドを変更した場合、またはVimが間違った自動コマンドを実行した場合(たとえば、ファイルパターンの照合が間違っていた場合)に便利です。
'eventignore' オプションもここに適用されることに注意してください。 このオプションにリストされているイベントは、コマンドの実行を引き起こしません。
:do :doau :doaut :doautocmd E217 :do[autocmd] [
<nomodeline>
] [group]
{event}
[fname]
{event}
の [fname](デフォルト:現在のファイル名)に一致する自動コマンドを現在のバッファに適用します。 これは、現在のファイル名が正しいパターンと一致しない場合、設定を変更した後、または特定のイベントの自動コマンドを実行する場合に使用できます。 自動コマンド内でも使用できるため、ある拡張子の自動コマンドを別の拡張子に基づいて作成できます。 例
:au BufEnter *.cpp so ~/.config/nvim/init_cpp.vim
:au BufEnter *.cpp doau BufEnter x.c
[group] 引数が指定されていない場合、Vimはすべてのグループの自動コマンドを実行します。 [group] 引数が含まれている場合、Vimはそのグループの一致する自動コマンドのみを実行します。 未定義のグループはエラーです。
<nomodeline>自動コマンドを適用した後、モードラインが処理されるため、ファイルを編集するときに、モードラインの設定が自動コマンドの設定よりも優先されます。
<nomodeline>
が指定されている場合は、これはスキップされます。
User など、バッファのロード時に使用されないイベントには、
<nomodeline>
を使用することをお勧めします。 一致する自動コマンドが実行されなかった場合も、モードラインはスキップされます。
:doautoa :doautoall :doautoa[ll] [
<nomodeline>
] [group]
{event}
[fname] ":doautocmd" と同様ですが、ロードされている各バッファに自動コマンドを適用します。 現在のバッファは最後に実行されます。
[fname] は自動コマンドを選択するために使用され、自動コマンドが適用されるバッファを選択するためには使用されないことに注意してください。 例
augroup mine
autocmd!
autocmd FileType * echo expand('<amatch>')
augroup END
doautoall mine FileType Loaded-Buffer
このスクリプトをソーシングすると、ロードされているバッファの数だけ「Loaded-Buffer」が表示されます。
注意:バッファを削除したり、別のバッファに変更したり、バッファの内容を変更したりする自動コマンドには使用しないでください。 結果は予測できません。 このコマンドは、オプションの設定、強調表示の変更などを行う自動コマンドを対象としています。
ファイルの書き込みには、4つの可能なイベントセットがあります。 Vimは、書き込みコマンドに対してこれらのセットの1つだけを使用します
BufWriteCmd BufWritePre BufWritePost バッファ全体を書き込む FilterWritePre FilterWritePost フィルター一時ファイルに書き込む FileAppendCmd FileAppendPre FileAppendPost ファイルに追加する FileWriteCmd FileWritePre FileWritePost その他のファイル書き込み
一致する "*Cmd" 自動コマンドがある場合、それが書き込みを行うと想定されます。 それ以上の書き込みは行われず、他のイベントはトリガーされません。
Cmd-event
"*WritePost" コマンドは、"*WritePre" コマンドによって引き起こされたバッファへの変更をすべて元に戻す必要があります。 そうしないと、ファイルを書き込むと、バッファが変更されるという副作用が生じます。
自動コマンドを実行する前に、行が書き込まれるバッファが一時的に現在のバッファになります。 自動コマンドが現在のバッファを変更したり、以前の現在のバッファを削除したりしない限り、以前の現在のバッファが再び現在のバッファになります。
"*WritePre" および "*AppendPre" 自動コマンドは、行が書き込まれるバッファを削除してはなりません。
'[' および ']' マークは特別な位置にあります
"*ReadPre" イベントの前は、'[' マークは新しい行が挿入される直前の行に設定されます。
"*ReadPost" イベントの前は、'[' マークは読み取られたばかりの最初の行に、']' マークは最後の行に設定されます。
"*WriteCmd"、"*WritePre"、および "*AppendPre" 自動コマンドを実行する前に、'[' マークは書き込まれる最初の行に、']' マークは最後の行に設定されます。 注意:バッファを変更するコマンドを使用すると、'[' と ']' は変更されます。
ファイル名を予期するコマンドでは、読み取られているファイル名に "<afile>" を使用できます
:<afile> (現在のファイル名には "%" も使用できます)。 "<abuf>" は、現在有効なバッファのバッファ番号に使用できます。 これは、名前のないバッファでも機能します。 ただし、バッファのないファイル(たとえば、":r file")では機能しません。
gzip-example 圧縮ファイルの読み取りと書き込みの例
:augroup gzip
: autocmd!
: autocmd BufReadPre,FileReadPre *.gz set bin
: autocmd BufReadPost,FileReadPost *.gz '[,']!gunzip
: autocmd BufReadPost,FileReadPost *.gz set nobin
: autocmd BufReadPost,FileReadPost *.gz execute ":doautocmd BufReadPost " .. expand("%:r")
: autocmd BufWritePost,FileWritePost *.gz !mv <afile> <afile>:r
: autocmd BufWritePost,FileWritePost *.gz !gzip <afile>:r
: autocmd FileAppendPre *.gz !gunzip <afile>
: autocmd FileAppendPre *.gz !mv <afile>:r <afile>
: autocmd FileAppendPost *.gz !mv <afile> <afile>:r
: autocmd FileAppendPost *.gz !gzip <afile>:r
:augroup END
"gzip" グループは、ファイルが2回ソースされたときに ":autocmd!" で既存の自動コマンドを削除できるようにするために使用されます。
("<afile>:r" は拡張子 nélküli ファイル名です。
:_%: を参照してください)
BufNewFile、BufRead/BufReadPost、BufWritePost、FileAppendPost、および VimLeave イベントに対して実行されるコマンドは、バッファの変更フラグを設定またはリセットしません。 BufReadPost 自動コマンドでバッファを解凍する場合でも、":q" で終了できます。 BufWritePost で ":undo" を使用して BufWritePre コマンドによって行われた変更を元に戻す場合でも、":q" を実行できます(これにより "ZZ" も機能します)。 バッファを変更済みとしてマークする場合は、
'modified' オプションを設定します。
自動コマンドからノーマルモードコマンドを実行するには、":normal" コマンドを使用します。 注意して使用してください! ノーマルモードコマンドが完了していない場合、ユーザーは文字を入力する必要があります(たとえば、":normal m" の後には、マーク名を入力する必要があります)。
バッファを変更した後に変更されていない状態にする場合は、
'modified' オプションをリセットします。 これにより、":q!" の代わりに ":q" でバッファを終了できます。
autocmd-nested E218 デフォルトでは、自動コマンドはネストされません。 たとえば、自動コマンドで ":e" または ":w" を使用した場合、Vimはこれらのコマンドに対して BufRead および BufWrite 自動コマンドを実行しません。 これを希望する場合は、ネストするコマンドに "++nested" フラグを使用します。 例えば
:autocmd FileChangedShell *.c ++nested e!
ネストは、再帰ループから抜け出すために10レベルに制限されています。
autocommand 内で ":au" コマンドを使用することが可能です。これは自己変更コマンドになり得ます! これは、一度だけ実行するべき autocommand にとって便利です。
注意: ファイルを読み込むとき(":read file" またはフィルタコマンドを使用)、ファイルの最後の行に
<EOL>
がない場合、Vim はこれを記憶します。次回の書き込み時(":write file" またはフィルタコマンドを使用)、同じ行がファイルの最後の行として再び書き込まれ、かつ
'binary' が設定されている場合、Vim は
<EOL>
を供給しません。これにより、読み込んだ行に対するフィルタコマンドは読み込んだファイルと同じファイルを書き込み、フィルタされた行に対する書き込みコマンドはフィルタから読み込んだファイルと同じファイルを書き込みます。たとえば、圧縮ファイルを書き込む別の方法は
:autocmd FileWritePre *.gz set bin|'[,']!gzip
:autocmd FileWritePost *.gz undo|set nobin
autocommand-パターン カンマで区切って複数のパターンを指定できます。いくつかの例を以下に示します。
:autocmd BufRead * set tw=79 nocin ic infercase fo=2croq
:autocmd BufRead .letter set tw=72 fo=2tcrq
:autocmd BufEnter .letter set dict=/usr/lib/dict/words
:autocmd BufLeave .letter set dict=
:autocmd BufRead,BufNewFile *.c,*.h set tw=0 cin noic
:autocmd BufEnter *.c,*.h abbr FOR for (i = 0; i < 3; ++i)<CR>{<CR>}<Esc>O
:autocmd BufLeave *.c,*.h unabbr FOR
makefile 用(makefile、Makefile、imakefile、makefile.unix など)
:autocmd BufEnter ?akefile* set include=^s\=include
:autocmd BufLeave ?akefile* set include&
C ファイルの編集を常に最初の関数から開始するには
:autocmd BufRead *.c,*.h 1;/^{
上記の "1;" がない場合、検索はファイルの先頭からではなく、ファイルに入った場所から開始されます。
スケルトン テンプレート 新しいファイルを開くときにスケルトン(テンプレート)ファイルを読み込むには
:autocmd BufNewFile *.c 0r ~/vim/skeleton.c
:autocmd BufNewFile *.h 0r ~/vim/skeleton.h
:autocmd BufNewFile *.java 0r ~/vim/skeleton.java
書き込み時に "*.html" ファイルに現在の日付と時刻を挿入するには
:autocmd BufWritePre,FileWritePre *.html ks|call LastMod()|'s
:fun LastMod()
: if line("$") > 20
: let l = 20
: else
: let l = line("$")
: endif
: exe "1," .. l .. "g/Last modified: /s/Last modified: .*/Last modified: " ..
: \ strftime("%Y %b %d")
:endfun
これが機能するためには、ファイルの最初の20行に "Last modified: <date time>" という行が必要です。Vim は <date time>(および同じ行にあるそれ以降のすべて)を現在の日付と時刻に置き換えます。説明: ks 現在の位置をマーク 's' でマークする LastMod() を呼び出す LastMod() 関数を呼び出して作業を行う 's カーソルを元の位置に戻す LastMod() 関数は、ファイルの長さが20行未満かどうかを確認し、":g" コマンドを使用して "Last modified: " を含む行を見つけます。これらの行に対して ":s" コマンドを実行して、既存の日付を現在の日付に置き換えます。":execute" コマンドは、":g" および ":s" コマンドに式を使用できるようにするために使用されます。日付は strftime() 関数で取得されます。引数を変更して別の日付文字列を取得できます。
コマンドラインで :autocmd を入力すると、イベントとコマンド名の補完が(<Tab>
、CTRL-D
などを使用して)適切な場所で行われます。
Vim は、一致するすべての autocommand を指定した順に実行します。最初の autocommand は、ファイルパターンとして "*" を使用してすべてのファイルに使用することをお勧めします。これは、ここで好きな設定のデフォルトを定義できることを意味し、別の一致する autocommand があれば、これらの設定が上書きされます。ただし、他の一致する autocommand がない場合は、少なくともデフォルト設定が復元されます(autocommand が一致した別のファイルからこのファイルに入った場合)。"*" は、Unix シェルとは異なり、"." で始まるファイルにも一致します。
autocommand-検索パターン Autocommand は現在の検索パターンを変更しません。Vim は、autocommand を実行する前に現在の検索パターンを保存し、autocommand の終了後に復元します。これは、autocommand が
'hlsearch' オプションで強調表示された文字列に影響を与えないことを意味します。autocommand 内では、"n" コマンドなどを使用して、通常どおり検索パターンを使用できます。autocommand が検索パターンを設定し、autocommand の終了後に使用されるようにするには、":let @/ =" コマンドを使用します。autocommand 内で ":nohlsearch" を使用して検索の強調表示をオフにすることはできません。Vim の起動時に検索の強調表示を無効にするには、
'shada' オプションで 'h' フラグを使用します。
Cmd-イベント "*Cmd" イベントの1つを使用する場合、一致する autocommand はファイルの読み取り、書き込み、またはソーシングを行うことが期待されます。これは、たとえばリモートシステム上の特殊な種類のファイルを操作する場合に使用できます。注意: これらのイベントを間違った方法で使用すると、一致するファイルの読み取りまたは書き込みが不可能になる可能性があります! autocommand を適切にテストしてください。たとえば、"ftp://*" など、通常のファイル名と一致しないパターンを使用するのが最善です。
BufReadCmd を定義すると、Vim がクラッシュした編集セッションを回復するのが難しくなります。元のファイルから回復する場合、Vim はスワップファイルにないファイルの部分のみを読み取ります。これは BufReadCmd では不可能なため、
:preserve コマンドを使用して、元のファイルが回復に必要ないことを確認してください。ファイルが変更されることが予想される場合にのみ、これを実行することをお勧めします。
ファイルの読み取りおよび書き込みコマンドの場合、
v:cmdarg 変数には、有効な "++enc=" および "++ff=" 引数が含まれます。これらは、ファイルを読み書きするコマンドに使用されるべきです。"!" が使用された場合、
v:cmdbang 変数は1になり、そうでない場合は0になります。
例については、$VIMRUNTIME/plugin/netrwPlugin.vim を参照してください。
:noautocmd :noa 1つのコマンドに対してのみ autocommand を無効にするには、":noautocmd" コマンド修飾子を使用します。これは、後続のコマンドの実行中に
'eventignore' を "all" に設定します。例:
:noautocmd w fname.gz
これは、gzip プラグインで定義された autocommand をトリガーせずにファイルを書き込みます。