読者です 読者をやめる 読者になる 読者になる

マルチバイト文字をechoした後にechoしたアルファベットが飛ぶ現象が修正された

Vim

私が現象を報告したVimの問題が修正されました。
nnoremap <silent>で呼ぶ関数の中でechoを使うと文字が途切れ途切れになることがある - Issue #558 - vim-jp/issues - GitHub
Patch 7.4.303 - Google Groups
まずはじめに、原因の特定、再現の確認、デバッグ、パッチを書いてくださった皆様に感謝致します。


どうやって問題を見つけたか

この問題に気がついたのは、calendar.vimを作った時でした。
calendar.vimにはタスクを表示する機能がありまして、その画面で<c-g>を押すと、カーソルの下のタスクがechoされます。
マルチバイトな文字をechoした直後に、アルファベットの文字をechoしたら、文字が飛び飛びになってしまうことに気が付きました。
その時は、何が原因か、まったく分かりませんでした。

原因は何か

当初は、<silent>とechoの組み合わせによって起きていると考えていましたが、違いました。
問題が確率的に起こることが、不可解なものにしていました。
結局のところ、原因はscreen.cの中で比較してはいけないポインター同士を比較していたことでした。
(詳しくは 画面最下行での utf8 文字列の表示結果が不正確 - Issue #559 - vim-jp/issues - GitHub をご覧ください)

この現象の回避方法

Vimのバグかプラグインのバグかは直ぐには判断できませんでしたが、次のコミットで修正できることが分かりました。
improve echo.vim: echo '' before echoing message - 1f5d3e1 - itchyny/calendar.vim - GitHub
そうです、echoする前にecho ''とするのです。
パッチによって新しいVimでは修正されていますが、それ以前のVimを使っている人は沢山いらっしゃいますので、この方法がいいと思います。

この現象が起き得る他のプラグイン

私の気がついている範囲では、vimfilerしかありません。
vimfilerでマルチバイトなパスを<c-g>した後にアルファベットのパスを<c-g>すると、飛び飛びになります。
他のプラグインでもあるはずなのですが、私は見つけられていません。

まとめ

環境依存、確率的に起こる問題は、原因の特定が困難です。
それに一生懸命取り組んでいただいた皆様に、感謝しております。