diff --git a/_posts/2016-03-23-take-care-of-patch-1577.md b/_posts/2016-03-23-take-care-of-patch-1577.md index 13336f79..97175431 100644 --- a/_posts/2016-03-23-take-care-of-patch-1577.md +++ b/_posts/2016-03-23-take-care-of-patch-1577.md @@ -1,16 +1,16 @@ --- layout: post category: blog -title: Patch 1577 の使用にご注意ください +title: Patch 7.4.1577 の使用にご注意ください --- ## TL;DR -安定したVimを使いたいのならば、7.4.1558 以前か 1639 以降のバージョンを使ってください。 +安定したVimを使いたいのならば、7.4.1576 以前か 1639 以降のバージョンを使ってください。 ## 詳細 -[Patch 1559][1] において Vim script に partial argument と言う新機能が実装されました。 +[Patch 7.4.1559][1] において Vim script に partial argument と言う新機能が実装されました。 この機能は、既存の `function()` 関数を拡張する形で提供され、以下のように利用します。 @@ -25,11 +25,41 @@ call Cb("zzz") " foo bar zzz ``` -関数 `MyFunc` の呼び出し引数の幾つかを、関数リファレンス `Cb` にホールドする事でカリー化(正確には部分適用)を実現する為の物ですが、この実装に際して複数のバグが混入し、多くの Vim plugin が動作しなくなっていました。 +関数 `MyFunc` の呼び出し引数の幾つかを、関数リファレンス `Cb` にホールドする事で部分適用を実現する為の物で、辞書関数の場合には `self` を含めることもできます。 + +```vim +function! MyFunc() dict + echo self.value +endfunction + +let Cb = function('MyFunc', {'value': 'foo'}) + +call Cb() +" foo +``` + +この時点では、この `Partial` は `function()` に追加された引数を渡した場合のみ生成されていたため、過去に作られたスクリプトに影響はありませんでした。 + +ですが、[Patch 7.4.1577][2] において、辞書関数にアクセスすると `Partial` が返されるように変更が行われました。 + +```vim +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 が動作しなくなっていました。 **現在では正しく動作するように復旧しました**が、そこに至るまでには以下に示す多くの修正パッチがリリースされています。 -* * * * @@ -44,12 +74,10 @@ call Cb("zzz") * * -この 1559 から 1638 までの Vim では、多くの Vim plugin が動作しない可能性があります。現に、本不具合が原因と見られる誤動作が、著名な Vim plugin の誤動作と誤解され、各々へ報告されているのが観測されました。 - -Vim script を正常に利用するには、7.4.1558 以前か 7.4.1639 以降のバージョンの Vim をご利用いただくことを強く推奨いたします。また各ディストリビューションの Vim 関連パッケージのメンテナをされている方々には、この間のバージョン(7.4.1559 から 7.4.1638) を避けてパッケージングするよう、重ねてお願い申し上げます。 +この 7.4.1577 から 7.4.1638 までの Vim では、多くの Vim plugin が動作しない可能性があります。現に、本不具合が原因と見られる誤動作が、著名な Vim plugin の誤動作と誤解され、各々へ報告されているのが観測されました。 -[1]:https://groups.google.com/d/msg/vim_dev/oaKOwnslCZY/60J7AjUdGAAJ +Vim script を正常に利用するには、7.4.1576 以前か 7.4.1639 以降のバージョンの Vim をご利用いただくことを強く推奨いたします。また各ディストリビューションの Vim 関連パッケージのメンテナをされている方々には、この間のバージョン(7.4.1576 から 7.4.1638) を避けてパッケージングするよう、重ねてお願い申し上げます。 -## 補足事項 +[1]:https://groups.google.com/d/topic/vim_dev/oaKOwnslCZY/discussion +[2]:https://groups.google.com/d/topic/vim_dev/yAWqYrURjjk/discussion -本記事の掲載初期には 1577 を問題の開始時点としていました。しかし実際には 1559 でした。それにともない本文の記述は修正しましたが、タイトルやリンクは変更していません。