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だと問題なかった。
defscrollbackはGnu
screenのコピーモードで戻れる既定の行数を指定する。これを設定しておかないとコピーモードで画面をもどれない。デフォルトだと100行までもどれる。defscrollbackの設定については以下のサイトが詳しい。
参考:GNU
screenのscrollbackとdefscrollbackの違い
–
ぬいぐるみライフ(仮)
http://d.hatena.ne.jp/mickey24/20081013/1223878764
したがって、Vimでsplitする問題を回避するには、defscrollbackの設定をせずに、標準の100行までで我慢するしかないだろう。これ以上戻りたければ、VimのSplitの問題を諦めるか、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で全て閉じるとクラッシュする。