Ubuntu Weekly Recipe

第292回 .tmux.confの設定をしてみよう

この記事を読むのに必要な時間:およそ 4.5 分

ファイルの貼り付け

tmuxを使うと,⁠ローカルのファイルをリモートに貼り付ける」ということもできます。次の設定を.tmux.confに加えてください。

bind-key i   command-prompt -p "(load-and-paste) file?" "load-buffer %%" \; paste-buffer
bind-key I   command-prompt -p "(load-buffer) file?" "load-buffer %%"

この設定が実現する動作は,vi系エディタの「:r」⁠Emacsの「C-x i」に相当します。指定されたファイルを,tmuxのウィンドウ上に流し込みます。SSH等でリモートマシンに接続している場合も機能するので,設定ファイルの流し込みに便利です。たいていの場合,リモートマシン側でvimを起動して,:set pasteしてから貼り付けることになるでしょう。一度コピーしてからエスケープシーケンス→⁠]」で流しこむこともできますが,直接ローカルにあるファイルを指定できるのがメリットです。

なお,ファイルを相対パスで指定する場合,tmuxが起動されたカレントディレクトリが基準になるので注意する必要があります。

独自のステータス表示

ある程度以上にtmuxの設定を増やしてしまうと,byobuが利用できない環境(=Ubuntu以外の環境)にも設定を持ち出したくなります。byobuは実際には多くのUNIX環境にポーティングされているのですが,byobuのバージョンが古くtmuxバックエンドが利用できない,あるいはtmuxはあるがbyobuが存在しない,といった環境に遭遇することもあります。

このような場合に備えて,自分でステータスバーを構築しておく,というのも手です。筆者は次のような設定を利用しています。この設定は,.tmux.confに設定すべきものに加えて,~/.tmux.conf.status1と~/.tmux.conf.status2という別ファイルに分離してあります。⁠エスケープシーケンス+l」が押されるたびにstatus1かstatus2がトグルで表示が切り替わります。

STATUS_LEFT_SIMPLE="#[fg=black,bg=$MYHOSTCOLOR] #h #[fg=brightcyan,bg=black][#S:#I:#P]#[default]"
STATUS_LEFT_DETAIL="#[fg=green,bg=black] #(lsb_release -c --short) #[fg=black,bg=$MYHOSTCOLOR] #h #[default]#[fg=black,bg=yellow]<#(echo $SSH_CONNECTION | cut -d ' '  -f1)#[fg=brightcyan,bg=black][#S:#I:#P]#[fg=blue,bg=yellow] #[default]"
STATUS_RIGHT_SIMPLE="#[default]#[fg=black,bg=white] %h %m(%a)|%H:%M#[default]"
STATUS_RIGHT_DETAIL="#[fg=white,bg=red]?#(cat /var/lib/update-notifier/updates-available | cut -s -d ' ' -f1 | paste -d ' ' -s)!#[fg=yellow,bg=blue]#(cut -d ' ' -f 1-3 /proc/loadavg)#[default]#[fg=black,bg=white] %h %m(%a) %Y|%H:%M#[default]"

set-option -g status-left  $STATUS_LEFT_DETAIL                                               
set-option -g status-right $STATUS_RIGHT_DETAIL
unbind l
bind-key l refresh-client \; source ~/.tmux.conf.status1

.tmux.conf.status1

set -g status-left  $STATUS_LEFT_SIMPLE
set -g status-right $STATUS_RIGHT_SIMPLE
bind-key l refresh-client \; source ~/.tmux.conf.status2

# vim syntax sugars{{{1
# vim:set ft=tmux ts=2 sw=2 sts=2 foldmethod=marker:
# }}}

.tmux.conf.status2

set -g status-left  $STATUS_LEFT_DETAIL
set -g status-right $STATUS_RIGHT_DETAIL
bind-key l refresh-client \; source ~/.tmux.conf.status1

# vim syntax sugars{{{1
# vim:set ft=tmux ts=2 sw=2 sts=2 foldmethod=marker:
# }}}

なお,ホストごとに自動的に配色を変更するため,⁠$MYHOSTCOLOR」という環境変数を背景色として利用します。$MYHOSTCOLORは~/.bashrc・~/.zshrcなどで明示的に宣言するか,たとえば次のような設定を~/.zshrcに加えて,ホスト名に応じて自動的に決まるようにしておいても良いでしょう。

alias str2num="hexdump -v -e '8/1 \"%03o\" \"\n\"'"
alias host2color="echo $[`hostname | str2num -n5` % 8]"
MYHOSTCOLOR="$((`host2color`+2))"

また,status1/status2等の設定ファイルを増やせば,トグル動作からサイクル動作に変更することもできます。

複数ペインへの同時入力

tmuxには,複数のペインに同じ入力を行う機能があります。Cluster SSH(cssh)や,TeraTermなどに備わっているものとほぼ同等の機能で,複数のサーバに対して同時に設定を行いたい(が,そのためのツールなりワンライナーを準備するほどのことでもない)場合に威力を発揮します。

たとえば次のように設定しておくと,⁠e」で複数ペインへの同時入力を開始し,⁠E」で同時入力を終了します。ステータスバーと同じ方法を使うと簡単にトグル動作も実現できますが,この種の大きな副作用を持った操作の場合,キーバインドはモードレスにしておく(つまり,⁠エスケープシーケンス+C-Eすれば必ず終了する」ということが保証されている状態にしておく)べきです。

set-option -g synchronize-panes off
bind-key e set-window-option synchronize-panes on \; display 'synchronize begin'
bind-key E set-window-option synchronize-panes off \; display 'synchronize end'

このモードはかなり危険なので,カスタムステータスバーの場合は背景色が変わるように設定しても良いでしょう。次のように記述しておきます。

set-option -g synchronize-panes off
bind-key e set-window-option synchronize-panes on \; set-option -g status-bg red \; display 'synchronize begin'
bind-key E set-window-option synchronize-panes off \; set-option -g status-bg $MYHOSTCOLOR \; display 'synchronize end'

なお,この原稿時点での.tmux.confがhttps://github.com/fumihito/dotfiles/tree/gihyo.jpにあります。面倒な方はこれを使ってカスタマイズされたtmuxを試してみても良いでしょう。ただし,$MYHOSTCOLORだけは(.bashrcなりで)セットすることをお忘れなく。なお,紹介していないキーバインドも幾つか転がっていますので,実際に触る前に「エスケープシーケンス→C-?」でキーバインド一覧を眺めておくことをお勧めします。

著者プロフィール

吉田史(よしだふみひと)

Ubuntu Japanese Team Member株式会社創夢所属。システム管理を中心にWindows/PC Unixを併用している。Ubuntu Japanese Teamではパッケージサーバの管理や翻訳などの作業を担当。

コメント

コメントの記入