Vim の executable() でハマった
Vim の executable() でハマったので覚書。
まぁかなり稀なケースなんですけども。
さて、Vim script の組み込み関数で executable({expr}) という関数があります。
これは『{expr}という名前の実行可能ファイルが存在するかどうか判定する。』ために使用します。
例えば
if executable("ctags") call system("ctags") endif
のように実行ファイルを呼び出す場合に if 文で呼び出せるかどうかをチェックしたりします。
で、この executable() は $PATH と通常のプログラム検索ディレクトリを参照するんですが、Windows の場合は C\:WINDOWS\system32 ディレクトリまで検索を行うようです。
ここで何が問題になるかというと C\:WINDOWS\system32 が $PATH に追加されていない場合でも C\:WINDOWS\system32\ctags.exe が存在していれば executable("ctags") は 1 を返します。
しかし、C\:WINDOWS\system32 は $PATH に追加されていないので cmd.exe 等の shell から ctags.exe 直接呼び出すことはできずにエラーになります。
まとめると executable() は C\:WINDOWS\system32 に実行ファイルが存在していれば、shell から呼び出せなくても 1 を返す、という事。
まぁそもそも C\:WINDOWS\system32 が shell から参照されないという事の方が問題なんですけどもねぇ…。