#️⃣

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

脚注
  1. vimdoc-jaの翻訳をお借りしています ↩︎

  2. 執筆時点ではこの話は書いていませんが、vimrc読書会でよく見る失敗をまとめたvimrcアンチパターンというまとめがあります ↩︎

GitHubで編集を提案

Discussion