screenからtmuxに乗り換えたら快適!(二点除く)

ずっとscreen使ってたけど、
時代はGNU screenからtmuxへ - Gマイナー志向
のタイトルにやられて変えてみた。

個人的screenの利点

  • ネットワーク切っても別のクライアントからでも同じ状態から再開できる。
  • ネットワーク切ってもプロセス止まらない。nohup要らず。

基本同じことだけどもこれがとても素晴しい。
ということでちゃんとこれができるか確認すると、あっさりできた。
screenの場合は設定が必要だったdetach操作せずにネットワークを切ったときに自動的にデタッチする(autodetach on)もデフォルトで動作。
(tmuxだとdetach-on-destroy)

.tmux.conf

.screenrcにあたるものは~/.tmux.conf
基本的な説明とかは以下リンク参照。
.tmux.confをごにょごにょする - mizchi log
以下、自分の設定

# Prefix
set-option -g prefix C-q
# デフォルトのPrefix(C-b)を解除
unbind C-b

# View
# ステータスライン更新間隔(秒)
set -g status-interval 5
set -g status-left-length 100
set -g status-right-length 50

set-option -g set-titles on
# www1.hoge.com→www1のみ表示。
set-option -g set-titles-string "@#(hostname | sed 's/\\\\..*//')"

# ステータスラインカスタム関連
set -g status-bg black
set -g status-fg white
set -g status-attr dim
# 左部:whoami@hostname
set -g status-left '#[fg=green,bold][#20(whoami)@#H]#[default]'
# 右部:[2011/03/06(Sun)20:21]
set -g status-right '#[fg=green,bold][%Y/%m/%d(%a)%H:%M]#[default]'
set -g message-attr bold
set -g message-fg white
set -g message-bg red

set -g pane-active-border-fg white
set -g pane-active-border-bg black

set-window-option -g mode-bg white
set-window-option -g mode-fg black
set-window-option -g window-status-bg black
set-window-option -g window-status-fg white
set-window-option -g window-status-current-bg green
set-window-option -g window-status-current-fg black
set-window-option -g window-status-current-attr bold

# Option
# utf8有効
set-window-option -g utf8 on
# コピー、選択モードのキーバインドvi/emacs
set-window-option -g mode-keys vi
# マウス有効。MacのTerminal.appでは効かず…
set-option -g mouse-select-pane on
# ウィンドウ等の番号基準値
set-option -g base-index 1

# KeyBindings
# 直前のウィンドウ
bind C-q last-window
# 設定リロード
bind r source-file ~/.tmux.conf
# ウィンドウ選択画面
bind Space choose-window
# 新ウィンドウ作成
bind c new-window
# 分割していたペインそれぞれをWindowに
bind b break-pane
# ペインの縦分割
bind h split-window -v
# ペインの横分割
bind v split-window -h

# ペインリサイズ関連vi風
bind -r C-h resize-pane -L 6
bind -r C-l resize-pane -R 6
bind -r C-j resize-pane -D 6
bind -r C-k resize-pane -U 6
bind -r s swap-pane -U

# ペイン終了
bind k kill-pane
# ウィンドウ終了
bind K kill-window
# ペイン番号表示
bind i display-panes
# コピーモード突入
bind y copy-mode
# ペースト
bind p paste-buffer

ファイルはここGitHub - u1tnk/dotfiles
基本vi慣れした体にわかりやすそうにしてみた。
変わってるのはPrefixキーがctrl+qにしてるとこかな。
普通だとctrl+tらしいけど、screenのときに遠くて使い辛いと思ってたので変えてみた。
かぶったりして困ってはいないが、emacsの人とか困るのかな??

未解決事項

以下のページを見て設定した「ログイン時自動起動かつ、セッションがあったらアタッチ、無かったらデタッチ」にすると固まることがある。

http://meme.biology.tohoku.ac.jp/students/iwasaki/tmux
どうも複数クライアントで使ったときがダメなようで一回固まるようになるとずっとダメ。
zshrcに入れてたからログインできなくなって散々でした。
それぞれのコマンドを手で入力すると固まらないんですが、zshrcにコマンド定義するとダメでした。
固まったときにps見るとtmux ls のプロセスが複数あって全部終わらない…
screenだったら

screen -D -R   

で一発なんですけどね。
tmux は

tmux attach

だと既存セッションが無いときはエラーになるので…
まあ、ほとんどは既存セッションがあるので、ほぼ変わらないのですが。
で、やっぱ.zshrcとかで自動起動するのはログインできなくなるのが怖いのでやらない方が良いですね。
ということで

alias ta="tmux attach"

で、ログインするごとに入力してる。対処はできるけど、めんどくさいので…
ちなみに前回のsshしか使えないマシンで.xxrcのせいでログインできなくなったときの対処法 - 凡人プログラマはこの現象が原因で調べました…

Macのローカルで使用するとvimでコピペできない。

yとかpのコピペだけ動きません。

  • 最新のMacVim-Kaoriyaはダメ
  • 最新のMacPortsで入れたvim7.3もダメ
  • デフォルトの/bin/vimはok

以下の件かと思い
vim - copy-paste not working in MacVim when launched in tmux - Super User
以下のパッチあててみたけどダメ。
Fix tmux bootstrap · GitHub
結局デフォルトの7.2を使うようにして回避。
個人的にローカルだとMacVim-KaoriyaのGUIでほとんど済ますので、これで妥協できましたが、ローカルでもCUI版を使いまくる人だと致命的だと思います…

うーん、こいつら解決したいんだが力不足で…解決した人いたら教えてください!

まとめ

最初からウィンドウのタイトルが実行中コマンドになってたりデフォルトで結構便利になってるし、カスタマイズもscreenに比べて簡単(screen使った後で慣れてるからかもしれませんが)だったので好印象。
但し、当然ながらscreenより枯れて無いので、上記のような問題点が残ると完成度はもうちょっと無いと安心して移行できないかも。
screenを極めてるわけでは無いですが、頻繁に使う機能に絞るとscreenでできない事も見あたらないのは事実。
ということでscreenを使いこなしている人が今無理に移行する必要はありませんね、正直^^);
screen系のアプリ自体を今から使う人や新しいものじゃないとガマンできない人は使うと幸せになれるかも。