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
screen
scrollbackdefscrollbackの違い

ぬいぐるみライフ()
http://d.hatena.ne.jp/mickey24/20081013/1223878764
したがって、Vimsplitする問題を回避するには、defscrollback設定をせずに、標準の100行までで我慢するしかないだろう。これ以上戻りたければ、VimSplitの問題を諦めるか、Gnu
screen
でなくtmuxを使えということなのだろう。

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

追記2014-09-05
Twitterでバージョンとプラットホームの記載がないとの指摘を受けたので記載します。
この問題の再現できた環境。
Windows
7
8
Cygwin 32bit screen 4.02.01
Ubuntu
14.04 screen 4.01.0devel
ただし,UbuntuではVim:qallとして閉じるとクラッシュしない。:qで全て閉じるとクラッシュする。

コメントを残す

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