sci

最果て風呂

こまります Vim さん

遭遇

事の発端はこの HTML ファイルを編集している時に生じたのです。何文字か削除してから上に移動しようとした際にターミナルごと終了してしまいました。

当初は「あれ?⌘-Q 押しちゃったかな?」と思い、ターミナルを起動し直して再編集をはじめたのですが、やはりターミナルごと落ちてしまいます。こうなると原因は Vim にありそうな予感。

調査をはじめたものの、手掛りはこの L88 を編集して上に移動した時にクラッシュしてしまうということだけです。私の .vimrc には次のような設定がしてあるので、これを無効に (コメントアウト) して同様の操作をしてみましたが、やはり落ちてしまいます。

noremap j gj
noremap k gk

あぁ、調査をするには素の Vim で起動しなければなりません。方法はいろいろと見るのですが、次の起動オプション (で良かったかなぁ…… –noplugin 付けなあかん?) で起動して調査することにしました。

vim -u NONE -N

調査

L88 のみをターゲットに試行錯誤してわかったことは、どうやら全角なら 16 文字、半角なら 32 文字を x にて削除する。そして k で 2 行上に行こうとすると落ちるみたい。全角 15 文字、半角 31 文字 の削除、移動は 1 行までなら大丈夫。

.html という拡張子が悪さをしているのかな?ファイルタイプとか素の Vim に関係あるのかどうかわからないけれど、.txt にして実験してみよう…… 変わらないや。拡張子を付けなくても同様なので、この問題に拡張子は関係ないと考えて良さそう。

x で文字を削除した後に↑矢印キーでの移動は問題ない。他の矢印も同様に問題ないし、h, j, l での移動も大丈夫だわ。

16x で削除してから k で移動すると落ちてしまう。16 文字以上削除してから矢印キーで少し移動する。その後に k で上に動く場合は大丈夫。いったいどういう事なんだろう?16 文字削除して、続けて k で移動すると落ちる。つまり x で削除して k での連続移動がトリガーっぽい?

例文はもっとミニマムにできるだろうか?L88 だけを取り出して文を縮めていこう。k の連続移動がキーなので、空行は必要だね。

「全部が半角、全部が全角」の文では落とせなかった。HTML のタグが関係あるのかな?全角と半角の混在がポイントになりそう。

ここから果てしない試行錯誤が続く……

糸口

かなり時間がかかってしまったけれども、次のようなところまで絞ることができた。

  • 「1 つの半角文字 + 120 文字以上のマルチバイト文字」
  • 「3 つの半角文字 + 119 文字以上のマルチバイト文字」
  • 「5 つの半角文字 + 118 文字以上のマルチバイト文字」
  • ……

マルチバイトの途中に半角を偶数含んでいる場合は問題無く、奇数含んでいる場合は落ちる。半角は括弧類に限らず、アルファベットも同等で区別する必要はない。

あぁ、文の最後に改行が付いていないと落ちないわ。だから (k で移動するための部分も加えて) 次のような文が必要だわ。

  • 「改行 + 1 つの半角文字 + 120 文字以上のマルチバイト文字 + 改行」
  • 「改行 + 2 つの半角文字 + 119 文字以上のマルチバイト文字 + 1 つの半角文字 + 改行」
  • 「改行 + 4 つの半角文字 + 118 文字以上のマルチバイト文字 + 1 つの半角文字 + 改行」
  • 「改行 + 3 つの半角文字 + 117 文字以上のマルチバイト文字 + 4 つの半角文字 + 改行」

数学の得意な人はここから規則を読み取って一般化できるのでしょうけれど、わたしには厳しいなぁ。「半角は奇数個」と「改行にはさまれた文」であることはわかる。あとはマルチバイトの個数だね。「奇数の半角 + マルチバイト文字の合計が 241 バイト」ということになる。

でもわたしは UTF-8 で使っているから 3 バイト計算しないと。そうすると 361, 360, 359, 358 となって規則が見い出せない (>_<)。ファイル側のエンコードを変えてみればいいのか。euc-jp, sjis で試してみても落ちてしまうのね。

ちなみに iTerm2 では問題にはならない。OS X 標準のターミナル v2.6.1 でだけこの現象(不具合)が生じる。だから Vim が改行指向のエディタだから一文が長いとうまく扱えないというわけじゃない。あれ? 1 文字削除してからの移動でも落ちるわ。

解決に向けて

これまでのことをまとめると、例文としては次のものが最小限になるでしょうか。

(改行)
<p>あああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ</p>
(改行)

そして操作は「カーソルを p に置いて x で削除し、続けて k を 2 回押す」。

ここから先はプロに任せるということになるのですが、あぁ……これを他者に説明するのが難しい。とりあえずテンプレートがあるのでわかる範囲で書いてみましょうか。


質問・報告の内容

特定の文字列を編集し、k で移動するとターミナルごと落ちる。

再現方法:次の例文を開き、p の文字にカーソルを置いて xkk とします。例文中の前後には改行が入っています。

ほげほげ

<p>あああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ</p>

ふがふが

(エンジンによって Markdown の解釈が異なるんですね……。改行が入っていることがわかりやすいように例文を修正しました)

Vim のバージョン

8.0.562 (CUI 版です)
(8.0.0000 でも落ちます)

OS の種類/バージョン

OS X El Capitan 10.11.6
ターミナル 2.6.1

関係していそうなプラグイン

なし

その他

考察資料(このブログのアドレス)


こんな感じでしょうかね。わかる範囲で書けば良いので思ったよりは気楽に報告ができそうです(でも突っ込みが怖いんですよ)。

おまけ

skk.vim で入力しているのですけれど、▽や▼の三角形が表示されなくなってしまった。ずいぶんと昔も使えなくて、@や*に変更して使っていたのですけれど、いつの間にか問題なく表示できるようになっていたので元に戻していました。しかし、ここにきてまたもや問題が生じるようになってしまいました。

調べてみると 542 までは問題なく表示することができたのですけれども、543 でダメになりました。term.c 等に修正が入っているパッチなので、これのせいでダメになったみたいですね。

この文章は HIGASHI さんに後押しされて書かれました。ありがとうございます。

追記 1

古い iBook を起動して Vim をビルドして実験してみましたが、こちらは問題ありませんでした。

また、問題の生じている方の Vim も 563 に上げてみましたが、やっぱり

_人人人人人人人人人人人人人_
> ターミナルごと落ちます <
 ̄YYYYYYYYYYYYY ̄

追記 2

スクリーンキャストを撮ってみたので投稿。 f:id:nakinor:20170419202019g:plain

追記 3

環境設定で「ターミナルの宣言方法」を ansi にすることで暫定的に回避できることがわかりました。