Autocmd

Nvim :help ページは、ソースからtree-sitter-vimdocパーサーを使用して生成されています。


自動コマンド autocommand
基本的な説明については、ユーザーマニュアルの40.3セクションを参照してください。

1. はじめに autocmd-intro

ファイルの読み書き時、バッファやウィンドウの出入り時、Vimの終了時に自動的に実行されるコマンドを指定できます。たとえば、*.cに一致するファイルに対して'cindent'オプションを設定するautocommandを作成できます。また、autocommandを使用して、圧縮ファイルの編集(gzip-exampleを参照)などの高度な機能を実装することもできます。autocommandを配置する通常の場所はvimrcファイルです。
E203 E204 E143 E855 E937 E952 警告: autocommandの使用は非常に強力であり、予期しない副作用を引き起こす可能性があります。テキストを破壊しないように注意してください。
最初にファイルの使い捨てコピーでテストすることをお勧めします。たとえば、編集開始時にファイルを解凍するautocommandを使用する場合は、書き込み時の圧縮用のautocommandが正しく機能することを確認してください。
途中でエラーが発生する可能性に備えてください(例:ディスクフル)。Vimはほとんどの場合、バッファへの変更を元に戻すことができますが、他のファイルへの変更を手動でクリーンアップする必要がある場合があります(例:解凍されたファイルを圧縮する)。
BufRead*イベントで圧縮ファイルを編集できる場合は、FileRead*イベントでも同じようにする必要があります(これにより、まれにリカバリが可能になります)。可能な場合は、File*イベントとBuf*イベントに同じautocommandを使用することをお勧めします。

2. autocommandの定義 autocmd-define

: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つのメッセージを出力すると、とにかくこれが発生する可能性があります。

3. autocommandの削除 autocmd! autocmd-remove

: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]で定義されたグループを使用します。

4. autocommandのリスト autocmd-list

: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
詳細については、:verbose-cmdを参照してください。

5. イベント autocmd-events E215 E216

