Ubuntu Weekly Recipe

第382回達人になれない人のためのtmux/screenラッパープログラムByobu入門2015

Ubuntuサーバーに最初からインストールされているByobuは、⁠テキストウィンドウマネージャー」「シェルマルチプレクサー」と名乗っている、tmuxやscreenを初心者でも簡単に使えるようにしたラッパープログラムです。

達人になれなくて……夏

Software Designの7月号の第2特集は「黒い画面(tmux)の使い方」と題して、tmuxの基本や使いこなしのヒントを紹介していました。Ubuntuでも、tmuxはサーバー版なら最初からインストールされていますし、デスクトップ版でも簡単にインストールできます。Recipeでも第127回で水野さんが「ターミナルマルチプレクサtmuxを使ってみよう」と題してUbuntuでのtmuxの使い方について紹介してくれました[1]⁠。

tmuxは初期設定でもそこそこ便利に利用できますが、manページの膨大な量を見るとわかるように、ただ使っているだけだと気がつかない便利な機能もたくさん存在します。それゆえ設定を自身のライフスタイルに合わせることでその真価を発揮できるのです[2]⁠。

とはいえ、初心者がいきなり設定を行うのは難しいものでもあります。でもせっかくtmuxを使うのであればステータスラインぐらいはカラフルにしたいもの。そこで出てくるのがByobuです。Byobuを使えばtmuxの設定がよくわからなくても、⁠それっぽい」使い方ができます。

図1 何も設定せずとも、それっぽいステータスラインになるByobu
図1 何も設定せずとも、それっぽいステータスラインになるByobu

Recipeでも第72回第291回第292回においてByobuやバックエンドとして動いているscreenやtmuxの設定方法を吉田さんが紹介してくれています。

今回は2013年の第291回以降に変更点も含め、あらためて基本をおさらいしたいと思います。

ByobuのPPA

まず最初に、比較的最新のByobuを利用するためのPPAを紹介しておきましょう。ByobuはUbuntu DeveloperのDustin Kirklandが開発していることもあって、かなり新しいバージョンが公式リポジトリにも登録されています。ただSRU自体はあまり行われていないため、リリース後は古いバージョンになりがちです。

PPAではサポートされているすべてのリリース向けの最新版が用意されていますので、Byobuの新しい機能をどうしても使いたい場合は、こちらを利用するようにしてください。今回の記事では、Byobu 5.92をベースに説明します。

$ sudo add-apt-repository ppa:byobu/ppa
$ sudo apt-get update
$ sudo apt-get install byobu

ちなみにただのシェルスクリプトとtmux/screen設定の集合体なので、他のディストリビューションやOSでも問題なくインストールできるはずです。

プレフィックスキーの変更

第291回でも説明しているようにByobuをインストールした直後はバックエンドとしてtmuxが選択されています。ただしキーバインドのプレフィックスは「Ctrl-b」ではなく「F12」です。つまり新規ウィンドウを生成したい場合は「F12 c」と入力します。

それとは別に「Ctrl-a」には「byobu-ctrl-a」コマンドがbindされています。これは「Ctrl-a」をEmacsのように「カーソルを行頭へ移動」キーとして使うか、screenのようにプレフィックスキーとして使うかという選択をするコマンドです。

Emacsモードを選んだ場合は引き続きF12が、screenモードを選んだ場合はCtrl-aがプレフィックスキーになると同時に、Ctrl-aのbyobu-ctrl-aへのバインドが解除されます。プレフィックスキーそのものを変更したい場合は、F9キーかbyobu-configコマンドで表示される設定画面で「エスケープシーケンスの変更」を選択すればGUIライクに設定できます。

図2 エスケープシーケンスの変更
図2 エスケープシーケンスの変更

このようにByobuはFキーを使用していくつかのコマンドやキーバインドをショートカットできる仕組みになっているのです。Fキーがシステムや他のCUIプログラムとバッティングして困る場合、Shift-F12もしくはbyobu-keybindingsコマンドを実行すれば、一時的にFキーバインディングを無効化できます。

Fキーベースのショートカットキー

Fキーのショートカット体系は2013年の頃から一部追加されたりしています。あらためて一通り紹介することにしましょう。ちなみにショートカットキーのリストはShift-F1で確認できます。

ここでの「Up、Down、Left、Right」はそれぞれカーソルキーの「↑、↓、←、→」に読み替えてください。また丸括弧の中にtmuxの該当コマンドを記述しておきますので、独自ショートカットを作成する際の参考にしてください。

