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

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

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

```vim: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文字分が入っているので、注意して下さい。

```vim:_vimrc
let g:NERDTreeCopyCmd= 'cp -r '
```

## もう一度「mキー」を押してみる
今度は「(c)opy the current node」が表示されました。

```vim: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   
```

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

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

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

Windowsのコピーコマンドは*nixのcpとは異なり、ファイルコピーの場合はcopy、ディレクトリコピーの場合はxcopyを使用します。
上記の設定では「'cp -r '」のように指定しているため、当然このままでは動きません。これについては、[ブログで詳しく言及されている方がいる](http://got-ravings.blogspot.fr/2008/07/windows-copying-commands-suck-giant.html)ので、そちらをご覧ください。

## cpコマンドを取得してくる

この[issue](https://github.com/scrooloose/nerdtree/issues/152)では、[msysGit(Git for Windows)](http://msysgit.github.io/)をインストールしているのであれば、msysGitのディレクトリ（例：C:\Program Files (x86)\Git\bin）から「cp.exe」と「msys-1.0.dll」をコピーしてきて、gVimのbinディレクトリ配下にコピーせよと記載がありますので、その通りに行います。
gVimのバージョンによってはbinディレクトリが存在しない場合もあるので、その場合はgVimのディレクトリの直下にコピーします。

もし、msysGitではなく、[Gow(GNU on Windows)](https://github.com/bmatzelle/gow)をインストールしている場合は、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に記載がある場合

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

let cmd = g:NERDTreeCopyCmd . " " . escape(self.str(), s:escape_chars) . " " . escape(dest, s:escape_chars)
```

```vim:修正後
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に記載がある場合

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

let cmd = g:NERDTreeCopyCmd . " " . escape(self.str(), nerdtree#escChars()) . " " . escape(dest, nerdtree#escChars())
```

```vim:修正後
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](https://github.com/scrooloose/nerdtree/issues/152)
[Copy command on Windows](https://github.com/scrooloose/nerdtree/issues/270)