vim-jp / vimdoc-ja / autocmd

autocmd - Vim日本語ドキュメント

メインヘルプファイルに戻る English | 日本語
autocmd.txt   For Vim バージョン 8.0.  Last change: 2017 Jan 14


                  VIMリファレンスマニュアル    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 E937
警告: 自動コマンドは大変強力であるので、思いも寄らない副作用をもたらすことがあ
る。テキストを壊さないように注意しなければならない。
- 捨ててもよいようなファイルのコピーに対して、最初にテストしておくのがよい。例
  えば、ファイルの編集開始時にファイルを解凍する自動コマンドを使うときには、
  書き込みするときに圧縮を行う自動コマンドが正しく働くか確かめること。
- 実行中のエラー (例えばディスクが満杯になる) に対して、対処の準備をしておかな
  ければならない。バッファへの変更に対しては大抵アンドゥができるが、他のファイ
  ルへの変更は、自分で処理しなければならないかもしれない (例えば、解凍されたファ
  イルを圧縮する、等)。
- もしイベント BufRead* の自動コマンドによって圧縮ファイルを編集できるなら、
  FileRead* でも同じ事ができるようにするべきである (こうすることで復旧可能にな
  る場合がたまにある)。可能であれば、イベント File* や Buf* には同じ自動コマン
  ドを使うのはよい考えだ。

==============================================================================
2. 自動コマンドの定義                                   autocmd-define

                                                        :au :autocmd
:au[tocmd] [group] {event} {pat} [nested] {cmd}
                        {pat} autocmd-patterns に一致するファイルで、{event}
                        のときに自動的に実行するコマンドのリストに、{cmd} を加
                        える。
                        {cmd} は常に既存の自動コマンドの後に追加されるので、
                        自動コマンドは指定された順に実行される。 [nested] につ
                        いてはautocmd-nested を参照。

特殊なパターン<buffer>や<buffer=N>はバッファローカルな自動コマンドを定義する。
autocmd-buflocalを参照。

Note: '|' が {cmd} の前にある場合、":autocmd" コマンドの後には別のコマンドを続
けることができる。これは動作する:
        :augroup mine | au! BufRead | augroup END
しかし、これは定義されたコマンドの一部として "augroup" を見る:
        :augroup mine | au BufRead * set tw=70 | augroup END

Note ":autocmd" の引数の中の特別な文字 (例えば "%" や "<cword>" 等) は、
自動コマンドが定義されたときに展開されるのではなく、イベントの発生が認識され、
{cmd} が実行されるときに展開されることに注意せよ。唯一の例外は、"<sfile>" が
自動コマンドが定義されたときに展開されることである。例:

        :au BufNewFile,BufRead *.html so <sfile>:h/html.vim

ここで <sfile> は、この行を含むファイルの名前に展開される。

:autocmd は、すでに存在しているかどうかに関わらず、自動コマンドのリストに
追加する。.vimrc ファイルが2回読み込まれると、自動コマンドが2回表示される。こ
れを避けるには、グループ内に自動コマンドを定義することで、簡単にクリアできる:

        augroup vimrc
          autocmd!      " 「全ての」vimrcの自動コマンドを削除する
          au BufNewFile,BufRead *.html so <sfile>:h/html.vim
        augroup END

もし全ての自動コマンドを消去したくなかったら、代わりに変数を使って
自動コマンドを読み込むのがただ1度だけにすることができる。

        :if !exists("autocommands_loaded")
        :  let autocommands_loaded = 1
        :  au ...
        :endif

引数 [group] が指定されないと、現在のグループが使われる (":augroup" で定義さ
れたもの)。そうでなければ、Vimは [group] で定義されたグループを使う。
Note [group] はあらかじめ定義されていなければならないことに注意。
":au group ..." で新しいグループを定義することはできない。それには ":augroup"
を使うこと。

自動コマンドをテストするとき、オプション 'verbose' が便利かもしれない。
        :set verbose=9
この設定により、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} に関連づけられた「全ての」自動コマンドを除去す
                        る。
                        警告: BufRead や他の一般的なイベントのためのグループ
                        なしでこれを行うべきではない。プラグインや構文のハイラ
                        イトなどを壊すことがある。

