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 から参照されないという事の方が問題なんですけどもねぇ…。