Gnu screen上のVim起動中に画面サイズ拡大後の:splitでクラッシュ

前から気になっていたこととして、Gnu screen上のVimで作業しているとファイルを閉じると同時にクラッシュしてGnu screenが強制終了される問題があった。ネットで探してもあまり事例がなかった。いい加減に気になったので、調べてみると原因がわかった。

8.1.4.1 問題の再現

まず、問題が起こるイベントを示す。以下の手順でコマンドを実行したり、ウィンドウサイズを変更することでGnu screenが強制終了する問題が発生する。
screen
vim
画面サイズを変更(上か下に3段階以上広げる)
:sp
:qall
[screen caught signal 11. (core dumped)]
このように、以下の条件でGnu screenがクラッシュ(強制終了)してしまう。
  • Gnu screenの起動中
  • Vimの起動中
  • 画面サイズを上下に3段階以上拡大
  • Vim上で:splitにより画面分割。
  • :qall (:q)によりVimを終了する。


画面サイズを3段階以上というのは、画面端をドラッグでサイズを変更するときにスナップする段階のことを指す。画面を広げると解釈しても問題ない。わずかに広げる場合は問題がおきない。
画面サイズの変更については以下の点は問題なかった。
  • 左右方向の拡大。
  • 上下左右の縮小
クラッシュすると同じディレクトリにscreen.exe.stackdumpファイルができる。このファイル内容は以下となっていた。
Stack trace:
Frame Function Args
00287E0C 61030562 (00000244, 0000EA60, 000000A4, 00287E6C)
00287F2C 610DB56D (000018E4, 00000000, 00000000, 00000000)


8.1.4.2 原因

問題の原因を調査した。まず、関連しそうな設定ファイルのない状態で問題が再現するか確認した。.bashrc, .screenrc, .vimrcを削除して行うと問題はおきなかった。.screenrcのみ残して行うと再現できた。したがって、.screenrcの設定に問題がある。
.screenrcの設定をコメントアウトしつつ原因箇所を絞り込んでいった。すると以下の設定が原因だと判明した。これをコメントアウトすると問題がおきなかった。
defscrollback 100000
値を1にしてもだめだった。0だと問題なかった。
defscrollbackGnu screenのコピーモードで戻れる既定の行数を指定する。これを設定しておかないとコピーモードで画面をもどれない。デフォルトだと100行までもどれる。defscrollbackの設定については以下のサイトが詳しい。
参考:GNU screenscrollbackdefscrollbackの違い ぬいぐるみライフ() http://d.hatena.ne.jp/mickey24/20081013/1223878764
したがって、Vimsplitする問題を回避するには、defscrollback設定をせずに、標準の100行までで我慢するしかないだろう。これ以上戻りたければ、VimSplitの問題を諦めるか、Gnu screenでなくtmuxを使えということなのだろう。

とりあえず問題がわかってすっきりした。開発状況や機能を考慮して、Gnu screenからtmuxへの移行を検討したほうがよいのかもしれない。

追記2014-09-05
Twitterでバージョンとプラットホームの記載がないとの指摘を受けたので記載します。


この問題の再現できた環境。
Windows 78 Cygwin 32bit screen 4.02.01
Ubuntu 14.04 screen 4.01.0devel
ただし,UbuntuではVim:qallとして閉じるとクラッシュしない。:qで全て閉じるとクラッシュする。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です