このブログはURLが変更になりました

新しいブログはこちら→ https://matsuu.hatenablog.com/

時代はGNU screenからtmuxへ

GNU screenはもう古いので皆さんtmuxへ移行しましょう、という話。Gentooならemerge tmux。

スクリーンショット

手元のtmuxを撮ってみた。縦分割モード。ウィンドウマネージャはawesome。左のircクライアントはweechat

本家にもいくつかスクリーンショットがある

tmuxへ移行する理由(メリット)

  • 標準設定のままでもそれなりに使えるステータスバー
  • 各ショートカットがコマンドベース(コマンドで操作ができる)
  • 標準で縦分割機能搭載
  • GNU screenがたまに固まる問題(が発生するのは私だけ?)が発生しないかも
  • ビュー専用のスクロールモード
  • 柔軟なペイン制御
  • コピー&ペースト用のバッファを複数保持できる
  • terminfo的にscreen互換
  • メモリ消費量が少ない(GNU screenの約1/5)
  • 一部機能でマウスが使用できる(mode-mouse, mouse-select-pane)
  • 活発に開発中

tmuxへ移行する上での注意点(デメリット)

  • GNU screenにはないペインの概念がややこしい(複数同時表示できるのはペインのみ、ウィンドウは1つのtmux上で同時に表示できない)
  • 縦分割時にペインを狭める/広げることが現状できない*1
  • マルチバイト文字がたまに表示上消える(Ctrl+Lで復活)
  • バッファのペースト時にマルチバイト文字が化けることがある
  • コピーモード中に検索が現状できない*2
  • GNU screenにあるシリアル接続機能はない
  • Windowsからtelnet/ssh経由でtmuxを操作する場合、画面が崩れる場合がある
  • まだ発展途上

GNU screenとtmuxのキーマップの違い

GNU screen風にキーカスタマイズも出来るけど、折角だからtmuxのキーマップに慣れましょう。いくつかピックアップ。

操作 screen tmux
ウィンドウを作成 C-a c または C-a C-c C-b c
ウィンドウ名を変更 C-a A C-b ,
ウィンドウ一覧表示/移動 C-b " C-b w
次のウィンドウへ移動 C-a n または C-a C-n C-b n
前のウィンドウへ移動 C-a p または C-a C-p C-b p
最後に操作したウィンドウへ移動 C-a C-a C-b l
ウィンドウを強制終了 C-a k C-b &
ペイン分割 C-a S C-b "
ペイン分割解除 C-a Q C-b !
ペインを強制終了 C-a k C-b x
ペイン間移動 C-a Tab C-b o または C-b Up または C-b Down
ペインを狭める/広げる C-a - または C-a + C-b C-Up または C-b M-Up または C-b C-Down または C-b M-Down
ペイン配置パターンの変更 なし C-b Space または C-b {1,2,9}
中断 C-a d または C-a C-d C-b d
再開 screen -x tmux attach
ウィンドウ配置の変更 なし C-b Space
コピーモードでのコピー始点選択 Space または Enter C-Space (viモードならSpace)
コピーモードでのコピー終点選択 Space または Enter M-w (viモードならEnter)
現時刻表示 C-a t または C-a C-t C-b t

追記:GNU screen風キーカスタマイズも用意しました

その他

今から使うならロケール問題が解消されたtmux-0.9以降がオススメ。ただ、tmux-0.9でも設定ファイルにutf8の記述が必要。私の今の設定(~/.tmux.conf)はこんな感じ。詳しくはtmux(1)を参照。

set-window-option -g utf8 on # 日本語環境なら今のところ必須。
set-window-option -g mode-keys vi # コピーモードのキーマップ。標準はemacs
set-window-option -g automatic-rename off # ウィンドウ名が自動的に更新されないように

Vimで色が正しくでない場合は、t_Coが指定されていないか確認。

" t_Coを指定しているとtmuxでは色が正しくでないのでコメントに
"set t_Co=88
"set t_Co=256

*1:1.0で実装済

*2:1.0で実装済