vim-jp » Vimのユーザーと開発者を結ぶコミュニティサイト

Patch 7.4.1577 の使用にご注意ください

Posted on 2016-03-23


TL;DR

安定したVimを使いたいのならば、7.4.1576 以前か 7.4.1639 以降(できれば 7.4.1646 以降)のバージョンを使ってください。

詳細

Patch 7.4.1559 において Vim script に partial argument と言う新機能が実装されました。

この機能は、既存の function() 関数を拡張する形で提供され、以下のように利用します。

function! MyFunc(arg1, arg2, arg3)
  echo a:arg1 a:arg2 a:arg3
endfunction

let Cb = function('MyFunc', ["foo", "bar"])

call Cb("zzz")
" foo bar zzz

関数 MyFunc の呼び出し引数の幾つかを、関数リファレンス Cb にホールドする事で部分適用を実現する為の物で、辞書関数の場合には self を含めることもできます。

function! MyFunc() dict
  echo self.value
endfunction

let Cb = function('MyFunc', {'value': 'foo'})

call Cb()
" foo

この時点では、この Partialfunction() に追加された引数を渡した場合のみ生成されていたため、過去に作られたスクリプトに影響はありませんでした。

ですが、Patch 7.4.1577 において、辞書関数にアクセスすると Partial が返されるように変更が行われました。

let dict = {'value': 'foo'}
fnction! dict.Func()
  return self.value
endfunction

let Cb = dict.Func

" 7.4.1576 以前では Cb はただの Funcref だったので dict を明示しないと呼べなかったが、
" 7.4.1577 以降では Cb は dict をホールドした Partial なので、直接呼べる
call Cb()
" foo

この実装に際して、今まで Funcref が返ってきていたところが Partial に変わったことにより、複数のバグが混入し、多くの Vim plugin が動作しなくなっていました。

現在では正しく動作するように復旧しましたが、そこに至るまでには以下に示す多くの修正パッチがリリースされています。

この 7.4.1577 から 7.4.1638 までの Vim では、多くの Vim plugin が動作しない可能性があります。また、7.4.1639 から 7.4.1645 でも、一部の Vim plugin が動作しない可能性があります。現に、本不具合が原因と見られる誤動作が、著名な Vim plugin の誤動作と誤解され、各々へ報告されているのが観測されました。

Vim script を正常に利用するには、7.4.1576 以前か 7.4.1639 以降(できれば 7.4.1646 以降)のバージョンの Vim をご利用いただくことを強く推奨いたします。また各ディストリビューションの Vim 関連パッケージのメンテナをされている方々には、この間のバージョン(7.4.1576 から 7.4.1645) を避けてパッケージングするよう、重ねてお願い申し上げます。

(2016/04/01: 7.4.1639 から 7.4.1645 でも不具合が残っていたため、その旨追記しました。)

Arch Linux と Gentoo のリリース状況について

現在 Arch Linux では 7.4.1584、Gentoo (Portage) では 7.4.1583 とそれぞれ問題のあるバージョンがリリースされてしまっています。バージョンを固定するかソースコードからビルドして回避してください。

追記: Arch Linux では日本時刻の 2016/03/24 03:48:23 に 7.4.1639 がリリースされたようです。


もどる