概説
VimのNERD Treeプラグインって便利ですよね。
エクスプローラーライクに使えるので、非常に気に入っているのですが、Windowsの環境ではmキー押下時に表示されるメニューの「ファイルコピー」の操作が「一手間」かけないと正しく動作しません。
どうやらこれは以前からある既知の問題のようですね。
ここでは、Windows環境のgVim7.3(Kaoriya版)で、NERD Treeプラグインのファイルコピーを正しく動作させる方法を示します。
まず、何も対処をせずに「mキー」を押してみる
通常、Macの環境などでNERD Treeを実行し、「mキー」を押下すると「(c)opy the current node」というメニューが表示されますが、以下のようにメニューが表示されません。
NERDTreeMenu.Usej/k/enterandtheshortcutsindicated==========================================================>(a)ddachildnode(m)ovethecurrentnode(d)eletethecurrentnode
ファイルコピーのメニューを表示させるには?
「:e $MYVIMRC」などで「_vimrc」を編集し、以下の内容を追記します。
「-r」の後ろにスペース1文字分が入っているので、注意して下さい。
letg:NERDTreeCopyCmd='cp -r '
もう一度「mキー」を押してみる
今度は「(c)opy the current node」が表示されました。
NERDTreeMenu.Usej/k/enterandtheshortcutsindicated==========================================================>(a)ddachildnode(m)ovethecurrentnode(d)eletethecurrentnode(c)opythecurrentnode
喜ぶのはちょっと早い
ファイルコピーのメニューが表示されたのでコピーができるかと思いきや、いざ実行してみると、以下のように表示され、コピーが正常に行われません。
NERDTree:Couldnotcopynode
なぜファイルコピーができないのか?
Windowsのコピーコマンドは*nixのcpとは異なり、ファイルコピーの場合はcopy、ディレクトリコピーの場合はxcopyを使用します。
上記の設定では「'cp -r '」のように指定しているため、当然このままでは動きません。これについては、ブログで詳しく言及されている方がいるので、そちらをご覧ください。
cpコマンドを取得してくる
このissueでは、msysGit(Git for Windows)をインストールしているのであれば、msysGitのディレクトリ(例:C:\Program Files (x86)\Git\bin)から「cp.exe」と「msys-1.0.dll」をコピーしてきて、gVimのbinディレクトリ配下にコピーせよと記載がありますので、その通りに行います。
gVimのバージョンによってはbinディレクトリが存在しない場合もあるので、その場合はgVimのディレクトリの直下にコピーします。
もし、msysGitではなく、Gow(GNU on Windows)をインストールしている場合は、Gowのディレクトリ(例:C:\Program Files (x86)\Gow\bin)から「cp.exe」をコピーしてくることでもOKです。この場合、「msys-1.0.dll」のコピーは不要です。
NERD Treeプラグインの修正
NERD Treeプラグインのファイルコピーを行っている処理、具体的には「g:NERDTreeCopyCmd」との記載がある部分を修正します。
NERD Treeプラグインのバージョンによって、上記の処理が「nerdtree\plugin\NERD_tree.vim」もしくは「nerdtree\lib\nerdtree\path.vim」に記載されています。
NERD_tree.vimに記載がある場合
letdest=s:Path.WinToUnixPath(a:dest)letcmd=g:NERDTreeCopyCmd." ".escape(self.str(),s:escape_chars)." ".escape(dest,s:escape_chars)
letdest=a:destletcmd=0ifs:running_windowsletcmd=g:NERDTreeCopyCmd.'"'.self.str().'" "'.dest.'"'elseletcmd=g:NERDTreeCopyCmd." ".escape(self.str(),s:escape_chars)." ".escape(dest,s:escape_chars)endif
path.vimに記載がある場合
letdest=s:Path.WinToUnixPath(a:dest)letcmd=g:NERDTreeCopyCmd." ".escape(self.str(),nerdtree#escChars()) . " " . escape(dest, nerdtree#escChars())
letdest=a:destletcmd=0ifnerdtree#runningWindows()letcmd=g:NERDTreeCopyCmd.'"'.self.str().'" "'.dest.'"'elseletcmd=g:NERDTreeCopyCmd." ".escape(self.str(),nerdtree#escChars()) . " " . escape(dest, nerdtree#escChars())endif
コピーを実行してみよう
上記までの手順ですべての準備が整いましたので、再度、mキーを押下しファイルコピーを実行してみましょう。
これで、Windows環境でもNERD Treeプラグインのファイルコピーが正しく動作するはずです。