: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 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"
のイベントは、ファイル読み込みの前後で両方とも起動される。

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'が変更された後
OptionSet             オプションが設定された後

        起動と終了
VimEnter              全ての起動処理が終わった後
GUIEnter              GUIの起動が成功した後
GUIFailed             GUIの起動が失敗した後
TermResponse          t_RVに対する端末の反応を受け取った後

QuitPre               :quit を使ったとき、本当に閉じるか決定する前
VimLeavePre           Vimを終了する前、viminfoファイルを書き出す前
VimLeave              Vimを終了する前、viminfoファイルを書き出した後

        その他
FileChangedShell      編集を始めた後にファイルが変更されたことを検出したとき
FileChangedShellPost  編集を始めた後にファイルが変更されたことに対処した後
FileChangedRO         読み込み専用ファイルに対して最初に変更を加える前

ShellCmdPost          シェルコマンドを実行した後
ShellFilterPost       シェルコマンドでフィルタをかけた後

CmdUndefined          呼び出そうとしたユーザー定義コマンドが定義されていな
                        かったとき
FuncUndefined         呼び出そうとしたユーザー定義関数が定義されていなかった
                        とき
SpellFileMissing      スペリングファイルを使おうとしたが見つからなかったとき
SourcePre             Vim script を読み込む前
SourceCmd             Vim script を読み込む前 Cmd-event

VimResized            Vimのウィンドウサイズが変わったとき
FocusGained           Vimが入力フォーカスを得たとき
FocusLost             Vimが入力フォーカスを失ったとき
CursorHold            ユーザーが一定時間キーを押さなかったとき
CursorHoldI           挿入モードでユーザーが一定時間キーを押さなかったとき
CursorMoved           ノーマルモードでカーソルが移動したとき
CursorMovedI          挿入モードでカーソルが移動したとき

WinNew                新しいウィンドウを作成した後
TabNew                新しいタブページを作成した後
TabClosed             タブページを閉じた後
WinEnter              別のウィンドウに入った後
WinLeave              ウィンドウから離れる前
TabEnter              別のタブページに入った後
TabLeave              タブページから離れる前
CmdwinEnter           コマンドラインウィンドウに入った後
CmdwinLeave           コマンドラインウィンドウから離れる前

InsertEnter           挿入モードを開始したとき
InsertChange          挿入や置換モードで<Insert>をタイプしたとき
InsertLeave           挿入モードを抜けるとき
InsertCharPre         挿入モードで文字が入力されたとき、その文字が挿入される
                        前

TextChanged           ノーマルモードでテキストが変更された後
TextChangedI          挿入モードでテキストが変更された後

ColorScheme           カラースキームを読み込んだ後

RemoteReply           Vimサーバーからの返答を受け取ったとき

QuickFixCmdPre        QuickFixコマンドを実行する前
QuickFixCmdPost       QuickFixコマンドを実行した後

SessionLoadPost       セッションファイルを読み込んだ後

MenuPopup             ポップアップメニューを表示する直前
CompleteDone          挿入モード補完が完了したとき

User                  ":doautocmd"との組合せで使われる

自動コマンドイベントのアルファベット順リスト:           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"
                                には「動作しない」。ファイルが存在しないときも
                                使えない。またファイルの復旧に成功したときにも
                                使われる。
                                また、":filetype detect" を実行したとき、ある
                                いは無名バッファを保存してバッファに名前がつい
                                たとき、filetypedetect グループを対象として発
                                行される。
                                                        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 によるコマンドをアンドゥする役目を
                                果たす)。
                                                        CmdUndefined
CmdUndefined                    ユーザー定義コマンドが使われたが、定義されてい
                                なかったとき。必要なときのみコマンドを定義する
                                のに便利である。パターンはコマンド名に対して照
                                合される。<amatch> と <afile> の両方ともコマン
                                ド名に設定される。
                                NOTE: 未定義のコマンドに対して自動補完は機能し
                                ない。このイベントを使う代わりにユーザー定義コ
                                マンドを常に定義するようにしてそのコマンドから
                                autoload 関数を呼び出すようにするという方法も
                                ある。autoload 参照。
                                                        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
                                パターンはカラースキーム名にマッチする。
                                <afile> はこのオプションを設定したファイルの名
                                前になる。<amatch> はカラースキーム名になる。

                                                        CompleteDone
