さようならGNU screen。いままでありがとう。
そういえばGNU screenもzshも学生時代からの付き合いなので、もう10年どころじゃなく使っている・・・。
長らく使っていた仮想端末アプリGNU screenから、最近何かと話題のtmuxに、この週末で乗り換えました。今まではちょっと気になって使ってみることはありましたが、メインの作業環境を切りかえるまでは決断できずにいました。慣れないツールで作業効率が落ちるのは本末転倒だし。
ただ、今回、切り替えようと決断したのには理由があります。実は最近、複数台のサーバーを設定する作業があったんです。結局、台数分、同じコマンドを同じように打っていて、無駄だなぁと思ったのがきっかけ。同じコマンドを複数のターミナルに同時に投入したい。これだけのシンプルな理由からです。
いろいろ調べてみると、どうにも最近のトレンドは、MacでiTerm2で、tmuxでzshという環境らしいですし(いや、ソースが偏ってると思いますが)。私の今の環境は、MacでiTerm2で、screenでzsh。あとはtmuxだけだったしね。
そんなこんなで切り替えを敢行し、カスタマイズを完了し、概ね使える感じになったので、ちょっと紹介しておきます。
(1)prefixを何にするか。
まずはprefixを何にするかが最初の問題です。screenのデフォルトはCtrl-A、tmuxはCtrl-Bです。どちらもカーソル移動に当たっているため、これは避けます(そういえばdockerコンソールも同じようなキーバインドだったような・・・なんでこの辺に当たるのかしら)。
私は古くからscreenのprefixでCtrl-Zを使ってきたので、これを使います。
Ctrl-Zといえばサスペンドシグナルなので、まぁ使うといえば使いますし、使わないといえば使わない。むしろ不意にサスペンドされても困ることが多いので、そのままCtrl-Zをprefixに採用。
prefixを変えるとかなり混乱するので、これは当然ながら踏襲します。
## Keybind
unbind-key C-b
set-option -g prefix C-z
bind-key C-z send-prefix
(2)お約束の設定は、ネットの情報を見て真似をする。
日本語関連とか、コピーモードのキーマップとか。この辺は普通に人の真似をしてみる。コピーモードについてはscreenが元々viキーマップだったので、これを踏襲しています。
set-window-option -g utf8 on
set-window-option -g mode-keys vi
コピーモードの使い勝手が若干異なっているのは慣れの範囲ですね。
screenだと、spaceからspaceでコピーされたんですが、tmuxでは、spaceではじめてENTERでコピー。ちょっとこれは戸惑いました。
ただtmuxのコピーバッファーにはyankがあるのは、うまく使えるとうれしいかもしれないです。
(3)Ctrlは押しっぱなしで次のストロークも打てるようにしよう
bind-key C-a last-window
bind-key C-n next-window
bind-key C-p previous-window
bind-key C-l select-pane -t :.+
bind-key C-c new-window
なぜか知りませんが、デフォルトキーバインドって、Ctrl-Zのプレフィックスを入れておきながら、次のコマンドキーはCtrl無しってのが多い。Ctrlは押したら押しっぱなしで次のキーも連打したいので、追加設定を入れています。特にCtrl-aは連打しながら2つの画面を見比べるという操作を多様するため、これがCtrl押しっぱなしできないとちょっとしんどいです。
screenでも同じように設定してたし。
(4)設定再読込はキーバインドしておいたほうが便利
bind R source-file ~/.tmux.conf \; display-message "Reload Config!!"
しばらく設定はいろいろ弄りそうだし、再読込がコマンド一発で行けると楽かなと。
結構重宝します。特にstatusラインの見た目の調整とか。
(5)pane操作は直感に合わせる
# resize
bind -r < resize-pane -L 1
bind -r > resize-pane -R 1
bind -r - resize-pane -D 1
bind -r + resize-pane -U 1
screenでは、画面は横に分割しかできず、サイズ増減を+と-に割り振って調整していましたが、tmuxでは縦横分割が可能ですので、サイズ増減も、上下と左右になっています。これでpane配置は自由自在です。-rオプションは連打が可能な設定で、要するにprefix+<<<<とすると、どんどんpaneが左に縮小(拡大)していきます。
このpane配置がdetach/attachでちゃんと戻ってくるところはtmuxの素晴らしいところの一つです。screenの場合、画面分割して並べておいても、detach/attachしたらバラバラになっちゃうし(これ設定かな?)、そうするとsplitして画面集めて・・・ってやらないといけない。これは相当に便利です。
(6)そして目玉はsynchronize
# sync-pane
bind e setw synchronize-panes on
bind E setw synchronize-panes off
これが目玉ですね。windowに表示されたすべてのpaneに同じコマンドを投入できる、synchronize-panes設定。これをキーバインドしておくことで、同時に複数の画面を操作したくなったら、onにして、個別に調整したくなったらoffにして、渡り歩いて、またonにして作業を継続して・・・とか、自由自在です。
昨今、クラウド環境やら、クラスタ環境やらで、同じような設定を複数環境に同時進行で実施する場合に、すばらしく便利な動作です。screenがこれできないんだな。
ちなみに、一時的にコマンド同時投入をしたくない、というような場合に、該当paneを他のwindowに退避させておくような操作も可能。
join-pane -s :0.1 <window 0のpane 1を、カレントwindowに持ってくる>
join-pane -dt :0.2 <カレントwindowのpane2を、window 0に移す>
これは現状キーバインドしていませんが、なんとなく引数付きでキーバインドしておいても良さそうな気がしないでもない(コマンドを忘れそうな気がする)。
(7)その他、pane周り
prefix後に矢印キーで、アクティブpaneを上下左右に変更できます。prefix qでpane番号を確認後、すみやかに番号を入力することで切り替えることもできる。このpane操作の直感的なところは、非常に効率が良くていいです。
以上、tmuxに乗り換える上で最低限、screenの操作感を維持するために設定、調整した内容です。他にもstatusラインの見た目などはいろいろ他のサイトを見て調整しています。
結構、tmux関連は、画面を晒しているサイトが多いのも特徴的で、なんか熱いなぁ、と思いました。
ちなみに、関連して、ですが、これまた10年以上育ててきたzshの設定も整理しました。というのも、今回、tmuxに切り替えたら、BackSpaceキーがDeleteになるという問題が出て、これが「stty erase ^H」設定を消したらうまく動くようになったということがあったためです。
正直、昔はいろいろ設定しないとうまく動かなかったものが、最近の環境では、何もしないほうが安定して動くことも多いです。また、最近のzshでは標準設定で便利に使えるところを、過去に個別設定したところが上書き設定していて動かなくて、損していた、なんてこともあります。
この辺、ちゃんと見なおしたほうが良いなぁと思いました。
というわけで、この週末2日、体を慣らすこともかねていろいろ試行錯誤して、切り替え完了しました。まだしばらくは調整しつつ、また、面白い使い方を模索しつつ、行こうかな、と思っています。