エンジニアならtmuxくらい使いこなしたらどうだ
2020/09/18「エンジニアならtmuxくらい使いこなしたらどうだ」の声に驚いて振り向くと、研修中のメンターと新人。
メンターはサッサと自分の業務に戻ったけど、新人はiTerm2を開いて俯いたまま。
私は咄嗟にThinkpadを連れて、新人の目の前でtmux windowを
Ctrl+tで開いた。2つも開いた。
大丈夫ですよと念じながら。
この記事の概要
tmux固有のショートカットを覚えずにtmuxへ入門します
tmuxとは
tmuxは,誤解を恐れずに言えば,ターミナルで タブ機能 や 画面分割 を行えるようにするためのソフトウェアです.
ブラウザからタブ機能がなくなったら?たぶん不便すぎて泣きたくなるはず.tmuxによってターミナルが便利になるのは言うまでもありません (言ってる)
「タブとか画面分割ならiTerm2やTerminatorでもできるでしょ」
たしかにそうですが,tmuxにはさらなる利点があります.うっかりWi-Fiが切れてもSSHセッションは無事だったり,環境(OSなど)が変わっても同じキーバインドが使えたり….
あとtmuxは軽い.
tmuxと挫折
そんなたくさんの利点を持つtmuxですが,私は過去,何度か入門に失敗しています.
while(1){
— 七十 (@sititou70) August 15, 2019
僕「tmux使おうかな?」
僕「やめた」
}
その一番の理由が,tmux固有のキーバインドです.人々がvimに挫折するのと同じ理由ですね.
ブラウザでいうところのタブは,tmuxでは window といいます.
tmuxで新しいwindowを作る,デフォルトのキーバインドを見てみましょう.
Ctrl+b(を押してから)c
は?(全ギレ)
新しいタブを作りたいだけなのに 💢
なんでこんなに複雑なキーバインドなの 💢💢💢
解決策:tmuxを調教する
どうしてもtmuxのキーバインドに慣れなかった私は,
「tmux使おう → 挫折」 の世界線をループしているうちに,たった1つの真実にたどり着きました.
tmuxでも,Ctrl+tでタブ開ければいいんじゃね?
bind -n C-t new-window -a -c "#{pane_current_path}"
わざわざ慣れないキーバインドを使わずとも,自分の好きなようにtmuxを調教すれば良いのです.
では,画面分割はどうすれば…?デフォルトのCtrl+b(を押してから)%とかはもちろん使いたくありません…
ここは Alt+|で左右に分割,Alt+-で上下に分割 だ.
bind -n M-\ split-window -h -c "#{pane_current_path}"
bind -n M-- split-window -v -c "#{pane_current_path}"
よし!見たまんまでわかりやすい
それで,Ctrl+wでタブorペイン(分割した画面)を消せれば最高では?
bind -n C-w kill-pane
タブ移動は,Ctrl+PageUpとCtrl+PageDownにしよう.
でもペインの移動は?新しいキーバインドを考えるのもめんどくさい…
なら,同じキーバインドで,タブとペインを移動できるようにしてしまおう!
bind -n C-Pageup \
if-shell -F '#{==:#{pane_index},1}' \
'previous-window; run "tmux select-pane -t $(tmux list-panes | wc -l)"' \
'select-pane -t :.-'
bind -n C-Pagedown \
if-shell -F '#{==:#{pane_index},#{window_panes}}' \
'next-window; select-pane -t 1' \
'select-pane -t :.+'
すべてのペインを巡回する挙動にしました.なんてシンプルな操作感…
これで, 既存のキーバインドを存分に活かせるtmuxができました.
か……完璧だ…!
tmuxの調教に成功した
— 七十 (@sititou70) March 17, 2020
その他の細かいこと
キーバインドの衝突
例えば,Ctrl+wは,BashやZshでは単語削除に割り当てられています.
そのため,
「tmuxで,このキーバインドを設定してしまうと,シェルで単語削除ができなくなるじゃないか!」
という人が一定数発生しそうですが,そもそも単語削除のキーバインドがCtrl+wなのが不自然ではないでしょうか?
普段(ブラウザやエディタで),私はCtrl+BackSpaceで単語削除するので,シェルも同じキーバインドであるのが自然でしょう.
bindkey "^H" backward-kill-word
このように,tmuxに設定したキーバインドが他と衝突する場合,衝突先のキーバインドを,よりふさわしいものへ変更する方が大抵ベターです.
タブの切り替えにCtrl+PageUp使う?
Ctrl+PageUp/PageDown でタブを切り替えるのは少数派な気がします.
少なくとも,私の周りのエンジニアは,みんなCtrl+Tabとかを使っています.
私がCtrl+PageUp/PageDownでタブを切り替える理由は,その汎用性です.
- ブラウザ,VS Codeでタブを切り替える
- Excelでシートを切り替える
- Blenderでワークスペース(上のほうにあるタブみたいなやつ)を切り替える
などなど,多くの場所でこのキーバインドは使えます.
え?PageUp/PageDownが押しにくい位置にあるって?
だから私はThinkPadが好きです.
CtrlとPageUp(左にある)を押せば左のタブへ, PageDown(右にある)を押せば右のタブへ…
ThinkPadを作った人は わかっている と思います.この操作性には,コカインと同じくらいの中毒性があるのです.
他の人のtmux触れなくなるよね?
「自分を世界に合わせるか,世界を自分に合わせるか」
これは,tmuxに限らず,ツールをカスタマイズしている人にとっての永遠の課題です.デフォルト主義 vs カスタマイズ主義 とも言います.
- デフォルトのキーバインドによるストレス
- カスタマイズの労力
- 他人のtmuxを触る機会がどれだけあるか
- etc...
を考慮した結果,私はカスタマイズ主義になりました.
まとめ
人間は認知的経済性の原則にしたがうと言われています.つまり,普段と全く違うキーバインドを要求してくるデフォルトのtmuxは,認知的負荷が高く,ストレスになってしまうということです.
冒頭に書いたメンターと新人の話はもちろんフィクションです.しかし,新人君のように,tmuxが便利なのを知りながらも,その認知的負荷の高さから入門できない人が少なからずいると思います.
この記事では,tmuxをカスタマイズすることで,人に優しいキーバインドを実現しました.
「でも,もっと高度なtmuxの機能を使いたくなったら?このキーバインドじゃ足りないよね?」
その時は,またカスタマイズすればいいのです.
最後に,私の.tmux.confを貼っておきます.