カンマ区切りのイベント名リストを指定できます。このリストには空白を使用できません。コマンドは、リスト内のすべてのイベントに適用されます。
ファイルの読み込みには、4種類のイベントが考えられます。BufNewFile 存在しないファイルの編集開始 BufReadPre BufReadPost 既存のファイルの編集開始 FilterReadPre FilterReadPost フィルタ出力で一時ファイルを読み込み FileReadPre FileReadPost その他のファイル読み込み Vimは、ファイルを読み込むときに、これら4種類のうちの1つだけを使用します。「Pre」イベントと「Post」イベントは両方とも、ファイルの読み込み前と後にトリガーされます。
"*ReadPre"イベントとすべてのFilterイベントのautocommandは、現在のバッファを変更できないことに注意してください(変更しようとするとエラーメッセージが表示されます)。これは、ファイルが間違ったバッファに読み込まれるのを防ぐためです。
'modified'フラグは、BufReadPostおよびBufNewFile autocommandを実行した後にリセットされることに注意してください。ただし、'modified'オプションがautocommandによって設定された場合は、これは発生しません。
'eventignore'オプションを使用して、いくつかのイベントまたはすべてのイベントを無視できます。
events {event} Nvimは次のイベントを認識します。名前は大文字と小文字が区別されません。
BufAdd
BufAdd 新しいバッファまたは既存のリストされていないバッファをバッファリストに追加した後(起動中は除く、VimEnterを参照)、またはリストされているバッファの名前を変更した後。 BufEnterの前。 注: 現在のバッファ "%" は、ターゲットバッファ "<afile>"、"<abuf>" ではありません。 <buffer=abuf> BufDelete
BufDelete バッファリストからバッファを削除する前。 BufUnloadが最初に呼び出される場合があります(バッファがロードされている場合)。また、バッファリスト内のバッファの名前を変更する直前にも使用されます。 注: 現在のバッファ "%" は、ターゲットバッファ "<afile>"、"<abuf>" ではありません。 <buffer=abuf> 別のバッファに変更しないでください。 BufEnter
BufEnter 新規または既存のバッファに入った後(訪問、切り替え後)。ファイルタイプオプションの設定に役立ちます。既存のバッファではトリガーされないBufNewと比較してください。BufAddの後。BufReadPostの後。BufFilePost
BufFilePost ":file"または":saveas"コマンドで現在のバッファの名前を変更した後。BufFilePre
BufFilePre ":file"または":saveas"コマンドで現在のバッファの名前を変更する前。BufHidden
BufHidden バッファが非表示になる前:バッファを表示するウィンドウがなくなったが、バッファはアンロードまたは削除されていない場合。
Vimを終了する際の":qa"または":q"には使用されません。注意:現在のバッファ"%"は、ターゲットバッファ"<afile>"、"<abuf>"ではありません。<buffer=abuf>BufLeave
BufLeave 別のバッファに移動する前。また、現在のウィンドウを離れるか閉じるとき、新しい現在のウィンドウが同じバッファでない場合にも発生します。
Vimを終了する際の":qa"または":q"には使用されません。BufModifiedSet
BufModifiedSet バッファの`'modified'`値が変更された後。BufNew
BufNew 新しいバッファを作成した後(起動中は除く、VimEnterを参照)、または既存のバッファの名前を変更した後。BufEnterとは異なり、既存のバッファにアクセス(切り替え)しても、これは再びトリガーされません。注意:現在のバッファ"%"は、ターゲットバッファ"<afile>"、"<abuf>"ではありません。<buffer=abuf>BufAddBufNewFileも参照してください。BufNewFile
BufNewFile 存在しないファイルの編集を開始する場合。スケルトンファイルの読み込みに使用できます。BufReadBufReadPostBufReadまたはBufReadPost 新しいバッファの編集を開始するとき、ファイルをバッファに読み込んだ後、モードラインを処理する前。BufWinEnterを参照して、モードラインを処理した後に何かを実行してください。また、トリガーされます
名前のないバッファを書き込む際に、バッファに名前が付けられる場合
ファイルを正常に回復した後
":filetype detect"を実行する際の"filetypedetect"グループの場合 トリガーされません
`:read file`コマンドの場合
ファイルが存在しない場合BufReadCmd
BufReadCmd 新しいバッファの編集を開始する前。ファイルをバッファに読み込む必要があります。Cmd-eventBufReadPreE200E201BufReadPre 新しいバッファの編集を開始するとき、ファイルをバッファに読み込む前。ファイルが存在しない場合は使用されません。BufUnload
BufUnload バッファをアンロードする前、バッファ内のテキストが解放される前。BufWritePostの後。BufDeleteの前。Vimが終了する際に、ロードされているすべてのバッファに対してトリガーされます。注意:現在のバッファ"%"は、ターゲットバッファ"<afile>"、"<abuf>"ではありません。<buffer=abuf>バッファまたはウィンドウを切り替えしないでください!終了時、かつv:dyingが2以上の場合、トリガーされません。BufWinEnter
BufWinEnter バッファがウィンドウに表示された後。これは、バッファがロードされたとき(モードラインを処理した後)、または非表示のバッファが表示されたとき(非表示ではなくなったとき)です。
引数のない:splitの場合、バッファが変更されないため、またはウィンドウに既に開いているファイルで:splitを使用する場合、トリガーされません。現在のバッファの名前で":split"を使用すると、そのバッファがリロードされるため、トリガーされます。BufWinLeave
BufWinLeave バッファがウィンドウから削除される前。別のウィンドウにまだ表示されている場合は発生しません。終了時にもトリガーされます。BufUnload、BufHiddenの前。注意:現在のバッファ"%"は、ターゲットバッファ"<afile>"、"<abuf>"ではありません。<buffer=abuf>終了時、かつv:dyingが2以上の場合、トリガーされません。BufWipeout
BufWipeout バッファを完全に削除する前。BufUnloadおよびBufDeleteイベントが最初に呼び出される場合があります(バッファがロードされ、バッファリストに含まれていた場合)。また、バッファの名前を変更する直前にも使用されます(バッファリストにない場合も)。注意:現在のバッファ"%"は、ターゲットバッファ"<afile>"、"<abuf>"ではありません。<buffer=abuf>別のバッファに変更しないでください。BufWriteBufWritePreBufWriteまたはBufWritePre バッファ全体をファイルに書き込む前。BufWriteCmd
BufWriteCmd バッファ全体をファイルに書き込む前。ファイルの書き込みを行い、成功した場合は'modified'をリセットする必要があります。ただし、'+'が'cpo'に含まれており、別のファイルに書き込む場合は除きますcpo-+。バッファの内容は変更しないでください。コマンドが'modified'をリセットすると、:writeと同様に、古いアンドゥ状態を'modified'としてマークするようにアンドゥ情報が調整されます。Cmd-eventBufWritePost
BufWritePost バッファ全体をファイルに書き込んだ後(BufWritePreのコマンドを元に戻す必要があります)。ChanInfo
ChanInfo チャネルの状態が変更されました。たとえば、RPCチャネルのクライアントが自身を記述しました。これらのv:eventキーを設定します:info info辞書の形式については、nvim_get_chan_info()を参照してください。ChanOpen
ChanOpen チャネルが開かれた直後。これらのv:eventキーを設定します:info info辞書の形式については、nvim_get_chan_info()を参照してください。CmdUndefined
CmdUndefined ユーザーコマンドが使用されているが、定義されていない場合。使用されている場合にのみコマンドを定義する場合に役立ちます。パターンはコマンド名と照合されます。 `<amatch>`と`<afile>`はどちらもコマンド名に展開されます。注意:コマンドが定義されるまでは、自動補完は機能しません。代わりに、常にユーザーコマンドを定義し、自動ロード関数を実行するようにすることができます。autoloadを参照してください。CmdlineChanged
CmdlineChanged コマンドライン内のテキストが変更された後。コマンドラインを壊さないように注意してください。Vimがロックアップする可能性があります。`<afile>`はcmdline-charに展開されます。CmdlineEnter
CmdlineEnter コマンドラインに入った後(マッピングで":"を非インタラクティブに使用する場合を含む:これを避けるには、代わりに<Cmd>を使用してください)。パターンはcmdline-charと照合されます。`<afile>`はcmdline-charに展開されます。これらのv:eventキーを設定します:cmdlevel cmdtypeCmdlineLeave
CmdlineLeave コマンドラインを離れる前(マッピングで":"を非インタラクティブに使用する場合を含む:これを避けるには、代わりに<Cmd>を使用してください)。`<afile>`はcmdline-charに展開されます。これらのv:eventキーを設定します:abort(変更可能)cmdlevel cmdtype注意:`abort`はfalseからtrueに変更することのみ可能です。既に中止されたcmdlineをfalseに変更して実行することはできません。CmdwinEnter
CmdwinEnter コマンドラインウィンドウに入った後。この特別なタイプのウィンドウ専用のオプションを設定する場合に役立ちます。`<afile>`は、コマンドラインのタイプを示す単一文字に展開されます。cmdwin-charCmdwinLeave
CmdwinLeave コマンドラインウィンドウを離れる前。CmdwinEnterで行われたグローバル設定をクリーンアップする場合に役立ちます。`<afile>`は、コマンドラインのタイプを示す単一文字に展開されます。cmdwin-charColorScheme
ColorScheme カラースキームをロードした後。:colorschemeカラースキームが見つからない場合はトリガーされません。パターンはカラースキーム名と照合されます。`<afile>`は、このオプションが設定された実際のファイルの名前、`<amatch>`は新しいカラースキームの名前に使用できます。
ColorSchemePre
ColorSchemePre カラースキームをロードする前。:colorscheme別のカラースキームがロードされる前に、カラースキームによって追加されたものを削除する設定に役立ちます。
CompleteChangedCompleteChanged
挿入モードの補完メニューが変更されるたびに、その後に発生します。ポップアップメニューの非表示時には発生しません。その場合はCompleteDonePreまたはCompleteDoneを使用してください。
これらのv:eventキーを設定します:completed_itemcomplete-itemsを参照してください。height 表示可能なアイテム数 width 画面セル数 row 上部の画面行 col 左端の画面列 size アイテムの総数 scrollbar 表示されている場合はTRUE
非再帰的(イベントは自身をトリガーできません)。テキストを変更できません。textlock
ポップアップのサイズと位置は、pum_getpos()を呼び出すことによっても取得できます。
CompleteDonePre
CompleteDonePre 挿入モードの補完が完了した後。何かが補完されたとき、または補完を中止したときのいずれか。ins-completioncomplete_info()を使用できます。情報はCompleteDonePreのトリガー後にクリアされます。v:completed_item変数には、補完されたアイテムに関する情報が含まれています。
CompleteDone
CompleteDone 挿入モードの補完が完了した後。何かが補完されたとき、または補完を中止したときのいずれか。ins-completioncomplete_info()は使用できません。情報はCompleteDoneのトリガー前にクリアされます。必要な場合はCompleteDonePreを使用してください。v:completed_itemは補完されたアイテムを提供します。
これらのv:eventキーを設定します:reason 補完が完了した理由。以下のいずれかになります
"accept":complete_CTRL-Yを使用して補完が受け入れられました。
"cancel":complete_CTRL-Eを使用して補完がキャンセルされました。キーワード以外の文字を押したか、新しい補完をトリガーしました。
CursorHold
CursorHold ユーザーが'updatetime'で指定された時間、キーを押さない場合。ユーザーがキーを押すまでトリガーされません(つまり、Vimを離れてコーヒーを淹れている間、'updatetime'ミリ秒ごとに発生するわけではありません:)タグのプレビューについては、CursorHold-exampleを参照してください。このイベントは、ノーマルモードでのみトリガーされます。コマンドの引数の入力を待機しているとき、または演算子による移動の後にはトリガーされません。記録中は、CursorHoldイベントはトリガーされません。q<CursorHold>
内部的には、autocommand は <CursorHold> キーによってトリガーされます。式マッピングでは、getchar() がこの文字を認識することがあります。
注意: 対話型コマンドはこのイベントには使用できません。入力待ちのプロンプトは表示されず、画面は(必要な場合)直接更新されます。 注意: 将来的には、時間を設定するための別のオプションが追加される予定です。ヒント: ステータスラインの更新を強制するには、以下を使用してください。
:let &ro = &ro
CursorHoldI
CursorHoldI CursorHold と同様ですが、挿入モードで使用します。 CTRL-V 後など、別のキーを待機しているときや、CTRL-X モードの insert_expand ではトリガーされません。
CursorMoved
CursorMoved ノーマルモードまたはビジュアルモードで、または別のウィンドウにカーソルが移動した後。また、"x"、"rx"、"p" などでカーソル行のテキストが変更された場合にも発生します。タイプアヘッドがある場合、スクリプトファイルのコマンドを実行している間、またはオペレータが保留中の場合は、常にトリガーされるとは限りません。例については、match-parens を参照してください。 注意: :noautocmd でスキップすることはできません。注意: これは非常に頻繁にトリガーされるため、ユーザーが予期しないことや処理が遅いことは行わないでください。 CursorMovedC
CursorMovedC コマンドラインでカーソルが移動した後。コマンドラインを乱さないように注意してください。Vim がロックアップする可能性があります。 <afile>cmdline-char に展開されます。 CursorMovedI
CursorMovedI 挿入モードでカーソルが移動した後。ポップアップメニューが表示されている場合はトリガーされません。それ以外の場合は CursorMoved と同じです。 DiffUpdated
DiffUpdated diff が更新された後。使用されている diff の種類(内部または外部)に応じて、変更ごとに、または :diffupdate を実行したときにトリガーされます。 DirChanged
カレントディレクトリ が変更された後。パターンは次のとおりです。"window" は :lcd でトリガーされます。"tabpage" は :tcd でトリガーされます。"global" は :cd でトリガーされます。"auto" は 'autochdir' でトリガーされます。以下の v:event キーを設定します。cwd: 現在の作業ディレクトリ scope: "global"、"tabpage"、"window" changed_window: ウィンドウ(またはタブ)の切り替えでイベントが発生した場合、v:true <afile> は新しいディレクトリ名に設定されます。非再帰的(イベントは自身をトリガーできません)。 DirChangedPre
DirChangedPre DirChanged と同様に、カレントディレクトリ が変更されようとしているとき。パターンは DirChanged と同様です。以下の v:event キーを設定します。directory: 新しい作業ディレクトリ scope: "global"、"tabpage"、"window" changed_window: ウィンドウ(またはタブ)の切り替えでイベントが発生した場合、v:true <afile> は新しいディレクトリ名に設定されます。非再帰的(イベントは自身をトリガーできません)。 ExitPre
ExitPre Vim を終了させる :quit:wq を使用する場合、または :qall を使用する場合、QuitPre の直後。重要でないウィンドウを閉じるために使用できます。自動的に保存されない変更されたバッファがある場合、終了はキャンセルされる可能性があります。本当に終了するには VimLeavePre を使用してください。 QuitPreWinClosed も参照してください。 FileAppendCmd
FileAppendCmd ファイルに追記する前。ファイルへの追記を行う必要があります。'[ および '] マークを行の範囲に使用します。 Cmd-event FileAppendPost
FileAppendPost ファイルに追記した後。 FileAppendPre
FileAppendPre ファイルに追記する前。'[ および '] マークを行の範囲に使用します。 FileChangedRO
FileChangedRO 読み取り専用ファイルに最初の変更を加える前。ソース管理システムからファイルをチェックアウトするために使用できます。変更が autocommand によって引き起こされた場合はトリガーされません。バッファで最初の変更を行うとき、または 'readonly' が設定された後の最初の変更を行うとき、変更がテキストに適用される直前にトリガーされます。 警告: autocommand がカーソルを移動した場合、変更の効果は未定義です。 E788
バッファを切り替えることができません。バッファをリロードすることはできますが、別のバッファを編集することはできません。 E881
行数が変更された場合、アンドゥのための保存が失敗し、変更が中止される可能性があります。 FileChangedShell
FileChangedShell 編集開始以降にファイルの更新時刻が変更されたことを Vim が検出した場合。また、ファイルの属性が変更された場合、またはファイルのサイズが変更された場合にも発生します。 timestamp 変更されたファイルごとに、以下の後にトリガーされます。
シェルコマンドの実行
'autoread' が設定されていて、バッファが変更されていない場合は使用されません。FileChangedShell autocommand が存在する場合、警告メッセージとプロンプトは表示されません。 v:fcs_reason は何が起こったかを示します。次に何が起こるかを制御するには、v:fcs_choice を設定します。 注意: 現在のバッファ "%" はターゲットバッファ "<afile>" および "<abuf>" ではありません。 <buffer=abuf> E246 E811 バッファの切り替え、ジャンプ、削除はできません。非再帰的(イベントは自身をトリガーできません)。 FileChangedShellPost
FileChangedShellPost Vim の外部で変更されたファイルを処理した後。ステータスラインの更新に使用できます。 FileReadCmd
FileReadCmd ":read" コマンドでファイルを読み取る前。ファイルの読み取りを行う必要があります。 Cmd-event FileReadPost
FileReadPost ":read" コマンドでファイルを読み取った後。Vim は '[ および '] マークを読み取った最初の行と最後の行に設定することに注意してください。これは、読み取った行を操作するために使用できます。 FileReadPre
FileReadPre ":read" コマンドでファイルを読み取る前。 FileType
FileType 'filetype' オプションが設定されたとき。パターンはファイルタイプと照合されます。 <afile> は、このオプションが設定されたファイルの名前です。 <amatch>'filetype' の新しい値です。ウィンドウまたはバッファを切り替えることはできません。 filetypes を参照してください。 FileWriteCmd
FileWriteCmd バッファ全体を書き込んでいないときに、ファイルに書き込む前。ファイルへの書き込みを行う必要があります。バッファを変更しないでください。'[ および '] マークを行の範囲に使用します。 Cmd-event FileWritePost
FileWritePost バッファ全体を書き込んでいないときに、ファイルに書き込んだ後。 FileWritePre
FileWritePre バッファ全体を書き込んでいないときに、ファイルに書き込む前。'[ および '] マークを行の範囲に使用します。 FilterReadPost
FilterReadPost フィルタコマンドからファイルを読み取った後。Vim は FilterReadPre と同様に、現在のバッファの名前とパターンをチェックします。 'shelltemp' がオフの場合はトリガーされません。 FilterReadPre E135 FilterReadPre フィルタコマンドからファイルを読み取る前。Vim は、フィルタコマンドの出力である一時ファイルの名前ではなく、現在のバッファの名前とパターンをチェックします。 'shelltemp' がオフの場合はトリガーされません。 FilterWritePost
FilterWritePost フィルタコマンドのためにファイルに書き込んだ後、または外部 diff を使用して diff を作成した後(内部 diff については DiffUpdated を参照)。Vim は FilterWritePre と同様に、現在のバッファの名前とパターンをチェックします。 'shelltemp' がオフの場合はトリガーされません。 FilterWritePre
FilterWritePre フィルタコマンドのためにファイルに書き込む前、または外部 diff を使用して diff を作成する前。Vim は、フィルタコマンドの出力である一時ファイルの名前ではなく、現在のバッファの名前とパターンをチェックします。 'shelltemp' がオフの場合はトリガーされません。 FocusGained
FocusGained Nvim がフォーカスを取得しました。 FocusLost
FocusLost Nvim がフォーカスを失いました。また、GUI ダイアログがポップアップしたときにも(可能性があります)。 FuncUndefined
FuncUndefined ユーザー関数が使用されているが、定義されていない場合。関数が使用されている場合にのみ定義する場合に便利です。パターンは関数名と照合されます。 <amatch><afile> はどちらも関数の名前に設定されます。 注意: Vim スクリプトを記述する場合、より良い代替手段は、自動ロード関数を使用することです。 autoload-functions を参照してください。 UIEnter
UIEnter nvim_ui_attach() 経由で UI が接続した後、または組み込み TUI が開始した後、VimEnter の後。以下の v:event キーを設定します。chan: UI の channel-id UILeave
UILeave UI が Nvim から切断した後、または組み込み TUI が停止した後、VimLeave の後。以下の v:event キーを設定します。chan: UI の channel-id InsertChange
InsertChange 挿入モードまたは置換モードで <Insert> を入力した場合。 v:insertmode 変数は新しいモードを示します。カーソルを移動したり、ユーザーが予期しないことを行ったりしないように注意してください。 InsertCharPre
InsertCharPre 挿入モードで文字が入力されたとき、文字が挿入される前。 v:char 変数は入力された文字を示し、イベント中に変更して別の文字を挿入することができます。 v:char が複数の文字に設定されている場合、このテキストは文字通り挿入されます。
テキストを変更できません。 textlock InsertEnter
InsertEnter 挿入モードを開始する直前。置換モードと仮想置換モードにも適用されます。v:insertmode 変数はモードを示します。ユーザーが予期しない動作は避けてください。カーソルは後で復元されます。復元を望まない場合は、v:char を空でない文字列に設定してください。 InsertLeavePre
InsertLeavePre 挿入モードを終了する直前。CTRL-O i_CTRL-O を使用する場合にも適用されます。モードを変更したり、:normal を使用したりしないでください。問題が発生する可能性があります。 InsertLeave
InsertLeave 挿入モードを終了した直後。CTRL-O i_CTRL-O を使用する場合にも適用されます。ただし、i_CTRL-C には適用されません。 MenuPopup
MenuPopup ポップアップメニュー(マウスの右ボタンの下)を表示する直前。カーソルまたはマウスポインターの下にあるものに合わせてメニューを調整するのに便利です。パターンは、モードを表す1文字または2文字と照合されます。n 通常 v ビジュアル o オペレーター待機中 i 挿入 c コマンドライン tl ターミナル ModeChanged
ModeChanged モード変更後。パターンは '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]'
OptionSet
OptionSet オプションを設定した後(起動中は除く)。autocmd-pattern は、長いオプション名と照合されます。<amatch> は、どのオプションが設定されたかを示します。
v:option_type は、グローバルスコープかローカルスコープかを示します。v:option_command は、どのタイプの set/let コマンドが使用されたかを示します(表を見るにはタグをたどってください)。v:option_new は、新しく設定された値を示します。v:option_oldlocal は、古いローカル値を持ちます。v:option_oldglobal は、古いグローバル値を持ちます。v:option_old は、古いオプション値を示します。
v:option_oldlocal は、:set または :setlocal または modeline を使用してオプションを設定した場合にのみ設定されます。同様に、v:option_oldglobal は、:set または :setglobal が使用された場合にのみ設定されます。
これは <abuf> を設定しません。bufnr() を使用できます。
グローバルローカル オプションを :set で設定すると、v:option_old は古いグローバル値になります。ただし、グローバルローカルではないすべてのオプションについては、古いローカル値になります。
使用例:'backupdir' および 'undodir' オプションにディレクトリが存在するかどうかを確認し、存在しない場合はディレクトリを作成します。
注: この自動コマンド中に同じオプションを再設定しないでください。プラグインが壊れる可能性があります。:noautocmd を使用して、OptionSet のトリガーを防ぐことができます。
非再帰的:自動コマンドの :set は OptionSet を再度トリガーしません。
起動時にはトリガーされません。
QuickFixCmdPre
QuickFixCmdPre quickfix コマンドが実行される前(:make:lmake:grep:lgrep:grepadd:lgrepadd:vimgrep:lvimgrep:vimgrepadd:lvimgrepadd:cfile:cgetfile:caddfile:lfile:lgetfile:laddfile:helpgrep:lhelpgrep:cexpr:cgetexpr:caddexpr:cbuffer:cgetbuffer:caddbuffer)。パターンは、実行されるコマンドと照合されます。:grep が使用されていても、'grepprg' が "internal" に設定されている場合は、"grep" と一致します。このコマンドを使用して、'makeprg' 変数と 'grepprg' 変数を設定することはできません。このコマンドでエラーが発生した場合、quickfix コマンドは実行されません。 QuickFixCmdPost
QuickFixCmdPost QuickFixCmdPre と同様ですが、quickfix コマンドが実行された後、最初の場所にジャンプする前に実行されます。:cfile および :lfile コマンドの場合、エラーファイルが読み取られた後、最初のエラーに移動する前に実行されます。QuickFixCmdPost-example を参照してください。 QuitPre
QuitPre :quit:wq、または :qall を使用する場合、現在のウィンドウを閉じるか Vim を終了するかを決定する前に実行されます。:wq の場合、バッファは QuitPre がトリガーされる前に書き込まれます。現在のウィンドウが最後の通常のウィンドウである場合、重要でないウィンドウを閉じるために使用できます。ExitPreWinClosed も参照してください。 RemoteReply
RemoteReply サーバーとして機能する Vim からの応答を受信したとき server2client()。パターンは {serverid} と照合されます。<amatch> は応答が送信された {serverid} と等しく、<afile> は実際の応答文字列です。自動コマンドが定義されていても、応答を消費するには remote_read() で読み取る必要があります。 SearchWrapped
SearchWrapped n または N で検索を実行した後、検索がドキュメントの最初/最後に折り返された場合に実行されます。 RecordingEnter
RecordingEnter マクロの記録が開始されたとき。パターンは現在のファイル名で、reg_recording() は使用されている現在のレジスタです。 RecordingLeave
RecordingLeave マクロの記録が停止されたとき。パターンは現在のファイル名で、reg_recording() は記録されたレジスタです。reg_recorded() は、このイベントの後にのみ更新されます。以下の v:event キーを設定します。regcontents regname SafeState
SafeState 保留中の処理がなく、ユーザーが文字を入力するのを待機している状態になったとき。以下の場合はトリガーされません。
オペレーターが保留中の場合
"r" でレジスタが入力された場合
コマンドの実行途中である場合
マッピングを実行中の場合
先行入力がある場合
挿入モード補完がアクティブな場合
コマンドライン補完がアクティブな場合 mode() を使用して、Vim がどの状態にあるかを確認できます。以下の場合があります。
ビジュアルモード
ノーマルモード
挿入モード
コマンドラインモード 目的によっては、state() を使用して、画面がメッセージのためにスクロールされたかどうかなどを確認することもできます。
SessionLoadPost
SessionLoadPost :mksession コマンドを使用して作成されたセッションファイルを読み込んだ後。 SessionWritePost
SessionWritePost :mksession コマンドを呼び出してセッションファイルを書き込んだ後。 ShellCmdPost
ShellCmdPost :!cmd:make:grep でシェルコマンドを実行した後。変更されたファイルを確認するために使用できます。ノンブロッキングシェルコマンドについては、ジョブ制御 を参照してください。 Signal
Signal Nvim がシグナルを受信した後。パターンはシグナル名と照合されます。"SIGUSR1" と "SIGWINCH" のみがサポートされています。例
autocmd Signal SIGUSR1 call some#func()
ShellFilterPost
ShellFilterPost ":{range}!cmd"、":w !cmd"、または ":r !cmd" でシェルコマンドを実行した後。変更されたファイルを確認するために使用できます。 SourcePre
SourcePre Vimscript/Lua ファイルをソースする前。:source <afile> は、ソースされているファイルの名前です。 SourcePost
SourcePost Vimscript/Lua ファイルをソースした後。:source <afile> は、ソースされているファイルの名前です。ソースが中断された場合はトリガーされません。SourceCmd 自動コマンドがトリガーされた後にもトリガーされます。 SourceCmd
SourceCmd Vimscript/Lua ファイルをソースしているとき。:source <afile> は、ソースされているファイルの名前です。自動コマンドはそのファイルをソースする必要があります。Cmd-event SpellFileMissing
SpellFileMissing スペルチェックファイルをロードしようとしたときに、ファイルが見つからない場合。パターンは言語と照合されます。<amatch> は言語で、'encoding' も関係します。spell-SpellFileMissing を参照してください。 StdinReadPost
StdinReadPost 起動中、stdin からバッファに読み込んだ後、modeline を実行する前に実行されます。-- StdinReadPre
StdinReadPre 起動中、stdin からバッファに読み込む前に実行されます。-- SwapExists
SwapExists ファイルの編集を開始したときに既存のスワップファイルを検出した場合。Vim がユーザーにどうするかを尋ねる場合、つまり状況に対処する方法を選択できる場合にのみ実行されます。v:swapname 変数には、見つかったスワップファイルの名前が格納され、<afile> には編集中のファイルが格納されます。v:swapcommand には、開かれたファイルで実行されるコマンドが含まれている場合があります。コマンドは、v:swapchoice 変数を、Vim に次に何をすべきかを指示する1文字の文字列に設定する必要があります。'o' 読み取り専用で開く 'e' 編集を続ける 'r' 復元する 'd' スワップファイルを削除する 'q' 終了する、ファイルを編集しない 'a' 中止する、CTRL-C を押したときのように 空の文字列に設定すると、SwapExists 自動コマンドがない場合と同様に、ユーザーに質問されます。 E812
別のバッファに変更したり、バッファ名やディレクトリを変更したりすることはできません。 Syntax
Syntax 'syntax' オプションが設定されたとき。パターンは構文名と照合されます。<afile> は、このオプションが設定されたファイルの名前に展開されます。<amatch>'syntax' の新しい値に展開されます。:syn-on を参照してください。 TabEnter
TabEnter タブページに入った直後。タブページ WinEnter の後。BufEnter の前。 TabLeave
TabLeave タブページを離れる直前。タブページ WinLeave の後。 TabNew
TabNew 新しいタブページを作成するとき。タブページ WinEnter の後。TabEnter の前。 TabNewEntered
TabNewEntered 新しいタブページに入った後。タブページ BufEnter の後。 TabClosed
TabClosed タブページを閉じた後。<afile> はタブページ番号に展開されます。 TermOpen
TermOpen 端末 ジョブの開始時。端末バッファの設定に使用できます。 TermEnter
TermEnter ターミナルモード に入った後。TermOpenの後。 TermLeave
TermLeave ターミナルモード を抜けた後。TermCloseの後。 TermClose
TermClose 端末 ジョブの終了時。以下の v:event キーを設定します: status TermRequest
TermRequest :terminal 子プロセスが OSC または DCS シーケンスを発行したとき。v:termrequest を設定します。イベントデータ はリクエスト文字列です。 TermResponse
TermResponse 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 でスキップできません。注意: これは非常に頻繁にトリガーされるため、ユーザーが予期しないことや遅いことは行わないでください。 TextChangedI
TextChangedI 挿入モードで現在のバッファのテキストが変更された後。ポップアップメニューが表示されている場合はトリガーされません。それ以外の場合は TextChanged と同じです。 TextChangedP
TextChangedP ポップアップメニューが表示されている場合にのみ、挿入モードで現在のバッファのテキストが変更された後。それ以外の場合は TextChanged と同じです。 TextChangedT
TextChangedT ターミナルモード で現在のバッファのテキストが変更された後。それ以外の場合は TextChanged と同じです。 TextYankPost
TextYankPost ヤンク または 削除 コマンドの直後。ただし、ブラックホールレジスタ quote_ が使用されている場合、または setreg() の場合は除く。パターンは "*" でなければなりません。以下の v:event キーを設定します: inclusive operator regcontents regname regtype visual inclusive フラグと '[ および '] マークを組み合わせることで、操作の正確な範囲を計算できます。
非再帰的(イベントは自身をトリガーできません)。テキストを変更できません。textlock User
User 自動的には実行されません。 :doautocmd を使用してこれをトリガーします。通常はプラグインの「カスタムイベント」に使用します。例
:autocmd User MyPlugin echom 'got MyPlugin event'
:doautocmd User MyPlugin
UserGettingBored
UserGettingBored ユーザーが同じキーを42回押したとき。冗談です! :-) VimEnter
VimEnter 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 以上の場合、トリガーされません。 VimLeavePre
VimLeavePre Vim を終了する前、.shada ファイルを書き込む直前。終了時に現在のバッファになるものの名前と一致する場合にのみ、一度だけ実行されます。" * "パターンで使用するのに最も役立ちます。
:autocmd VimLeavePre * call CleanupStuff()
v:dying を使用して異常終了を検出します。 v:exiting を使用して終了コードを取得します。v:dying が 2 以上の場合、トリガーされません。 VimResized
VimResized Vim ウィンドウのサイズが変更された後、つまり 'lines' または 'columns' が変更された後。起動時には発生しません。 VimResume
VimResume Nvim が サスペンド 状態から再開した後。 VimSuspend
VimSuspend Nvim が サスペンド 状態に入る前。 WinClosed
WinClosed ウィンドウを閉じる際に、ウィンドウレイアウトから削除される直前。パターンは ウィンドウID と照合されます。 <amatch><afile> はどちらも ウィンドウID に設定されます。WinLeaveの後。非再帰的(イベントは自身をトリガーできません)。ExitPreQuitPre も参照してください。 WinEnter
WinEnter 別のウィンドウに入った後。Vim が起動したばかりの最初のウィンドウには実行されません。ウィンドウの高さを設定するのに便利です。ウィンドウが別のバッファ用である場合、Vim は WinEnter オートコマンドの後に BufEnter オートコマンドを実行します。 注意: 分割コマンドとタブページコマンドの場合、WinEnter イベントは分割コマンドまたはタブコマンドの後、ファイルが読み込まれる前にトリガーされます。
WinLeave
WinLeave ウィンドウを離れる前。次に移動するウィンドウが別のバッファ用である場合、Vim は WinLeave オートコマンドの前に BufLeave オートコマンドを実行します(ただし、":new" は除く)。Vim を終了する際の ":qa" または ":q" には使用されません。WinClosedの前。 WinNew
WinNew 新しいウィンドウが作成されたとき。Vim が起動したばかりの最初のウィンドウには実行されません。WinEnterの前。
WinScrolled
WinScrolled 現在のタブページ内のウィンドウでテキストがスクロールされた(水平または垂直)か、幅または高さが変更された後。win-scrolled-resized を参照してください。
パターンは、スクロールまたはサイズ変更された最初のウィンドウの ウィンドウID と照合されます。 <amatch><afile> はどちらも ウィンドウID に設定されます。
v:event には、サイズとスクロールの変更に関する情報が設定されます。WinScrolled-event
起動が完了し、最初の画面の再描画が行われた後にのみトリガーが開始されます。最初の WinScrolled または WinResized イベントを定義するときはトリガーされませんが、 المزيدを追加するとトリガーされる場合があります。
非再帰的: WinScrolled イベントのコマンドを実行している間は、イベントはトリガーされません。ただし、コマンドによってウィンドウがスクロールまたはサイズ変更された場合、後で別の WinScrolled イベントがトリガーされます。
WinResized
WinResized 現在のタブページ内のウィンドウの幅または高さが変更された後。win-scrolled-resized を参照してください。
v:event には、サイズの変更に関する情報が設定されます。WinResized-event
パターン、トリガー、および再帰性については、WinScrolled と同じ動作です。

