現象
vimをディレクトリを指定して起動する場合、ディレクトリ内のファイル一覧が表示されるのが期待なのに、sorry...のメッセージ
$ 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
のようなので探す。
$ 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をインストールした時からあったのだと思う。
(/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での修正を見てみる。
$ 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にはこの修正が適用されていないのだろう。
$ 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である事を思い出し、最新版までの履歴を見てみる。
$ 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.
...
一つコミットが追加されている。しかもたった一個先のバージョンで。
$ 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を起動すると期待した通りディレクトリ内のファイル一覧が表示された。
$ 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