背景
Vimを愛用していて、そこそこプラグイン入れる派です。
プラグイン管理は長らくNeoBundle + vimprocにお世話になっています。
先日、久々にMac上のVimで:NeoBundleUpdate
を実行したところ、エラーが出て動かなくなってしまいました。
回避方法を見つけるまで結構時間を使ってしまったので、記事にしておきたいと思います。
エラーが発生した環境
- macOS Mojave (10.14.1)
- Vim 8.0, macOS標準のwithout GUI版
High Sierraでは問題なかったと思いますが、自信がありません。。。
Sierraでは間違いなく問題ありませんでした。
他に心当たりが全くないので、OSアップグレードが引き金だろうと推測。
エラー内容
[vimproc] function neobundle#commands#install[40]..<SNR>17_install[21]..neobundle#installer#sync[51]..neobundle#installer#get_revision_number[17]..neobundle#util#system[7]..vimproc#
system[25]..<SNR>83_system[10]..vimproc#pgroup_open[15]..<SNR>83_pgroup_open[7]..vimproc#plineopen3[6]..<SNR>83_plineopen[64]..<SNR>83_vp_pipe_open[10]..<SNR>83_libcall, line 1
[vimproc] Vim(let):dlerror = "dlopen(/Users/hrnrhty/.vim/bundle/vimproc.vim/lib/vimproc_mac.so, 0x0005): code signature in (/Users/hrnrhty/.vim/bundle/vimproc.vim/lib/vimproc_mac.so
) not valid for use in process: mapped file has no cdhash, completely unsigned? Code has to be at least ad-hoc signed."
[vimproc] Error occurred in calling s:vp_pipe_open()
[vimproc] a:argv = ['/usr/bin/git', 'rev-parse', 'HEAD']
[vimproc] original a:argv = ['/usr/bin/git', 'rev-parse', 'HEAD']
[vimproc] Vim(if):E121: Undefined variable: fdlist
[vimproc] function neobundle#commands#install[40]..<SNR>17_install[21]..neobundle#installer#sync[70]..neobundle#installer#lock_revision[5]..neobundle#installer#get_revision_number[1
7]..neobundle#util#system[7]..vimproc#system[25]..<SNR>83_system[10]..vimproc#pgroup_open[15]..<SNR>83_pgroup_open[7]..vimproc#plineopen3[6]..<SNR>83_plineopen[64]..<SNR>83_vp_pipe_
open[10]..<SNR>83_libcall, line 1
[vimproc] Vim(let):dlerror = "dlopen(/Users/hrnrhty/.vim/bundle/vimproc.vim/lib/vimproc_mac.so, 0x0005): code signature in (/Users/hrnrhty/.vim/bundle/vimproc.vim/lib/vimproc_mac.so
) not valid for use in process: mapped file has no cdhash, completely unsigned? Code has to be at least ad-hoc signed."
[vimproc] Error occurred in calling s:vp_pipe_open()
[vimproc] a:argv = ['/usr/bin/git', 'rev-parse', 'HEAD']
[vimproc] original a:argv = ['/usr/bin/git', 'rev-parse', 'HEAD']
[vimproc] Vim(if):E121: Undefined variable: fdlist
[vimproc] function neobundle#commands#install[40]..<SNR>17_install[21]..neobundle#installer#sync[86]..vimproc#pgroup_open[15]..<SNR>83_pgroup_open[7]..vimproc#plineopen2[6]..<SNR>83
_plineopen[64]..<SNR>83_vp_pipe_open[10]..<SNR>83_libcall, line 1
[vimproc] Vim(let):dlerror = "dlopen(/Users/hrnrhty/.vim/bundle/vimproc.vim/lib/vimproc_mac.so, 0x0005): code signature in (/Users/hrnrhty/.vim/bundle/vimproc.vim/lib/vimproc_mac.so
) not valid for use in process: mapped file has no cdhash, completely unsigned? Code has to be at least ad-hoc signed."
[vimproc] Error occurred in calling s:vp_pipe_open()
[vimproc] a:argv = ['/usr/bin/git', 'pull', '--ff', '--ff-only']
[vimproc] original a:argv = ['/usr/bin/git', 'pull', '--ff', '--ff-only']
Error detected while processing function neobundle#commands#install[40]..<SNR>17_install[21]..neobundle#installer#sync[86]..vimproc#pgroup_open[15]..<SNR>83_pgroup_open[7]..vimproc#
plineopen2[6]..<SNR>83_plineopen[64]..<SNR>83_vp_pipe_open:
line 25:
E121: Undefined variable: fdlist
E116: Invalid arguments for function len(fdlist)
E15: Invalid expression: a:npipe != len(fdlist)
たくさん出ていますが、大事そうなのは以下。
[vimproc] Vim(let):dlerror = "dlopen(/Users/hrnrhty/.vim/bundle/vimproc.vim/lib/vimproc_mac.so, 0x0005): code signature in (/Users/hrnrhty/.vim/bundle/vimproc.vim/lib/vimproc_mac.so
) not valid for use in process: mapped file has no cdhash, completely unsigned? Code has to be at least ad-hoc signed."
vimproc_mac.so
が署名されていないことが原因、ということでしょう。
色々調べた結果、以下の記事が参考になりました。
Mac標準のApacheにhomebrewでインストールしたPHPモジュールを指定するとエラーになる問題の解決方法
今回の現象に当てはめると、macOSのアップグレードでOS標準のVimが署名されたものになり、署名されていないvimproc_mac.so
を呼んだ時にエラーが発生するようになった、と類推できます。
署名を確認してみる
まずmacOS標準Vim。
$ codesign -vd /usr/bin/vim
Executable=/usr/bin/vim
Identifier=com.apple.vim
Format=Mach-O thin (x86_64)
CodeDirectory v=20100 size=14558 flags=0x0(none) hashes=451+2 location=embedded
Platform identifier=5
Signature size=4485
Info.plist=not bound
TeamIdentifier=not set
Sealed Resources=none
Internal requirements count=1 size=64
署名されています。
続いて、一応vimproc_mac.so
も。
$ codesign -vd ~/.vim/bundle/vimproc.vim/lib/vimproc_mac.so
/Users/hrnrhty/.vim/bundle/vimproc.vim/lib/vimproc_mac.so: code object is not signed at all
エラーメッセージに書いてあったので当然ですが、やはり署名されていません。
vimproc_mac.so
に署名するのが最も良い方法のように思いますが、これはGitHubから取得したソースをローカルでビルドしたもの。この場合どのように署名すべきなのか、よくわかりません。。。
回避方法
再び先の記事を参考にすると、署名されていないもの同士であればエラーは発生せず、また、HomebrewのVimは署名されていない可能性が高そうです。
インストールしてみます。
$ brew update
$ brew install vim --with-override-system-vi
これで、単にvim
と叩けばHomebrew版Vimが起動するようになります。
続いて、署名を確認してみます。
$ codesign -vd /usr/local/bin/vim
/usr/local/bin/vim: code object is not signed at all
ナイス!署名されていません、期待通りです。
Vimを起動して:NeoBundleUpdate
してみると、無事エラーは発生しなくなりました。