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 ProcessorDisableUNCCheckという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で編集するときの外部コマンドのパスが正しく認識されるようになった。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です