emacs23になってからMewでスパムが表示されると頻繁に画面制御がおかしくなって端末をresetしないといけない状態がずっと続いていたが、tmuxにしたらなかなか耐えてくれるようなのでおもいきって乗り換えてみた。左右分割したときにスクロールが速いというのも気にいっているところ。

screexをtmuxに移植してtmuxnというをつくった。screenはセッション毎にサーバがあるけどtmuxは複数のセッションを1つのサーバでまかなうので、tmuxn用のセッションを特別につくるようにしたり、サーバを起動したときの環境変数を中のシェルまでもってくるのでtmuxサーバを起動するときに環境変数をクリアしたり、tmuxがattachするときにクライアントの環境変数をセッションにコピーする機能を殺したり、こまごました違いがあって安定して動くまで時間がかかった。

tmux自体の動きでいちばんこまったのはC-hがDELに変換されてしまうというもの。ふだんバックスペースCtrl+Hで入力していて、それにあわせてemacsも設定してあってDELはC-dにしてある(bobcat仕様)なので、これはなんとかする必要があった。

ググっているとstty eraseを変更するとよいというブログがみつかり、さっそくソースコード調査。

  • sttyコマンドのソースコードでeraseを検索するとVERASEというシンボルで参照されるようだ。
  • tmuxのソースコードでVERASEを検索するとtty-keys.cに、とってもあやしいコードを発見。
 /*
  * Check for backspace key using termios VERASE - the terminfo
  * kbs entry is extremely unreliable, so cannot be safely
  * used. termios should have a better idea.
  */
 bspace = tty->tio.c_cc[VERASE];
 if (bspace != _POSIX_VDISABLE && key == bspace)
         key = KEYC_BSPACE;

svn annotateで調べるとr1417ではいったようだ:

------------------------------------------------------------------------
r1417 | tcunha | 2009-07-29 07:37:02 +0900 (Wed, 29 Jul 2009) | 7 lines

Sync OpenBSD patchset 184:

Detect backspace by looking at termios VERASE and translate it into \177
(which matches screen's behaviour if not its termcap/terminfo entry). The
terminfo kbs cap is often wrong or missing so it can't be used, and just
assuming \177 may be wrong.

------------------------------------------------------------------------

ソースコードのコメントをみてもコミットログをみても、どういう意図があるのかわからん。

とりあえずFreeBSDにはeraseのほかにerase2というのもあるので

stty erase ^?
stty erase2 ^h

という設定で逃げられたが、Linuxにはerase2はないようなのでそっち方面の人はどうすんだろう。

そのほかtmuxで気になること:

  • set-environment -uのつかいかたがわからない
  • paneをリサイズしたときに行を再配置してくれない。これはscreenだと折り返し位置を画面幅にあわせてくれるがtmuxはなにもしてくれない。
  • screenだと長い行を折り返して表示するかどうかを切り替えられる。横に長いログがでるときにwrapしない表示は便利だったんだが。
  • 別々のwindowにあるpaneを1つのwindowに集約して表示する方法がない。screenだとwindow分割してそこに別のwindowをもってくるようなこと。

screenとtmuxではモデルがちがって特にwindowの意味がちがっているので分かるまでかなり時間がかかった。

SCREEN

        1  n (screen -xのときn>1)
session ---- client
  |m          |1
  |           |
  |n          |1
window ----- layout (これが1画面)
  |1   n   1
  |
  |1
 pty

TMUX

        1  n
session ---- client
  |m (m>1になるのはlink-windowしたときだけ)
  |
  |n
window (これが1画面。誰から見てもおなじレイアウト)
  |1
  |
  |n
 pane (これが分割されたあとの区画に対応)
  |1
  |
  |1
 pty

(2012-02-23)

FreeBSD:/usr/ports/sysutils/tmux/files/ extra-patch-tty-keys.cにC-hをDELに変えるコードをはずすパッチがはいってた。backspaceとDeleteをどうするか謎は深いなぁ。