#️⃣
Vimのaugroup名に `#` は使ってはいけない
この記事はVim駅伝の2025-08-18の記事です。
前回の記事はSirasagi62さんのイケてるGo版JSX,templを知っているか!?(feat. neovimでの設定)でした。フロントやってなくて使ったことはないですが面白い見た目だなと思いました。
私は vimrc で使う augroup の一部に vimrc#ddu
みたいな #
区切りを使っていました。これは autoload 関数からの着想です。
単純に augroup として使うだけならこれは上手く行きます。しかし exists()
の help を見ると次のように書いてあります。[1]
#event このイベントに対する自動コマンド定義
#event#pattern このイベントとパターンに対する自動コマ
ンド定義(パターンは文字そのままに解釈
され、自動コマンドのパターンと1文字ず
つ比較される)
#group 自動コマンドグループが存在するか
#group#event このグループとイベントに対して自動コマ
ンドが定義されているか
#group#event#pattern
このグループ、イベント、パターンに対す
る自動コマンド定義
##event このイベントに対する自動コマンドがサ
ポートされているか
これを見ると明らかにパターン区切りと記号が衝突しています。まあ vimrc だし大丈夫かーと思っていたのですが、先日vimrc読書会でOmochiceさんのvimrcを読んでいた際に同じようなタイプの augroup 名を使われてるのを見て、これ大丈夫なのかという話になりました。
駅伝のネタにもなるんじゃない?という話もあり検証してみたら初手でこれはやっちゃだめなパターンだということが分かりました。[2]
具体的には
augroup vimrc#test
autocmd!
autocmd User test echo 42
augroup END
augroup vimrc.test
autocmd!
autocmd User test echo 42
augroup END
echo exists('#vimrc#test')
echo exists('#vimrc.test')
こちらの Vim script の結果が
0
1
となり、両方とも 1(真)を期待したいのですが、明らかに結果が違います。
上のケースは恐らく #event#pattern
ないしは #group#event
として処理されています。
exists()
で使えないので #
は使ってはいけないということがわかりました。いかがでしたか? :q
-
執筆時点ではこの話は書いていませんが、vimrc読書会でよく見る失敗をまとめたvimrcアンチパターンというまとめがあります ↩︎
Discussion