CompleteDone                    挿入モード補完が完了したとき。補完が実行されて
                                も中止されても発行される。 ins-completion
                                変数 v:completed_item には補完された候補につい
                                ての情報が含まれている。

                                                        CursorHold
CursorHold                      'updatetime' の時間の間、ユーザーがキーを押さ
                                なかったとき。ユーザーが何かキーを押すまで、再
                                び発生することはない (例えば、もしあなたがコー
                                ヒーを入れるためにVimの前を離れても、その間の
                                'updatetime' ミリ秒ごと発生することはない :-)。
                                タグをプレビューするためには、
                                CursorHold-example を参照。
                                このイベントはノーマルモードのときのみ呼ばれる。
                                コマンドの引数の入力待ち状態、またはオペレータ
                                の後の移動コマンド入力待ち状態のときは発生しな
                                い。
                                レコーディングの最中にはCursorHoldイベントは発
                                生しない。q
                                                        <CursorHold>
                                この自動コマンドは内部的に <CursorHold> キーが
                                引き金になっている。式による指定のマッピング内
                                では getchar() によってこの文字が取得されるこ
                                とがある。

                                Note: このイベントには対話的なコマンドは使えな
                                いことに注意。「続けるには」プロンプトは現れず、
                                スクリーンは必要に応じて直接更新される。
                                Note: 近いうちに、発生するまでの時間を設定する
                                別のオプションができるだろう。
                                ヒント: ステータスラインの更新を強制的に行うに
                                は、これを使うこと:
                                        :let &ro = &ro
                                {VimのAmiga版、Unix版、Win32版、MSDOS版および
                                全てのGUI 版でのみ有効}
                                                        CursorHoldI
CursorHoldI                     CursorHoldと同様だが、挿入モードのとき発生す
                                る。例えば別のキーを待っているとき、例えば
                                CTRL-V の後で、CTRL-X モード insert_expand
                                ではないときにはトリガーされない。
                                                        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
                                ここで他のバッファに変更をしてはならない。バッ
                                ファを再読み込みするとはよいが、他のバッファを
                                編集してはならない。
                                                        E881
                                行数が変化した場合 undo のための保存は失敗し、
                                その変更は中止されるだろう。
                                                        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> の両方とも関数名に設定され
                                る。
                                NOTE: Vim script を書くときには autoload 関数
                                を使う方がよい。
                                autoload-functionsを参照。
                                                        GUIEnter
GUIEnter                        GUI の開始に成功し、ウィンドウを開いた後。
                                gvim を使ったときは、VimEnter の前に発生する。
                                ファイル .gvimrc からウィンドウの配置場所を設
                                定するために使うことができる。
        :autocmd GUIEnter * winpos 100 50
                                                        GUIFailed
GUIFailed                       GUIの開始に失敗した後。可能ならば、Vimはターミ
                                ナル内で実行を継続する(Unix系のみ。Xサーバーへ
                                接続が失敗したとき)。ここでVimを終了させるには、
                                次のようにする:
        :autocmd GUIFailed * qall
                                                        InsertChange
InsertChange                    挿入・置換モードで <Insert> をタイプしたとき。
                                変数 v:insertmode が新しいモードを示す。
                                カーソルを移動したりなどユーザーが予期しないこ
                                とは行わないように注意。
                                                        InsertCharPre
InsertCharPre                   挿入モードで文字が入力されたとき、その文字が挿
                                入される前。v:char 変数に入力された文字が
                                入っている。イベント内でそれを変更することで実
                                際に挿入される文字を変更できる。v:char に 2
                                つ以上の文字を入れた場合はそのテキストはそのま
                                ま (literally) 挿入される。
                                テキストを変更することはできない textlock
                                このイベントは 'paste' がオンに設定されている
                                ときは発行されない。
                                                        InsertEnter
