【Vim】 autocmd events の BufWrite/BufWritePre の違い
Vim の autocmd events における BufWrite/BufWritePre がどう違うのかを調べた結果、違いはないことがわかった。
vim
2021-10-02
Qiita から移植
この記事は Qiita から移植してきたものです。 元 URL:
https://qiita.com/nsfisis/items/79ab4db8564032de0b25
調査記録
Vim の autocmd events には似通った名前のものがいくつかある。大抵は
:help
に説明があるが、この記事のタイトルにある2つを含めた以下のイベントには、その違いについて説明がない。
BufRead/BufReadPost
BufWrite/BufWritePre
BufAdd/BufCreate
このうち、BufAdd/BufCreate に関しては、:help BufCreate に
The BufCreate event is for historic reasons.
とあり、おそらくは BufAdd
のエイリアスであろうということがわかる。他の2組も同様ではないかと予想されるが、確認のため
vim と neovim のソースコードを調査した。
ソースコードへのリンク
vim
(調査時点での master branch)
neovim
(上に同じ)
vim のソースコード
以下は、autocmd events
の名前と内部で使われている整数値とのマッピングを定義している箇所である。見ての通り、上でエイリアスではないかと述べた3組には、それぞれ同じ内部値が使われている。
https://github.com/vim/vim/blob/8e6be34338f13a6a625f19bcef82019c9adc65f2/src/autocmd.c#L85-L86
https://github.com/vim/vim/blob/8e6be34338f13a6a625f19bcef82019c9adc65f2/src/autocmd.c#L95-L97
https://github.com/vim/vim/blob/8e6be34338f13a6a625f19bcef82019c9adc65f2/src/autocmd.c#L103-L105
neovim のソースコード
neovim の場合でも同様のマッピングが定義されているが、こちらの場合は Lua
で書かれている。以下にある通り、はっきり aliases と書かれている。
https://github.com/neovim/neovim/blob/71d4f5851f068eeb432af34850dddda8cc1c71e3/src/nvim/auevents.lua#L119-L124
ところで、上では取り上げなかった FileEncoding だが、これは
:help FileEncoding にしっかりと書いてある。
*FileEncoding*
まとめ
記事タイトルについて言えば、どちらも変わらないので好きな方を使えばよい。あえて言えば、次のようになるだろう。
BufAdd/BufCreate
→ BufCreate は歴史的な理由により ("for historic reasons") 存在しているため、新しい方 (BufAdd) を使う
BufRead/BufReadPost
→ BufReadPre との対称性のため、あるいは BufWritePost との対称性のため BufReadPost を使う
BufWrite/BufWritePre
→ BufWritePost との対称性のため、あるいは BufReadPre との対称性のため BufWritePre を使う
FileEncoding/EncodingChanged
→ FileEncoding は `Obsolete'' と明言されているので、`EncodingChanged を使う
ところでこの調査で知ったのだが、BufRead と BufWrite
は上にある通り発火するタイミングが「後」と「前」で対称性がない。可能なら
Pre/Post 付きのものを使った方が分かりやすいだろう。