How to execute external command in Vim on Windows network directory
Windowsのネットワークディレクトリ上で,Vimから外部コマンドを実行する方法を記す。
Introduction
仕事ではWindowsのPCを使っている。複数人で作業をしている場合,ネットワークディレクトリ上のソースコードなどのファイルを直接編集することがある。
ネットワークディレクトリ上のファイルをGVimで開いた状態で,:lgrep
などのVimの外部grepのように,VimからWindowsの外部コマンドを実行したいことがよくある。しかし,そのまま実行すると勝手にC:\Windows
でコマンドが実行されてしまう。
例えば,ネットワークディレクトリの\\VBOXSVR\Windows10
の任意のファイルをVimで開いて,:!dir
コマンドを実行すると以下のメッセージが表示されてしまい,\\VBOXSVR\Windows10
とは異なるC:\Windows
の中身が一覧されてしまう。
cmd /c dir
'\\VBOXSVR\Windows10'
上記の現在のディレクトリで CMD.EXE を開始しました。 UNC パスはサポートされません。Windows ディレクトリを既定で使用します。
Vimでgrepする場合であれば,Vimの内部grep(:vimgrep
)コマンドを使えば実現はできる。しかし,:vimgrep
だと動作が遅く,他のWindowsコマンドが実行できないという根本的な問題が解決していない。
そこで,Windowsのネットワークディレクトリ上でコマンドを実行する方法を調べた。
Method
以下のページの情報に従えば解決した。
参考:コマンドプロンプトで「CMD では UNC パスは現在のディレクトリとしてサポートされません
レジストリーを設定して,ネットワークディレクトリ上でコマンドを実行するときのチェックを無効化すればよい。
具体的には,レジストリーエディター(regedit
コマンド)を実行して,\HKEY_CURRENT_USER\Software\Microsoft\Command Processor
にDisableUNCCheck
というDWORD値を作成し値に1をセットする。
なお,このレジストリーの登録は以下のコマンドでも行える。
reg add "HKCU\Software\Microsoft\Command Processor" /v DisableUNCCheck /t REG_DWORD /d 1
登録できたかどうかは,以下のコマンドで確認できる。
reg query "HKCU\Software\Microsoft\Command Processor" /s
CompletionChar REG_DWORD 0x9 DefaultColor REG_DWORD 0x0 EnableExtensions REG_DWORD 0x1 PathCompletionChar REG_DWORD 0x9 DisableUNCCheck REG_DWORD 0x1
削除するときは以下のコマンドで行える。
reg delete "HKCU\Software\Microsoft\Command Processor" /v DisableUNCCheck /f
これで、ネットワークパス上のコマンドで、UNCパスが利用できるようになる。PCの再ログインや再起動は不要で,値を設定・削除すれば即座に反映される。なお,HKEY_LOCAL_MACHINE
で設定すれば、PC全体の設定となる。
この設定により,ネットワークディレクトリ上のファイルをVimで編集するときの外部コマンドのパスが正しく認識されるようになった。