5
5

More than 5 years have passed since last update.

WindowsのgVimでNERD Treeプラグインのファイルコピーをちゃんと動かしたい

Last updated at Posted at 2014-01-21

概説

VimのNERD Treeプラグインって便利ですよね。
エクスプローラーライクに使えるので、非常に気に入っているのですが、Windowsの環境ではmキー押下時に表示されるメニューの「ファイルコピー」の操作が「一手間」かけないと正しく動作しません。
どうやらこれは以前からある既知の問題のようですね。
ここでは、Windows環境のgVim7.3(Kaoriya版)で、NERD Treeプラグインのファイルコピーを正しく動作させる方法を示します。

まず、何も対処をせずに「mキー」を押してみる

通常、Macの環境などでNERD Treeを実行し、「mキー」を押下すると「(c)opy the current node」というメニューが表示されますが、以下のようにメニューが表示されません。

mキー押下
NERDTree Menu. Use j/k/enter and the shortcuts indicated
==========================================================
> (a)dd a childnode
  (m)ove the current node
  (d)elete the current node

ファイルコピーのメニューを表示させるには?

「:e $MYVIMRC」などで「_vimrc」を編集し、以下の内容を追記します。
「-r」の後ろにスペース1文字分が入っているので、注意して下さい。

_vimrc
let g:NERDTreeCopyCmd= 'cp -r '

もう一度「mキー」を押してみる

今度は「(c)opy the current node」が表示されました。

mキー押下
NERDTree Menu. Use j/k/enter and the shortcuts indicated
==========================================================
> (a)dd a childnode
  (m)ove the current node
  (d)elete the current node
  (c)opy the current node   

喜ぶのはちょっと早い

ファイルコピーのメニューが表示されたのでコピーができるかと思いきや、いざ実行してみると、以下のように表示され、コピーが正常に行われません。

ファイルコピー実行
NERDTree: Could not copy node

なぜファイルコピーができないのか?

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に記載がある場合

修正前
let dest = s:Path.WinToUnixPath(a:dest)

let cmd = g:NERDTreeCopyCmd . " " . escape(self.str(), s:escape_chars) . " " . escape(dest, s:escape_chars)
修正後
let dest = a:dest
let cmd = 0
if s:running_windows
    let cmd = g:NERDTreeCopyCmd . '"' . self.str() . '" "' . dest . '"'
else
    let cmd = g:NERDTreeCopyCmd . " " . escape(self.str(), s:escape_chars) . " " . escape(dest, s:escape_chars)
endif

path.vimに記載がある場合

修正前
let dest = s:Path.WinToUnixPath(a:dest)

let cmd = g:NERDTreeCopyCmd . " " . escape(self.str(), nerdtree#escChars()) . " " . escape(dest, nerdtree#escChars())
修正後
let dest = a:dest
let cmd = 0
if nerdtree#runningWindows()
    let cmd = g:NERDTreeCopyCmd . '"' . self.str() . '" "' . dest . '"'
else
    let cmd = g:NERDTreeCopyCmd . " " . escape(self.str(), nerdtree#escChars()) . " " . escape(dest, nerdtree#escChars())
endif

コピーを実行してみよう

上記までの手順ですべての準備が整いましたので、再度、mキーを押下しファイルコピーを実行してみましょう。
これで、Windows環境でもNERD Treeプラグインのファイルコピーが正しく動作するはずです。

参考URL

Windows 7: copy option unavailable
Copy command on Windows

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5