Open12
VimとNeovimのAutocommandsが実行される順番を調べた
いっつも忘れるのでメモ
調べ方
- Vim/Neovimの起動オプションに
-V9{出力先のファイル名}
をつけて起動 - 出力されたログを調べる
Executing
でgrepすると早い
結果について
どう操作したかも忘れるので、操作もメモする。
Vim/Neovim内でのキー入力はvim>
というプレフィックスを付けて表現することにする。
e.g. ターミナルからVimでREADME.md
を開き、ファイル末尾にhoge
と書き込んで終了するとき
$ vim README.md
vim> Gohoge<ESC>
vim> :q
いやこれ分かりにくくない……?
参考文献
環境
-
jdxcode/mise:2025.3.0
コンテナで、miseからインストールしたVim/Neovim - 両者ともに外部プラグインは一切使用していない
- Vimのバージョン:
9.1.1166
Vimの場合
ファイル名などの引数なしに起動して終了
操作
$ 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 "*"
存在するファイルを指定して起動して終了する
操作
$ 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 "*"
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
did_filetype()
が呼ばれるとfiletype.vim
を読みに行き、その内部でBufRead
でも発火させるのかな……
VimScriptなんもわからん
memo: doau
で自動コマンドを実行できる
存在しないファイルを引数にして終了
操作
$ 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
が実行された
存在する空のファイルを引数にして終了
操作
$ 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 "*"
ファイルが存在する場合と一緒っぽい
色々調べていて気付いたんだけどautocmd
で発火させたいイベントが事前に登録されていないとAutocommandsのログは出ないっぽい?
Vimで調べていたけどメインで使っているのNeovimだし、Neovimだけ調べるでいいかな……(面倒になってきた)