アプリケーションがここで挙げたショートカットキーを奪ってしまうこともあります。たとえばGNOME端末の場合、編集の「キーボードショートカット」において、⁠メニューのアクセスキーを有効にする」を外したり、ショートカットでかぶっているものを無効化しておかないと、Byobuにキーイベントが渡りません。

F1:ヘルプの表示

F1キーは一般的にアプリケーションのヘルプに割り当てられているため、Byobuでは使用していません。その代わりShift-F1で新しいウィンドウにショートカットキーリストを表示します。

図3 ショートカットキーリストの表示
図3 ショートカットキーリストの表示

F2:ウィンドウ・ペインの作成

F2キーは新規ウィンドウを作成します(new-window⁠⁠。Shift-F2で水平方向に分割(split-window -h⁠⁠、Ctrl-F2で垂直方向に分割(split-window -v)になっています。Ctrl-Shift-F2の場合は、新しいセッションを作成します(new-session⁠⁠。

図4 水平方向と垂直方向の分割
図4 水平方向と垂直方向の分割

F3/F4:ウィンドウ・ペイン間の操作

おそらく最も利用するショートカットが、ウィンドウ・ペイン間の操作でしょう。

F3キーで逆方向にフォーカスウィンドウを移動し(previous-window⁠⁠、F4キーで順方向にフォーカスウィンドウを移動します(next-window⁠⁠。F3/F4キーはそれぞれAlt-Left/Alt-Rightでも代用できます。

Shift-F3/Shift-F4は、ペイン間のフォーカス移動です(select-pane⁠⁠。Shift-Left/Shift-Right/Shift-Up/Shift-Downを使うとより柔軟に移動できます。また、ペイン間の移動時はペイン番号を表示するようになっています(display-panes⁠⁠。

Alt-Up/Alt-Downではセッションを順番に変更します。

Ctrl-F3/Ctrl-F4はペインそのものを移動します(swap-pane⁠⁠。つまり同じウィンドウに表示されているペインの順番を入れ替えるのです。Ctrl-Shift-F3/Ctrl-Shift-F4はウィンドウの番号を入れ替えます(swap-window⁠⁠。現在のウィンドウを特定の番号に変更したい時に便利でしょう。

図5 1つ前の画像からCtrl-F3で移動したペインの状態
図5 1つ前の画像からCtrl-F3で移動したペインの状態

Shift-Alt-Left/Shift-Alt-Right/Shift-Alt-Up/Shift-Alt-Downを使うと、フォーカスが当たっているペインのサイズを変更できます(resize-pane⁠⁠。

F5:設定などの再読み込み

F5キーはプロファイルを再読み込みし、ステータスラインを更新します。ステータスラインが何かおかしくなった時に試してみると良いでしょう。

Alt-F5キーはByobuのUTF-8モードのオン・オフを切り替えます。UTF-8モードがオンのときはプロンプト文字列の末尾が二重各括弧「⟫(U+27EB⁠⁠」になり、ステータスラインの左端にあるUbuntuロゴがUbuntuフォントの私用領域(PUA)に格納されているUbuntuのロゴマーク(U+E0FF)となります[3]⁠。ステータスラインがずれたり、プロンプトの表示がおかしくなる場合はUTF-8モードを切ってみてください。

Shift-F5キーではステータスラインの設定を切り替えていきます。切り替え可能な設定は、⁠~/.byobu/status」「tmux_right」です。つまりコメントアウトされていない行をコメントアウトしたうえで、次のコメントアウトされている行を有効化しているだけです。普段は表示しないが一時的に表示するようにしたいステータスなどを設定しておくと便利です。

Ctrl-F5キーでは以下の環境変数のリロードを行います。

DISPLAY DBUS_SESSION_BUS_ADDRESS SESSION_MANAGER GPG_AGENT_INFO
XDG_SESSION_COOKIE XDG_SESSION_PATH GNOME_KEYRING_CONTROL
GNOME_KEYRING_PID GPG_AGENT_INFO SSH_ASKPASS SSH_AUTH_SOCK
SSH_AGENT_PID WINDOWID UPSTART_JOB UPSTART_EVENTS
UPSTART_SESSION UPSTART_INSTANCE"

ssh-agentやgpg-agent、X転送などが有効な複数のホストからデタッチ・アタッチして接続する時に便利です。なおこの処理自体はbyobu-reconnect-socketsを実行しているだけなので、手動で実行してもかまいません。

Ctrl-Shift-F5キーでは「byobu-select-profile -r」を実行することで、ステータスバーのカラースキームをランダムに変更します。複数の異なるホストに接続している時、カラースキームを変えておけば、区別しやすくなるでしょう。

図6 いろいろなカラースキーム
図6 いろいろなカラースキーム

F6:セッションのデタッチとアタッチ

F6キーを押すとセッションをデタッチしてログアウトします(detach⁠⁠。Shift-F6キーだとデタッチのみ行いログアウトはしません。Alt-F6キーでは自分以外のクライアントをデタッチします(detach-client⁠⁠。Ctrl-F6では現在のペインを破棄します(kill-pane⁠⁠。

F7:コピーモードの操作

F7キーでコピーモードに入ります(copy-mode⁠⁠。Alt-PageUpやAlt-PageDownはコピーモードに入りつつ、スクロールアップやスクロールダウンします。

Shift-F7キーは現在のペインを最大32,768行分ペーストバッファーに取得し(capture-pane -S -32768⁠⁠、ペーストバッファーを「$BYOBU_RUN_DIR/printscreen」に保存し(save-buffer⁠⁠、その内容を新しいウィンドウにviewコマンドで表示します。

F8:ウィンドウの状態変更

F8キーはウィンドウの名前を変更します(rename-window⁠⁠。Ctrl-F8にするとセッションの名前変更になります(rename-session⁠⁠。

Shift-F8はペインのレイアウト変更です(next-layout⁠⁠。次の順番で切り替わっていきます。

  • even-horizontal:すべてのペインを水平方向に等間隔に並べます。
  • even-vertical:すべてのペインを垂直方向に等間隔に並べます。
  • main-horizontal:画面上半分を0番のペインとし、残りを画面下半分に水平方向に並べます。
  • main-vertical:画面左半分を0番のペインとし、残りを画面右半分に垂直方向に並べます。
  • tiled:すべてのペインをできるだけ等間隔にタイル上に並べます。

Alt-Shift-F8とCtrl-Shift-F8は現在のレイアウトをリストア・保存します。内部的にはlist-windowsの内容を保存するbyobu-layoutコマンドを実行しているだけです。

図7 レイアウトのリストア画面
図7 レイアウトのリストア画面

F9:Byobuの設定やコマンドの実行

F9キーはByobuのncursesベースの設定ダイアログを開きます。これはbyobu-configコマンドで表示されるものと同じです。

図8 Byobuのステータスのオン・オフもここから設定できる
図8 Byobuのステータスのオン・オフもここから設定できる

Ctrl-F9はすべてのウィンドウに対して同じ文字列を送り、Enterキーを押します。内部的にはlist-windowsで表示されたウィンドウに対して、入力した文字列をsend-keysで送り、最後に「Enter」をsend-keysしています。よって「同時に実行する」というよりは「順番に実行する」感じです。Shift-F9はCtrl-F9のペイン版で、list-windowsの代わりにlist-panesを使っていること以外は同じです。

Alt-F9はそのウィンドウに表示されているすべてのペインに同時に入力を行えるようにします。⁠set-window-option synchronize-panes」を実行して設定をトグルしているだけです。

F11:ウィンドウとペインのサイズ変更

F11キーはGNOMEアプリケーションのフルスクリーンに使われるため割り当てられていません。

Alt-F11は現在のペインを新規ウィンドウに移動します(break-pane⁠⁠。それに対してShift-F11は現在のペインを「一時的に」現在のウィンドウで最大化します(resize-pane -Z⁠⁠、もう一度Shift-F11を押すと元に戻ります。

Ctrl-F11は現在のペインを「1つ前のウィンドウ」に統合します(join-pane⁠⁠。何度も押すと、ペインがウィンドウの間を移動していく様子がわかるでしょう。

F12:その他の設定

F12キーは初期設定でのプレフィックスキー(エスケープシーケンス)として使われます。Shift-F12はByobuのFキーバインディングの有効・無効切り替えです。

Alt-F12はtmuxのマウスサポートのオン・オフを切り替えます。初期状態ではオフになっています。マウスサポートをオンにすると、ウィンドウ名のクリックでウィンドウの切り替えや、ペインの領域クリックによるカレントペインの切り替え、ペインの枠のドラッグでサイズ変更ができるようになります。ssh越しでByobuを実行していても、リモートのByobuにマウスイベントが送られるようです。

Ctrl-Shift-F12を押して何が起こるかは自分の目で確かめてください。

ちょっと便利なスクリプトたち

Byobuはbyobuコマンドだけでなく、上記のショートカットを実現するためのいくつかのシェルスクリプトなども、/usr/bin以下にインストールします。

byobu-promptコマンドは、直前のコマンドのエラー時に「$?」を$PS1の前に表示するかどうかを設定するコマンドです。何かのコマンドが静かに失敗したとしても気がつけるので、有効にしておくといろいろ便利です。

wifi-statusコマンドは、iwconfigやroute、syslogのtailなどを1つのウィンドウにまとめて表示するツールです。

図9 wifi-statusコマンドによるウィンドウ
図9 wifi-statusコマンドによるウィンドウ

ctailは「tail -F」の結果をcczeで色を付けたうえで表示します。上記のwifi-statusのsyslogの汎用版です。なおwifi-statusやctailを使う場合はあらかじめcczeパッケージもインストールしておいてください。

より新しいByobu 5.94からインストールされるようになったvigpgは、GPGで暗号化されたファイルを復号し、sensible-editorで開き、保存したら自動的に再度暗号化するコマンドです。

一部Byobuの用途とはあまり関係ないようにも見えるかもしれません。これらのスクリプトは原則として同じDustin Kirklandが開発しているbikeshedからよく使いそうなツールを持ってきた、という形になります。

また/usr/lib/byobu以下にはステータス表示を行うためのスクリプト群がまとまっています。自前のステータスを作成する際の参考にすると良いでしょう。

Bash+ByobuでステータスにGitのブランチ名を表示する

Gitを使っていると、しばしばワーキングツリーがどのブランチなのか知りたくなります。ただ毎回「git branch」と入力するのも面倒なので、Byobuのステータスラインに表示してくれると便利です。

zshにはvcs_infoという、Gitだけでなくバージョン管理システム全般の情報を取得する仕組みが存在します。さらにprecmdを組み合わせれば、プロンプトやウィンドウ名にブランチ名を表示できるぐらいならすぐに実現できるようです。

今回のターゲットであるBashはvcs_infoもprecmdもありません[4]⁠。しかしながらGitパッケージには/usr/lib/git-core/git-sh-promptという、リポジトリのステータスを取得するスクリプトが存在するのでこれを使うことにしましょう。

Byobuには、⁠$BYOBU_CONFIG_DIR/bin/」以下に「数字_スクリプト名」というスクリプトを用意すると、数字で指定した秒間隔でスクリプトを実行し、その結果をステータス欄に表示する「custom」ステータスが存在します。customステータスを有効にするにはまず、F9キーの設定画面から「ステータス通知に切り替え」にて「custom」を選択してください。

次に「$BYOBU_CONFIG_DIR/bin/01_vsc_info」という名前のファイルを以下のような内容で作成します。

#!/bin/bash -e

PKG=byobu
. /usr/lib/byobu/include/common

CURDIR=$(tmux list-panes -F "#{pane_active} #{pane_current_path}")
CURDIR=$(echo $CURDIR | grep "^1" | cut -d' ' -f2-)
BRANCH=""
if [ -e /usr/lib/git-core/git-sh-prompt ]; then
    . /usr/lib/git-core/git-sh-prompt
    cd "$CURDIR" && BRANCH=$(__git_ps1 %s);
fi
STATUS=$(color m W; printf $BRANCH; color -)
echo $STATUS

あとは実行権限を付けて、Gitリポジトリ以下に移動するとブランチ名がステータス欄に表示されるはずです。別のリポジトリを表示している別のウィンドウに移動すると、表示が切り替わることも確認しておきましょう。何も表示されないようであれば、⁠$BYOBU_CONFIG_DIR/bin/01_vcs_info」を実行して、その結果が正しいかどうかをまず確認しましょう。

「tmux list-panes」は現在のウィンドウのペイン一覧を表示するコマンドです。pane_activeはアクティブペインに1、それ以外は0と表示します。pane_current_pathはそのペインのパスを表示します。残りのgrepとcutを使って、現在のアクティブペインのパスを取得しているということになります。

colorは/usr/lib/byobu/include/commonから取り込まれているshutilsで定義されている、tmux用の色変更コマンドを出力する関数です。

ファイル名に「01」とついていることからわかるように、これは常に1秒ごとに実行されるとても非効率なスクリプトです。よってステータス欄に表示するということはあまりせず、イベントをフックしやすいウィンドウ名やプロンプト名を変更する形の方が良いでしょう。ただtmuxは現在、各コマンドをフックできる仕組みを実装中なので、これが取り込まれればステータス欄への表示も現実的になるかもしれませんね。

おすすめ記事

記事・ニュース一覧