WinEnter、BufEnter、BufRead、Syntax、FileTypeイベントの順序は何ですか?


16

私はautocmd.txtヘルプを試しましたが、これに関する情報は散在しており、常に存在するわけではありません(例:with BufRead)。

これをよく理解している人がこれらのイベントの順序をリストできますか?

WinEnter   
BufEnter (if this window is for a different buffer than the current)

簡単に参照できるように?

(以下の自分のコメントからコピー):それらの個々の説明については話していないが、それは問題ありませんが、それらが互いにどのように相互作用し、どの順序で起こるかについてです。たとえば、WinEnter「VimはWinEnterオートコマンドの後にBufEnterオートコマンドを実行します」、TabEnter「WinEnterをトリガーした後、BufEnterイベントをトリガーする前に」と言うと、このように多くの場所に散らばっています。そして、時にはそれは、例えばのために(すべてでは言及していない。BufReadそれはBufEnter後、または前に実行されるかどうか言及していない- 。多分専門家が情報のいくつかの他の部分からそれを推測することができますが、私はできません
ので、ここに私の意図がにありますこれらのイベントの順序に関する単一の単純な参照を作成します。これらの参照は、専門家以外でもすばやく検索できます。autocmd イベント仕様。


ほとんどの説明は大丈夫だと思いますが、理解できないもののリストを教えてもらえますか?
-nobe4

@ Nobe4私はそれらの個々の説明について話しているのではなく、それは確かに問題ありませんが、それらが互いにどのように相互作用し、どのような順序で起こるかについて話します。たとえば、WinEnter「VimはWinEnterオートコマンドの後にBufEnterオートコマンドを実行します」、TabEnter「WinEnterをトリガーした後、BufEnterイベントをトリガーする前に」と言うと、このように多くの場所に散らばっています。。そして、時にはそれは例えばのための(すべてでは言及していないBufRead、それはBufEnter後、または前に実行されるかどうか言及していない-多分専門家が情報のいくつかの他の部分からそれを推測することができますが、私はできません。
サンダー-復活モニカ

したがって、ここでの私の意図は、autocmdイベント仕様をより正確にするために、これらのイベントの順序に関する単一の単純な参照を作成し、専門家以外の人がすばやく参照できるようにすることです。
スンダ

質問を理解できませんでした。すべてのイベントをログに記録して、表示順序を確認できます(必要に応じて回答できます)
-nobe4

あなたの意図は、実際に(自分自身で)作成するのではなく、そのような単純な参照を提供する人について尋ねることです;)
VanLaser

回答:


11

@sundar回答を完了するには:

ログ機能を使用すると、イベントの順序を簡単に記録できます。

augroup EventLoggin
  autocmd!
  autocmd BufNewFile * call s:Log('BufNewFile')
  autocmd BufReadPre * call s:Log('BufReadPre')
  ...
  autocmd User * call s:Log('User')
augroup END

function! s:Log(eventName) abort
  silent execute '!echo '.a:eventName.' >> log'
endfunction

ここで完全なファイルを参照してください:https : //gist.github.com/nobe4/aa8313fe98ca8821afad

その後tail -f log、リアルタイムのオートコマンドイベントアクティビティを取得できます。


3
このための簡単なプラグインを作成しました。こちらをご覧ください
カールYngveLervåg15年

6
@KarlYngveLervågはプラグインを別のパスに移動していることに注意してください。カールありがとう!
リュックエルミット

気付いてコメントしてくれてありがとう、Luc!(注:デッドリンクを修正するためにコメントを更新することはできません、申し訳ありません!)
カールYngveLervåg16年

10

私はさまざまなキーワードのセットでこれをグーグルで試しましたが、そのような試みの1つで金を打ちました:http : //www.ibm.com/developerworks/library/l-vim-script-5/

具体的には、この部分は現在の質問に関連しています。

たとえば、Vimを起動し、demo.txtという名前のファイルを編集し、挿入モードに切り替え、テキストを入力し、ファイルを保存してから終了すると、Vimセッションはリスト1に示すような一連のイベントを受け取ります。

リスト1.単純なVim編集セッションでのイベントシーケンス

> vim

  1. BufWinEnter(デフォルトウィンドウを作成)
  2. BufEnter(デフォルトのバッファーを作成)
  3. VimEnter(Vimセッションを開始):edit demo.txt
  4. BufNew(demo.txtを含む新しいバッファーを作成します)
  5. BufAdd(その新しいバッファーをセッションのバッファーリストに追加)
  6. BufLeave(デフォルトのバッファーを終了)
  7. BufWinLeave(デフォルトウィンドウを終了)
  8. BufUnload(バッファリストからデフォルトバッファを削除)
  9. BufDelete(デフォルトバッファーの割り当て解除)
  10. BufReadCmd(demo.txtのコンテキストを新しいバッファーに読み込みます)
  11. BufEnter(新しいバッファーをアクティブ化)
  12. BufWinEnter(新しいバッファのウィンドウをアクティブ化)i
  13. InsertEnter(挿入モードにスワップ)

まだ完全に網羅されているわけではありませんが(例:BufReadaka は言及されていませんBufReadPostが、後に来ると思われますBufReadCmd)、素晴らしいスタートです。

しかし、情報の一つの重要な欠落部分はどのようにFileTypeしてSyntaxautocmdこれと対話するイベント(と仮定filetypeし、syntaxすでに上で、新しいファイルそのファイル形式と構文のVimにはよく知られている開いています)。


7
これは、単一のファイルを編集している場合にのみ当てはまります。一般的な考えに反して、autocmd複数のファイルにsを適用する順序は明確に定義されていません。また、単一のファイルであっても、Vimのバージョンによって順序が数回変更されています。これがプラグインの原因となる(そして実際に引き起こす)問題はvim_devで致命的に議論されており、全体的な設計は予測可能な将来に変更されることはありません。包括的な理解を得るために、apply_autocmdsVim 7.4.827のソースには139個のオカレンスがあります。それで頑張ってください。
佐藤桂

@SatoKatsuraこれは私が探していた専門家の意見の一種です、ありがとう!これについてさらに学ぶために提案できる参考資料はありますか(Vimのソースに飛び込むこと以外)?また、これはあなたの興味のある分野から完全に外れているかもしれませんが、「Neovim」ランドで物事がより明確に定義されているかどうかはわかりますか?
スンダ

決定的なリファレンスがわからないのではないでしょうか。 autocmdVimの中sが混乱している、私はそれが実際にはないと思うの可能ないくつかの単純なケースを除いて、決定的なリファレンスを書くこと。誰もが「通常は作品」に落ち着き、そうでない場合は肩をすくめると思います。neovimに関しては、私は個人的にプロジェクトについて複雑な気持ちを持っています。私は最近コードを見ていません。私はあなたが彼らの問題トラッカーで答えを得ることができると思います。
佐藤桂

また、「イベント」という用語自体は、あまりにも固定された順序の考えを覆すはずです。
VanLaser
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.