6. パターン autocmd-pattern {aupat}

: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でバッファを削除した後も、バッファは実際にはまだ存在している(リストされていない状態になる)ため、自動コマンドは引き続き実行されます。

7. バッファローカル自動コマンド autocmd-buflocal autocmd-buffer-local

<buffer> <buffer=N> <buffer=abuf> E680
バッファローカル自動コマンドは、特定のバッファに関連付けられています。 バッファに名前がない場合や、名前が特定のパターンと一致しない場合に便利です。 ただし、各バッファに明示的に追加する必要があることも意味します。
パターンの代わりに、バッファローカル自動コマンドは次のいずれかの形式を使用します: <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
存在しないバッファに対してバッファローカル自動コマンドを定義することはできません。

8. グループ autocmd-groups

自動コマンドはグループにまとめることができます。 これは、自動コマンドのグループを削除または実行する場合に便利です。 たとえば、構文の強調表示のすべての自動コマンドは「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

9. 自動コマンドの実行 autocmd-execute

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
無限ループにならないように注意してください。 autocmd-nested
[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」が表示されます。
注意:バッファを削除したり、別のバッファに変更したり、バッファの内容を変更したりする自動コマンドには使用しないでください。 結果は予測できません。 このコマンドは、オプションの設定、強調表示の変更などを行う自動コマンドを対象としています。

10. 自動コマンドの使用 autocmd-use

ファイルの書き込みには、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 にとって便利です。
1つのコマンドに対して autocommand をスキップしたい場合は、:noautocmd コマンド修飾子または 'eventignore' オプションを使用してください。
注意: ファイルを読み込むとき(":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 を参照してください。

11. autocommand の無効化 autocommand の無効化

一定期間 autocommand を無効にするには、'eventignore' オプションを使用します。これは予期しない動作を引き起こす可能性があることに注意してください。:try ブロックと :finally を使用して、後で 'eventignore' を復元してください。
:noautocmd :noa 1つのコマンドに対してのみ autocommand を無効にするには、":noautocmd" コマンド修飾子を使用します。これは、後続のコマンドの実行中に 'eventignore' を "all" に設定します。例:
:noautocmd w fname.gz
これは、gzip プラグインで定義された autocommand をトリガーせずにファイルを書き込みます。
一部の autocommand はすぐにトリガーされるのではなく、後でトリガーされることに注意してください。これは特に CursorMovedTextChanged に当てはまります。
メイン
コマンド索引
クイックリファレンス