Open12

VimとNeovimのAutocommandsが実行される順番を調べた

mitsumitsu

いっつも忘れるのでメモ

調べ方

  1. Vim/Neovimの起動オプションに-V9{出力先のファイル名}をつけて起動
  2. 出力されたログを調べる
    Executingでgrepすると早い

結果について

どう操作したかも忘れるので、操作もメモする。
Vim/Neovim内でのキー入力はvim> というプレフィックスを付けて表現することにする。

e.g. ターミナルからVimでREADME.mdを開き、ファイル末尾にhogeと書き込んで終了するとき

$ vim README.md
vim> Gohoge<ESC>
vim> :q

いやこれ分かりにくくない……?

参考文献

Vimでトラブルが起きた時にはログを取ろう | TINT

環境

  • jdxcode/mise:2025.3.0コンテナで、miseからインストールしたVim/Neovim
  • 両者ともに外部プラグインは一切使用していない
  • Vimのバージョン: 9.1.1166
mitsumitsu

ファイル名などの引数なしに起動して終了

操作

$ vim
vim> :q

実行されるAutocommands

Executing FileType Autocommands for "*"
Executing BufWinEnter Autocommands for "*"
Executing BufEnter Autocommands for "*"
Executing VimEnter Autocommands for "*"
Executing CursorMoved Autocommands for "*"
Executing SafeState Autocommands for "*"
Executing TermResponse Autocommands for "*"
mitsumitsu

存在するファイルを指定して起動して終了する

操作

$ vim file
vim> :q

実行されるAutocommands

Executing FileType Autocommands for "*"
Executing BufRead Autocommands for "*"
Executing BufRead Autocommands for "*"
Executing BufRead Autocommands for "*"
Executing BufWinEnter Autocommands for "*"
Executing BufEnter Autocommands for "*"
Executing VimEnter Autocommands for "*"
Executing CursorMoved Autocommands for "*"
Executing SafeState Autocommands for "*"
Executing TermResponse Autocommands for "*"
mitsumitsu

BufReadが3回も呼ばれているのが気になる。

ログ見るとこんな感じ。scripts.vimを呼び出すとdid_filetypeが呼ばれるっぽい

   139  Executing BufRead Autocommands for "*"
   140  autocommand if !did_filetype() && expand("<amatch>") !~ g:ft_ignore_pat | runtime! scripts.vim | endif
   141
   142  chdir(/mise/installs/vim/9.1.1166/share/vim/vim91)
   143  fchdir() to previous dir
   144  line 0: sourcing "/mise/installs/vim/9.1.1166/share/vim/vim91/scripts.vim"
   145  chdir(/mise/installs/vim/9.1.1166/share/vim/vim91/autoload/dist)
   146  fchdir() to previous dir
   147  line 27: sourcing "/mise/installs/vim/9.1.1166/share/vim/vim91/autoload/dist/script.vim"
   148  finished sourcing /mise/installs/vim/9.1.1166/share/vim/vim91/autoload/dist/script.vim
   149  continuing in /mise/installs/vim/9.1.1166/share/vim/vim91/scripts.vim
   150  finished sourcing /mise/installs/vim/9.1.1166/share/vim/vim91/scripts.vim
   151  continuing in BufRead Autocommands for "*"
   152  Executing BufRead Autocommands for "*"
   153  autocommand if !did_filetype() && expand("<amatch>") !~ g:ft_ignore_pat    && (expand("<amatch>") =~# '\.conf$'^I|| getline(1) =~ '^#' || getline(2) =~ '^#'^I|| getline(3) =~ '^#' || getline(4) =~ '^#'^I|| getline(5) =~ '^#') |   setf FALLBACK conf | endif
   154
   155  Executing BufRead Autocommands for "*"
   156  autocommand let line = line("'\"") | if line >= 1 && line <= line("$") && &filetype !~# 'commit'      && index(['xxd', 'gitrebase', 'tutor'], &filetype) == -1 |   execute "normal! g`\"" | endif
mitsumitsu

存在しないファイルを引数にして終了

操作

$ vim -V9log no-file
vim> :q

実行されるAutocommands

Executing FileType Autocommands for "*"
Executing BufNewFile Autocommands for "*"
Executing BufNewFile Autocommands for "*"
Executing BufWinEnter Autocommands for "*"
Executing BufEnter Autocommands for "*"
Executing VimEnter Autocommands for "*"
Executing CursorMoved Autocommands for "*"
Executing SafeState Autocommands for "*"
Executing TermResponse Autocommands for "*"

BufReadFileの代わりにBufNewFileが実行された

mitsumitsu

存在する空のファイルを引数にして終了

操作

$ vim -V9log exist-file
vim> :q

実行されるAutocommands

Executing FileType Autocommands for "*"
Executing BufRead Autocommands for "*"
Executing BufRead Autocommands for "*"
Executing BufRead Autocommands for "*"
Executing BufWinEnter Autocommands for "*"
Executing BufEnter Autocommands for "*"
Executing VimEnter Autocommands for "*"
Executing CursorMoved Autocommands for "*"
Executing SafeState Autocommands for "*"
Executing TermResponse Autocommands for "*"
mitsumitsu

色々調べていて気付いたんだけどautocmdで発火させたいイベントが事前に登録されていないとAutocommandsのログは出ないっぽい?

mitsumitsu

Vimで調べていたけどメインで使っているのNeovimだし、Neovimだけ調べるでいいかな……(面倒になってきた)