Vim プラグインを書く際、使用する変数は可能な限りスクリプトローカルを使い、グローバル変数はプラグインの設定のみに使用するのが望ましい。スコープをなるべく小さくするした方が良いと言うのはVimスクリプトに限った話ではないだろう。
が、Vimスクリプトのカオスな仕様の宿命なのか、守られていないプラグインもちらほら。
そんなに神経質になることもないんだろうけど、残念ながら私は神経質だったので、今回は私が普段使用している環境の中で見つけた明らかにミスったと思われるグローバル変数を晒してみることにする。
グローバル変数一覧の見方
その前に一応グローバル変数の一覧の出し方から。
:echo join(sort(keys(g:)), "\n")
これで見れる。恐らく大量にあるので、空のバッファで
:put =join(sort(keys(g:)), \"\n\")
とでもやればゆっくり見られるよ。
cpo_save
これもアレ。もしかしたら古いVimの名残り?とも思ったけど、最終更新が2008とかになってるし。
m
- plugin/fuzzyfinder.vim
以下の部分。
augroup FuzzyfinderGlobal autocmd! autocmd BufEnter * for m in s:GetAvailableModes() | call m.extend_options() | call m.on_buf_enter() | endfor autocmd BufWritePost * for m in s:GetAvailableModes() | call m.extend_options() | call m.on_buf_write_post() | endfor augroup END
for の変数は意外とやりがち。トップレベルに書くとちゃっかりグローバル変数が使われる。この場合s:mを使っておけば問題なし。
これの下に定義してある :FuzzyFinderRemoveCache のforも同様。
user_options
- plugin/fuzzyfinder.vim
これにだけ g: が付いていないところを見ると、スクリプトローカルのつもりで書いたっぽい。
確か、昔の fuzzyfinder.vim は初期化を専用関数内でやっていたので、その頃の名残りが出てしまったと思われる。
st et cd
- after/ftplugin/*_snippets.vim
3つともsnippetsEmu.vim が各ファイルタイプに対するデフォルトの設定を行うために配置するファイル内で使用されている。
ちなみに元々ある g:snip_start_tag g:snip_end_tag g:snip_elem_delim の短縮形として使われている模様。
気持ちはわかるが s: を使ってくれ。
*1::verbose set option?