InsertEnter                     挿入モード・置換モード・仮想置換モードを開始す
                                る直前。変数v:insertmodeがモードを示す。
                                ユーザーが予期しないことは行わないように注意。
                                カーソルはコマンド実行後に復元される。復元され
                                たくない場合は v:char に非空文字を設定する。
                                                        InsertLeave
InsertLeave                     挿入モードを抜けるとき。CTRL-O i_CTRL-O を
                                使ったときにも発生する。i_CTRL-C のときは発
                                生しない。
                                                        MenuPopup
MenuPopup                       (マウス右ボタンで)ポップアップメニューを表示す
                                る直前。カーソル下やマウスポインタの下にあるも
                                のによってメニューを調整するのに便利。
                                パターンにはモードを表す文字を記述する:
                                        n       ノーマル
                                        v       ビジュアル
                                        o       オペレータ実行待ち
                                        i       挿入
                                        c       コマンドライン
                                                        OptionSet
OptionSet                       オプションが設定された後。パターンは長い(短縮
                                しない)オプション名に対してマッチする。
                                変数 v:option_old に変更前の値が格納され、
                                v:option_new には新しく設定された値が格納さ
                                れ、 v:option_type にはオプションの変更のス
                                コープがグローバルかローカルかが格納される。
                                <amatch> は対象のオプション名が設定される。

                                'key' の変更の際にはあえてイベントが発生しない
                                ようにしている。

                                使用例: 'backupdir' や 'undodir' で指定された
                                ディレクトリが存在しているかチェックし、もしな
                                ければディレクトリを作成する。

                                Note: この自動コマンド中でオプションの値をリセ
                                ットするのは、プラグインの挙動を破壊するため、
                                良くない。この自動コマンドの実行は :noa を使
                                うことで抑制することができる。
                                                        QuickFixCmdPre
QuickFixCmdPre                  QuickFixコマンドが実行される前 (:make,
                                :lmake:grep:lgrep:grepadd,
                                :lgrepadd:vimgrep:lvimgrep,
                                :vimgrepadd:lvimgrepadd:cscope,
                                :cfile:cgetfile:caddfile:lfile,
                                :lgetfile:laddfile:helpgrep,
                                :lhelpgrep:cexpr:cgetexpr,
                                :caddexpr:cbuffer:cgetbuffer,
                                :caddbuffer)。
                                パターンには実行されるコマンドを記述する。
                                :grep が書かれていると、'grepprg' が
                                "internal" にセットされていても実行される。
                                このコマンドを使って変数 'makeprg' と
                                'grepprg' を設定することはできない。
                                このコマンドでエラーになるとQuickFixコマンドは
                                実行されない。
                                                        QuickFixCmdPost
QuickFixCmdPost                 QuickFixCmdPreと同様だが、QuickFixコマンドが実
                                行された後、最初の位置にジャンプする前に発生す
                                る。:cfile コマンドと :lfile コマンドの場
                                合はイベントはエラーファイルを読み込んだ後、最
                                初のエラーに移動する前に実行される。
                                QuickFixCmdPost-example を参照。
                                                        QuitPre
QuitPre                         :quit:wq:qall を使ったとき、カレント
                                ウィンドウを閉じるのか、Vim を終了するのかを決
                                定する前に発行される。例えば、普通のウィンドウ
                                がカレントウィンドウだけだったときに、他の余分
                                なウィンドウを閉じることができる。
                                                        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 script を読み込む前。:source
                                <afile> は読み込まれるファイルの名前となる。
                                                        SourceCmd
SourceCmd                       Vim script を読み込むとき。: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 を参照。
                                                        TabClosed
TabClosed                       タブページを閉じた後。
                                                        TabEnter
TabEnter                        タブページに入った直後 tab-page。WinEnterが
                                発生した後、BufEnterが発生する前。
                                                        TabLeave
TabLeave                        タブページを離れる直前 tab-page。最初に
                                WinLeaveが発生する。
                                                        TabNew
TabNew                          タブページが作成されたとき。 tab-page
                                WinEnter イベントが最初にトリガーされ、
                                TabEnter が実行される。
                                                        TermChanged
