Ubuntu Weekly Recipe

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

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

byobuで利用されているtmuxは,非常に多くのカスタマイズが可能です。今週はtmuxのカスタマイズを進め,より多くの機能を実現できるようにしてみましょう。なお,tmuxのカスタマイズは,⁠本来やるべきことを忘れて設定の修正に専念してしまう」という病気を発症する可能性があります。とくに,emacs.elや.vimrc,.zshrcなどに時間を費やしたことのある方はかなり危険なので,なるべく時間を確保してから触ることをお勧めします。

byobu環境との親和性を保つ

byobu(tmuxバックエンド)環境でtmux的なカスタマイズを行う場合,~/.byobu/.tmux.confを編集します。通常のtmuxが利用するファイルは~/.tmux.confなので,競合する設定を投入することも可能です。とは言え,最も簡単なのは,~/.byobu/.tmux.confをbyobu・tmuxそれぞれを壊さない形で編集し,~/.tmux.confはシンボリックリンクにしておくことです。基本的にbyobu側は.tmux.confの設定を尊重するように動作するので,⁠~/.byobu/.tmux.confが素のtmux環境でも問題なく動作すること」さえ気にかければ大丈夫です。

GNU Screenからの乗り換え

tmuxがいくら便利そうでも,手がGNU Sreenに慣れていて乗り換えられない,ということもあるでしょう。このような場合は,tmuxの設定をできるだけGNU Screenに近づけて利用するのが良いでしょう。

コピーモードのキーバインド

tmuxには,GNU Screenユーザが乗り換えるための設定ファイルとして,第127回でも紹介されているように,/usr/share/doc/tmux/examples/screen-keys.confに一種のプリセットが用意されています。これを.tmux.confにコピーすることで,基本的な操作,とくにウィンドウの作成や移動は一通りGNU Screen互換にすることができます。なお,tmuxバックエンドのbyobuでは,これに相当する設定がすでに投入されています。

しかし,この方法で実現できるGNU Screenとの互換性は,コピーモードでは機能しません(コピーモードに入るにはエスケープシーケンス+「[」か,エスケープシーケンス+「Esc」を用います)⁠

Screenでは,コピーモードに入ると,カーソルの移動にEmacsライク・viライクなキーバインドが組み合わさったものが利用できます。hjklとCtrl+npfbのどちらもが有効で,Emacsとvi系エディタを併用しているユーザにとってはその日の気分で操作を使い分けることができ,非常に重宝します。しかしtmuxでは「vi風味」「Emacs風味」のどちらかから選択するしかありません。hjklとCtrl+npfbを適当に使い分ける人にとっては死活問題です。byobuのキーバインドも同じで,GNU Screenに慣れきったユーザにとっては,⁠同じbyobuとはいえ細かなキーバインドが違う謎のインターフェース」という状態になっています。

このような場合,キーバインドをカスタマイズしておくと違和感なく乗り換えることができます。

まず,おおもととなるキーバインドを選択します。ここではvi風の「vi」を選択しています。

set-window-option -g mode-keys vi

Emacs風味のカーソルキー移動設定を追加します。bind-key -t vi-copyは,⁠vi-copy環境のキーバインド」に対する設定を意味します。上記の「mode-keys vi」はコピーモードでvi-copyバインドを利用することを指示しています。

bind-key -t vi-copy C-n cursor-down
bind-key -t vi-copy C-p cursor-up
bind-key -t vi-copy C-f cursor-right
bind-key -t vi-copy C-b cursor-left

これにより,GNU Screenで利用できるEmacs風+vi風キーバインドに近い,⁠hjklでもC-npfbでも操作できる」環境ができました。とはいえ,C-bは画面のスクロールで利用することも多いため,カーソルの上下移動だけ(つまり以下の設定だけ)に留め,後半2行はコメントアウトしておいても良いでしょう。tmuxの設定ファイルでは,⁠#」以降がコメントとみなされます。

bind-key -t vi-copy C-n cursor-down
bind-key -t vi-copy C-p cursor-up
#bind-key -t vi-copy C-f cursor-right
#bind-key -t vi-copy C-b cursor-left

ただし残念ながら,現在のtmuxの実装ではGNU Screenと完全に同じキーバインドを実現することはできません。コピーにかかわる操作を一致させることができないためです。GNU Screenのデフォルトでは,コピーの開始と終了を,どちらもスペースキーに割り当てます。スペースキーでコピーを開始し,必要な範囲を選択したらもう一度スペースキーを押すとバッファに保存される,というものです。tmuxでは,コピーの開始と終了を別のキーに割り当てる必要があります注1)⁠

注1)
キーバインドに対して複数のコマンドを割り当てることができれば,後述するステータスバーと同じようにループするキーバインドを行うことでこの問題を回避することもできるのですが,vi-copy/emacs-copyでは1つのコマンドしか割り付けられないため,⁠スペースキーで選択して,再度スペースキーで選択終了」という操作を実現させる方法がありません。

コピーモード切替のメッセージ

GNU Screenでは,コピーモードに入ると,画面の左下に「Copy mode」といったインジケータが表示されます。長年Screenを利用していると,コピーモードに切り替えるためのキー操作をする→画面に「Copy mode」と表示されることを確認する→コピーモード特有の操作を始める,というクセがついてしまっているはずです。

図1 Screenのコピーモード表示

図1 Screenのコピーモード表示

tmuxの場合,コピーモードに入っているか否かは,画面右上の「0/1000」といった表示を確認する必要があります。

図2 tmuxのコピーモード表示

図2 tmuxのコピーモード表示

視認に利用する場所が左下と右上でまったく異なるため,キー操作をする→インジケータが表示されないのでもう一度→やはり表示されないのでもう一度→何かおかしいことに気づく→tmuxを使っていることを思い出して画面の右上に視線を向ける,などといった悲しい光景を繰り広げることになります。これは,乗り換えにあたって大きな問題になります。この問題を回避するには,次のような設定を加えます。

bind-key [ copy-mode \; display "(Copy mode)"
bind-key Escape copy-mode \; display "(Copy mode)"

この設定を加えることで,コピーモードに切り替えたときに,画面下部に切り替えメッセージが表示されるようになります。これは,bind-keyでキーバインドを設定する際,⁠コピーモードに切り替えるためのコマンド(⁠copy-mode」⁠に,⁠;」で区切って「display」⁠メッセージ出力)を呼び出す」というものを割り当てています。

単に「;」で区切るとキーバインド設定ではなく,⁠コピーモードのキーバインド設定を行い,その後でdisplayする」という意味になってしまうので,⁠\」でエスケープして「コピーモードに切り替え,displayするキーバインド設定」として認識させる必要がある,というのが少々特殊です。

図3 画面下部にメッセージが表示されるようになった

図3 画面下部にメッセージが表示されるようになった

この設定例では,GNU Screenの標準的なキーバインド(エスケープシーケンス後に「]」「ESC」でコピーモード)を前提にしているため,標準と異なるキーバインドを用いる場合は変更する必要があります。

利用している環境のキーバインドに合わせて設定を調整してください。キーバインドを確認するには,エスケープシーケンスを入力した後に「:」を押してコマンド入力モードにした後で「list-keys」を実行するか,通常のUNIXコマンドとして「tmux list-keys」を実行してください。

なお,メッセージ(display)の表示時間や色は,次の設定で制御することができます。

set-option -g display-time 800
set-option -g message-bg green
set-option -g message-fg white

この例では,表示時間を800ms,表示の背景色を緑,文字色を白にしています。

著者プロフィール

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

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

コメント

コメントの記入