Vim8.1でディレクトリが読めないのを解消

# 現象

vimをディレクトリを指定して起動する場合、ディレクトリ内のファイル一覧が表示されるのが期待なのに、sorry...のメッセージ

```shell_session
$ vim directory

(vim画面)
~
~
~
...
***sorry*** this version of netrw requires vim v7.4 with patch 213
```

# 調査

検索してみると類似の不具合が、、、でも8.0.2で修正したと書かれている。。。
https://github.com/vim/vim/issues/1069

とりあえず、エラーメッセージを出しているファイルは`netrw.vim`のようなので探す。

```shell_session
$ sudo find / -name netrw.vim
/usr/share/vim/vim74/autoload/netrw.vim
/usr/share/vim/vim74/syntax/netrw.vim
/usr/local/share/vim/vim81/syntax/netrw.vim
/usr/local/share/vim/vim81/autoload/netrw.vim
/usr/local/src/vim/runtime/autoload/netrw.vim
/usr/local/src/vim/runtime/syntax/netrw.vim
```

いくつかあるが、vim8.1を使っているので`/usr/local/share/vim/vim81/autoload/netrw.vim`を見てみる。

Vim8.1はソースからコンパイルしたものなので`/usr/local/src/vim/`配下には`git clone`したコードが残っている。`/usr/share/vim/vim74/`はOSをインストールした時からあったのだと思う。

```vimscript
(/usr/local/share/vim/vim81/autoload/netrw.vim)
...
" netrw requires vim having patch 213; netrw will benefit from vim's having patch#656, too
if v:version < 704 || !has("patch213")
 if !exists("s:needpatch213")
  unsilent echomsg "***sorry*** this version of netrw requires vim v7.4 with patch 213"
 endif
 let s:needpatch213= 1
 finish
endif
...
```
よく分からない。
`:echo v:version`の結果は`801`だが、`:echo has("patch213")`は`0`だったのでエラーになってしまいそうなものだが、8.0.2で修正したと書いてあったのでこの箇所は関係ないのだろうか。8.0.2での修正を見てみる。

```diff
$ cd /usr/local/src/vim
$ git log v8.0.0002 -p -1

commit 9e1e7afc1f29b67fe3721442b49af3b20644a3ee (tag: v8.0.0002)
Author: Bram Moolenaar <Bram@vim.org>
Date:   Mon Sep 12 16:31:10 2016 +0200

    patch 8.0.0002
    Problem:    The netrw plugin does not work.
    Solution:   Make it accept version 8.0.

diff --git a/runtime/autoload/netrw.vim b/runtime/autoload/netrw.vim
index de85844d5..76485c2f3 100644
--- a/runtime/autoload/netrw.vim
+++ b/runtime/autoload/netrw.vim
@@ -22,8 +22,8 @@
 if &cp || exists("g:loaded_netrw")
   finish
 endif
-" netrw requires vim having patch 213; netrw will benefit from vim's having patch#656, too
-if v:version < 704 || !has("patch213")
+" netrw requires vim having patch 7.4.213; netrw will benefit from vim's having patch#656, too
+if v:version < 704 || (v:version == 704 && !has("patch213"))
  if !exists("s:needpatch213")
   unsilent echomsg "***sorry*** this version of netrw requires vim v7.4 with patch 213"
  endif
```

やっぱり、注目した箇所が修正されている。`v:version == 704 &&`が追加されていてこれならエラーの条件に当たらない。なんで自分の使っているvim8.1にはこの修正が適用されていないのだろう。

```shell-session
$ git log --oneline runtime/autoload/netrw.vim
4697399e8 move netrw back to the previous version
b0d45e7f5 Update runtime files.
9e1e7afc1 (tag: v8.0.0002) patch 8.0.0002 Problem:    The netrw plugin does not work. Solution:   Make it accept version 8.0.
aa3b15dbe Updated runtime files.
...
```

どうやらコミット`4697399e8`で修正をもとに戻している。ここで、自分がコンパイルしたバージョンは「最新」ではなく、8.1.0000である事を思い出し、最新版までの履歴を見てみる。

```shell-session
$　git log origin/master --oneline runtime/autoload/netrw.vim
00e455633 (tag: v8.1.0001) patch 8.1.0001: the netrw plugin does not work
4697399e8 move netrw back to the previous version
b0d45e7f5 Update runtime files.
9e1e7afc1 (tag: v8.0.0002) patch 8.0.0002 Problem:    The netrw plugin does not work. Solution:   Make it accept version 8.0.
aa3b15dbe Updated runtime files.
...
```

一つコミットが追加されている。しかもたった一個先のバージョンで。

```diff
$ git log v8.1.0001 -p -1

commit 00e45563384de01949b9c4df9155424604887b33 (tag: v8.1.0001)
Author: Bram Moolenaar <Bram@vim.org>
Date:   Thu May 17 23:40:05 2018 +0200

    patch 8.1.0001: the netrw plugin does not work
    
    Problem:    The netrw plugin does not work.
    Solution:   Make it accept version 8.x.

diff --git a/runtime/autoload/netrw.vim b/runtime/autoload/netrw.vim
index de85844d5..76485c2f3 100644
--- a/runtime/autoload/netrw.vim
+++ b/runtime/autoload/netrw.vim
@@ -22,8 +22,8 @@
 if &cp || exists("g:loaded_netrw")
   finish
 endif
-" netrw requires vim having patch 213; netrw will benefit from vim's having patch#656, too
-if v:version < 704 || !has("patch213")
+" netrw requires vim having patch 7.4.213; netrw will benefit from vim's having patch#656, too
+if v:version < 704 || (v:version == 704 && !has("patch213"))
  if !exists("s:needpatch213")
   unsilent echomsg "***sorry*** this version of netrw requires vim v7.4 with patch 213"
  endif
```

このコミットでの修正も予想どおり。

# 原因

vim8.1コンパイルした時のソースコードを「最新」ではなく、8.1.0000にしていた。このためちょうど`runtime/autoload/netrw.vim`hへの修正が取り消されており、エラーを正しく判定できないコードを使っていた。

8.1.0000を使ったのは、なんとなくキリの良いバージョンの方が安定しているように感じたから。

# 対策

古いバージョンを使うのに懲りて「最新」のバージョンで再度コンパイルするか、あるいは少なくとも8.1.0001以降を使って再度コンパイルするのが本来の対策ではないかと思う。

が、修正するのは.cファイルではなく、.vimファイルであり、もう再コンパイルするのが面倒になったので、コミット`00e455633`での変更内容で、`/usr/local/share/vim/vim81/autoload/netrw.vim`を手動で書き換えた。

これでもう一度、vimを起動すると期待した通りディレクトリ内のファイル一覧が表示された。

```shell-session
$ vim directory

(vim画面)
" ============================================================================
" Netrw Directory Listing                                        (netrw v156)
"   /home/haessal/directory
"   Sorted by      name
"   Sort sequence: [\/]$,\<core\%(\.\d\+\)\=\>,\.h$,\.c$,\.cpp$,\~\=\*$,*,\.o$,\.obj$,\.info$,\.swp$,\.bak$,\~$
"   Quick Help: <F1>:help  -:go up dir  D:delete  R:rename  s:sort-by  x:special
" ==============================================================================
../                                                                                                                                    
./
aa.txt
~
~
~
"sandbox" is a directory 
```