TermChanged                     オプション 'term' を変更した後。色やフォント等、
                                ターミナル依存の設定を更新するために構文定義ファ
                                イルを再読み込みするのに便利である。読み込まれ
                                たバッファ全てで発生する。
                                                        TermResponse
TermResponse                    t_RV に対する応答をターミナルから受け取った
                                とき。Vim変数 v:termresponse の値を使って、
                                ターミナルのバージョンに応じた処理ができる。
                                Note: このイベントは他のイベントの処理中にも発
                                行されることがある。特に、ファイル入出力、シェ
                                ルコマンドの実行、時間の掛かる処理など。
                                                        TextChanged
TextChanged                     ノーマルモードでカレントバッファのテキストが変
                                更されたとき。つまり b:changedtick が更新さ
                                れるとき。
                                未処理のキー入力がまだあるとき、またはオペレー
                                タを待機しているときは、発生しない。
                                注意: このイベントは頻繁に発生するので、ユー
                                ザーが予期しないことや時間のかかる処理は行わな
                                いこと。
                                                        TextChangedI
TextChangedI                    挿入モードでカレントバッファのテキストが変更さ
                                れたとき。
                                ポップアップメニューが表示されているときは発生
                                しない。
                                他は TextChanged と同じ。
                                                        User
User                            自動的に実行されることはない。コマンド
                                ":doautocmd" によってのみ実行される
                                自動コマンドのために使用される。
                                                        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 を終了する前で、ファイル .viminfo を書き込
                                んだ後。VimLeavePre のように、ただ1度だけ実行
                                される。
                                異常終了の検出には v:dying を使うこと。
                                終了時に v:dying が 2 以上のときはこのイベント
                                は発生しない。
                                                        VimLeavePre
VimLeavePre                     Vim を終了する前で、ファイル .viminfo を書き込
                                む直前。これは終了時にたまたまカレントバッファ
                                になったバッファの名前とマッチしたときに、ただ
                                1度だけ実行される。大抵、パターンには "*" を使
                                うと便利である。
        :autocmd VimLeavePre * call CleanupStuff()
                                異常終了の検出には 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を終了するときには発生しない。
                                                        WinNew
WinNew                          新しいウィンドウが作成されたとき。Vim がちょう
                                ど開始したとき、最初のウィンドウのためには行わ
                                れない。WinEnter イベントの前。

==============================================================================
6. パターン                                     autocmd-patterns {pat}

引数 {pat} にはコンマ区切りのリストを指定することができる。これによりコマンドは
指定されたそれぞれのパターンについて実行される。例えばこのコマンド:
        :autocmd BufRead *.txt,*.info set et
は下記と等しくなる:
        :autocmd BufRead *.txt set et
        :autocmd BufRead *.info set et

ファイルパターン {pat} がファイル名とマッチするかどうかは、2通りの方法で調べら
れる。
1. パターンに '/' が含まれないとき: Vimはファイル名の後ろの部分からのみマッチ
   を調べる (ファイル名の前につくディレクトリパスは除く)。
2. パターンに '/' が含まれるとき: Vimは短いファイル名 (ユーザーが打ち込んだも
   の) と長いファイル名 (短いファイル名をフルパスに展開し、シンボリックリンク
   ならその実体を探したもの) との両方から一致を調べる。

例:
        :autocmd BufRead *.txt          set et
全てのテキストファイルに対しオプション 'expandtab' をオンにする。

        :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" の編集を始めたとき、この自動コマンドは実行される。

Note: パスの途中だけにマッチさせ、ルートディレクトリにマッチさせたくないとき
は、最初の1文字目に '*' を使う。例:
        :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 ~/.vimrc   so ~/.vimrc
        :autocmd BufRead ~archive/*      set readonly
環境変数は、自動コマンドが定義されるときに展開される。自動コマンドが実行される
ときではない。これは command とは違っている!

                                                        file-pattern
パターンの解釈方法は、ファイル名の解釈方法と大体同じである。
        *       はあらゆる文字の列にマッチ。注意: パス区切り文字も含まれる。
        ?       はあらゆる1文字にマッチ
        \?      は '?' にマッチ
        .       は '.' にマッチ
        ~       は '~' にマッチ
        ,       はパターンを分割する
        \,      は ',' にマッチ
        { }     は pattern の \( \) と同様
        ,       ('{' '}' の内側では) pattern の \| と同様
        \}      リテラルの }
        \{      リテラルの {
        \\\{n,m\}  pattern の \{n,m} と同様
        \       は pattern で使われるものと同様の特別な意味を持つ
        [ch]    は 'c' または 'h' にマッチ
        [^ch]   は 'c' と 'h' 以外の文字にマッチ

'/' という文字は、全てのシステムでパスの区切り文字に使われることに注意すること
(MS-DOSとOS/2でさえも)。これは、パターン内でバックスラッシュを使うことが難しい
上に、別々のシステムでも自動コマンドが動作するようにするためである。

pattern を使うことができる。上記の翻訳が行われているため、期待通りに機能しな
い可能性がある。

                                                        autocmd-changes
パターンマッチの検索は、イベントの発生時に行われる。自動コマンドのどれかでバッ
ファ名を変更しても、それどころかバッファを削除しても、実行される 自動コマンド
は変わらない。例:

        au BufEnter *.foo  bdel
        au BufEnter *.foo  set modified

これはカレントバッファを削除し、代わりにカレントバッファになったバッファ内でオ
プション '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 CursorHold <buffer>  echo 'hold'
    :au CursorHold <buffer=33>  echo 'hold'
    :au BufNewFile * au CursorHold <buffer=abuf>  echo 'hold'

自動コマンドに対するコマンドは全てバッファローカルな自動コマンドに対しても機能
する。パターンの代わりに特別な文字列を使う。例:
    :au! * <buffer>                  " カレントバッファのバッファローカル自動
                                     " コマンドを削除する
    :au! * <buffer=33>               " バッファ#33のバッファローカル自動コマン
                                     " ドを削除する。
    :bufdo :au! CursorHold <buffer>  " 全バッファから指定されたイベントに対す
                                     " る自動コマンドを削除する
    :au * <buffer>                   " カレントバッファのバッファローカル自動
                                     " コマンドをリストする

カレントバッファに対して自動コマンドを定義するとき、それがバッファ番号とともに
保存されることに注意。つまりカレントバッファ番号が12なら"<buffer=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" で実行できる。

特定のグループが選択されないとき、既定のグループが使われる。既定のグループには
名前がない。既定のグループから個別に自動コマンドを実行することはできない。そ
れらを実行できるのは、全てのグループに対する自動コマンドを実行するときのみで
ある。

普通、自動コマンドを自動的に実行するときは、全てのグループに対する 自動コマン
ドが使われる。グループが問題になってくるのは、":doautocmd" や ":doautoall" に
よって自動コマンドを実行するときと、自動コマンドを定義したり削除するときであ
る。

グループ名には空白を除く全ての文字が使える。"end" というグループ名は予約語になっ
ている (大文字も)。

グループ名では大文字と小文字を区別して扱う。イベントの名前とは違うことに注意す
ること。

                                                        :aug :augroup
:aug[roup] {name}               後に続くコマンド ":autocmd" のためのグループ名
                                を定義する。{name} を "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

これで自動コマンドを (例えばファイル .vimrc を再び読み込んだ後) 2回定義するこ
とが防げる。

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

自動コマンドは「自動的」でなくとも実行できる。これはあなたが自動コマンドを変
更したときや、間違った自動コマンドが実行されたとき (つまりファイルパターンの
マッチングが間違っていたとき) に便利である。

NOTE オプション 'eventignore' はここにも適用されることに注意。ここに列挙された
イベントでは、どんな自動コマンドも実行されない。

                                        :do :doau :doautocmd E217
:do[autocmd] [<nomodeline>[group] {event} [fname]
                        [fname] (省略するとカレントファイルの名前) にマッチす
                        る、{event} のための自動コマンドをカレントバッファに
                        適用する。カレントファイル名が正しいファイルパターンに
                        マッチしないときや設定を変えた後、またはあるイベントの
                        ために自動コマンドを実行するために使用できる。
                        これを自動コマンドの内部で実行することも可能である。
                        だから、ある拡張子用の自動コマンドを元にして別の拡張
                        子用のものを作ることができる。例:
                                :au BufEnter *.cpp so ~/.vimrc_cpp
                                :au BufEnter *.cpp doau BufEnter x.c
                        無限の循環に陥らないよう注意すること。また
                        autocmd-nested を参照すること。

                        引数 [group] が省かれると、全てのグループの自動コマン
                        ドが実行される。[group] が指定されると、それにマッチす
                        るグループの自動コマンドのみが実行される。NOTE 定義さ
                        れていないグループ名を使うと、エラーメッセージが表示さ
                        れる。
                                                        <nomodeline>
                        自動コマンドを適用した後にモードラインが処理される。
                        ファイルを編集するときと同じように、自動コマンドでなさ
                        れた設定を上書きするためである。<nomodeline> が指定さ
                        れている場合はモードラインは処理されない。バッファの
                        ロード以外で使われるイベント (例えば User) などは
                        <nomodeline> を指定したほうがよいかもしれない。
                        一致する自動コマンドが実行されなかった場合も、モードラ
                        インの処理はスキップされる。

                                                :doautoa :doautoall
:doautoa[ll] [<nomodeline>[group] {event} [fname]
                        ":doautocmd" と似ているが、読み込まれたバッファそれぞ
                        れに自動コマンドを適用する。[fname]は自動コマンドを選
                        択するのに使われる。コマンドを適用するバッファではな
                        い。{訳注: :autocmd{pat}に使う?}
                        Note: このコマンドで、バッファを削除したり、バッファを
                        変えたり、バッファの内容を変えるような自動コマンドを
                        実行しないこと。結果は予期できない。このコマンドは、オ
                        プションを設定したり、構文強調表示を変えたりする
                        自動コマンドのためのものである。

==============================================================================
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
圧縮されたファイルを読み書きする例:
  :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" は、":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" を使うこと。例:
        :autocmd FileChangedShell *.c nested e!
再帰的ループを避けるために、ネストは10段階までに制限されている。

自動コマンドの中でコマンド ":au" を使うこともできる。これは自己修正的 {訳注:
原文 "self-modifying"} なコマンドになりうる! これは1回だけ実行すべき
自動コマンドに便利である。

あるコマンドを実行するときだけ自動コマンドをスキップしたい場合は、修飾子
:noautocmdを使うかオプション'eventignore'を使う。

Note (":read file" やフィルタコマンドで) 読み込んだファイルの最後の行に <EOL>
がないとき、Vimはこのことを記憶する。その次の (":write file" やフィルタコマン
ドでの) 書き込みで、先ほどの最後の行が再び最後の行として書き込まれ、かつオプショ
ン 'binary' がオンになっていると、<EOL> は付け足されない。これにより、読み込ま
れた行に対するフィルタコマンドで、読み込まれた通りに書き出すことができる。また、
フィルタ処理された行に対する書き込みのコマンドで、フィルタが出力した通りに書き
出すことができる。例えば、圧縮されたファイルを書き込むもう一つの例は以下のよう
になる。

  :autocmd FileWritePre *.gz   set bin|'[,']!gzip
  :autocmd FileWritePost *.gz  undo|set nobin

                                                        autocommand-pattern
コンマで区切られた複数のパターンを指定することもできる。以下にいくつか例を挙げ
る。

  :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;" がないと、検索が始まる場所はファイルの最初ではなく、ファイルの挿入さ
れた場所になる。

                                                skeleton template
新しいファイルを作るときにスケルトン (テンプレート) ファイルを読み込むにはこう
する。

  autocmd BufNewFile  *.c       0r ~/vim/skeleton.c
  autocmd BufNewFile  *.h       0r ~/vim/skeleton.h
  autocmd BufNewFile  *.java    0r ~/vim/skeleton.java

HTMLファイルを書き込むときに現在の日付と時刻を挿入したいならこうする {訳注:
KoRoN氏作成のautodate.vimを使った方がよい}

  :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' に設定する
        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" にセッ
トする。例:

        :noautocmd w fname.gz

これはgzipプラグインで定義された自動コマンドを発生させずにファイルを書き込む。


 vim:tw=78:ts=8:ft=help:norl: