Ubuntuには、byobuというtmux/GNU Screenのラッパーコマンドが準備されています。これらのコマンドをうまく利用することで、ターミナル上での作業効率を大きく引き上げることができます。今週は、2013年現在のbyobuの利用方法を紹介します。
Byobu
Ubuntuでは、GNU Screenやtmuxのラッパーコマンドである「byobu」を利用することができます。デスクトップ版には標準では導入されていませんが、次のように操作することで簡単に導入できます(サーバー版ではデフォルトで導入されています) 。
$ sudo apt-get update
$ sudo apt-get install byobu
GNU Screenとtmuxは「ターミナルを便利に利用する」ためのソフトウェアで、1枚のターミナルを擬似的なタブで切り替えられるようにする、バッファを遡れるようにする、といった機能を提供します。tmuxはGNU Screenよりも後に開発されたソフトウェアである分、パフォーマンス面でも機能面でもより強力になっています。
tmuxやGNU Screenに共通する弱点は、EmacsやVim、zshなどと同じように、「 便利だが設定が大変」「 うまく使いこなすにはコマンドを使い分ける必要がある」というものです。ある程度便利に使おうとすると、数十行の設定ファイルを書き、自分に合った設定を取捨選択しなくてはいけません。またコマンドの使い分けのため、新規にScreenやtmuxを起動する場合は「screen」「 tmux」コマンドを、すでに起動されたセッションに再接続する場合には「screen -dr」「 tmux a」を、といった使い分けが必要になります。
byobuはこの問題を解決するために、あらかじめ各種機能が有効になる設定ファイルを提供しています。また、コマンドの使い分けも不要で、「 byobu」を実行するだけで、自動的に必要な操作を判別してくれます。
13.10のbyobu
Ubuntu Weekly Recipeでは、第72回 、第94回 でbyobuを取り上げています。現在では当時とは大きく状況が異なり、byobuはGNU Screenベースからtmux(第127回 で紹介)ベースに変更され、多くの機能が追加されています。あらためてbyobuの機能を見てみましょう。
まず、byobuを起動するには、「 byobu」コマンドを用います。
$ byobu
標準状態では、次のような画面になります。
図1 byobuを普通に起動した状態
まずは動かしてみましょう。「 F2」キー(もしくは後述する「エスケープ」+c)を押すと、新しい「ウィンドウ」が生成されます。このウィンドウは、おおむねタブと同じ働きをします。ウィンドウ間を切り替えるには「F3」と「F4」キー(もしくは「エスケープ」+nまたはp)を用います。
byobuを閉じるときは、「 F6」キー(もしくは「エスケープ」+d)を押します。元のターミナルに戻るはずです。再びbyobu環境に戻るには、「 byobu」コマンドを実行してください。
ファンクションキーをベースにした操作は次のとおりです。ただしファンクションキーはアルファベットよりも押しにくいことがほとんどですし、キーボードによってはFnキーと組み合わせた入力が必要になってしまいます。byobuを充分に活用するのであれば、「 エスケープ」キーシーケンスを利用することをお勧めします。
F2:新しいウィンドウを作る
F3:ひとつ前のウィンドウに戻る
F4:ひとつ次のウィンドウに進む
F5:設定をリロード
F6:セッションをデタッチ
F7:コピー&スクロールバックモードへ切り替え
F8:ウィンドウのタイトルを変更
F9:設定メニューの表示
F12:ターミナルをロック
byobuでは、「 エスケープ」キーシーケンスとして、「 Ctrlを押しながらa」か「F12」を利用します。このうち前者が有効になるかどうかは、「 最初にCtrlを押しながらaを押したとき」の対話メニューに従って決定されます(byobu-ctrl-aコマンドを呼び出すことでも設定できます) 。
Emacsやbashの操作に慣れている場合、「 Ctrlを押しながらa」は行頭ジャンプのキーバインドなので、そのままでは少し使いにくいかもしれません。が、アルファベットに割り当てられていないと使いにくいので、「 byobu-config」コマンドを用いてエスケープシーケンスを設定しておきましょう。
なお、「 Ctrlを押しながらa」をエスケープシーケンスに割り当てていても、「 Ctrl+a→a」( Ctrlを押しながらaを押したあと、Ctrlから指を離してa)で行頭移動のためのCtrl+aを入力することができますので、Ctrl+aのままこの操作に慣れる、というのも有効な方法です。
byobuには非常に多くの機能がありますが、最初は次のことだけ覚えておけば良いでしょう。
byobuの操作は、「 エスケープ操作」にショートカットキーを組み合わせたものである
エスケープ+cでウィンドウ作成、同+n/pでウィンドウ移動
作業の中断にはエスケープ+d
作業を再開するには「byobu」コマンドを実行
エスケープ+?でキーバインド一覧を表示できる
これら以外のショートカットキーは、第127回 を参照してください。
配色の変更
byobuの配色を変更したい場合、次のコマンドを用い、配色プロファイルを選択します。
$ byobu-select-profile
図2 byobu-select-profileによる配色変更。この例ではすでに「8」のblueを選択している
接続ホストごとに配色を変更しておくと便利です。この設定は、~/.byobu/colorに保存されます。環境変数経由での設定は行えません。
また、byobu-promptコマンドを実行することで、bashのプロンプトを色分けするモードに変更することができます。bashの味気ないプロンプトに飽きた方は利用してみてください。
なお、「 Ctrl+Shift+F5」で、押下のたびに自動的に配色を切り替えることもできます。気に入った配色を探す場合や、なにか特別なセッションを作成した場合にはこの方法で配色を変更しても良いでしょう。
ログインシェルとして利用する
byobuを気に入った場合、あるいはbyobuを前提にサーバを利用したい場合、「 byobu-enable」を実行すると、ターミナルないしコンソールが開いたタイミングで、暗黙でbyobuが起動されるようになります。この状態を解除するには「byobu-disable」を使います。
chsh等でログインシェルを変更する場合と異なり、/etc/passwd上のSHELL設定はそのままで、利用しているシェルの設定ファイルにbyobu-launcherを呼び出す設定が追加されます。
Macから接続する場合
Mac OS Xの純正ターミナルからSSHでUbuntuに接続してbyobuを利用する場合、画面表示が正しく行われないことがあります。このような場合は、ターミナルの設定の「ターミナルの宣言方法」で「xterm-color」を選択してください。
また、Macから接続した場合、一部のキー入力が無効になることがあります。このような場合は「TERM=vt100」を環境変数としてセットしてください。「 alias ssh='TERM=vt100 ssh'」しておくと便利です。
ステータスバーが無限に表示される場合
ターミナルの設定によっては、以下のように、ステータスバーが何行にも渡って繰り返し表示される状態になってしまうことがあります。
図3 ステータスバーがおかしな状態に陥った状態
Ubuntuで第18回「VTE_CJK_WIDTH=1」を設定した 環境や、PuTTYやTeraTerm、OS X純正ターミナルなどで「ユニコードのあいまいな文字幅」に関する設定を行った環境からSSH接続を行い、その先でbyobuを起動した(=ターミナルはVTE_CJK_WIDTH=1相当で動いているが、接続先のマシンではそうした事情を把握できない)場合に発生します。
これは、左下に表示される「 」の文字幅が誤認されてしまうためです。問題を遡るとユニコードやglibcの仕様レベルの問題に行き着いて解決が至難なため、byobuには環境変数としてVTE_CJK_WIDTH=1がセットされた状態で起動することで、自動的に回避する設定が入っています。ローカルマシン上ではこの設定だけで回避できるため問題にならないのですが、VTE_CJK_WIDTHはSSH経由では引き渡されないため[1] 、SSH先のマシン側で、byobuを起動する前にVTE_CJK_WIDTH=1をセットするようにします。
端的には、.bashrcや.zshrcなどで、export VTE_CJK_WIDTH=1をセットしてください。この状態で起動すると、byobuの左下のロゴが、「 」から「 」に変化し、問題が発生しなくなります。
もしもこの状態(左下のロゴが「 」 )でも現象が継続し、PuTTYを利用している場合は、PuTTYの設定でUTF-8を有効にしてください。
[1] この設定を適切に引き渡すための合意がどこにもない(VTE_CJK_WIDTHはあくまでlibvteレベルの変数でしかなく、「 あいまいな文字幅」をどのように扱うのか、という統一されたフラグ名称は決まっていない)ので、SSHDでAcceptEnvすることもできない、という深淵が横たわっています。いっそのこと日本語なら常に回避するパッチを投入してくれようか、という判断もあり得ますが、ではVTE_CJK_WIDTHを利用するユーザがどれだけいるのか、という別の問題もあり、あちらを立てればこちらが立たず、という状態にあります。
tmuxの代わりにScreenを使う
tmuxのキーバインドが好みではない場合、GNU Screenバックエンドの以前のbyobuに戻すこともできます。次のように操作してください。
$ byobu-select-backend
図4 byobu-select-backendによる設定変更
設定は各ユーザーの ~/.byobu/backendに保存されます。byobu-select-backendで設定する代わりに、byobu-screenもしくはbyobu-tmuxコマンドを用いて、明示的にバックエンドを指定して起動することもできます。
また、環境変数BYOBU_BACKENDに「tmux」「 screen」を指定することでも変更できます。.bashrcや.zshrcを持ち歩いている場合は、この方法か、byobu-screen/byobu-tmuxをbyobuコマンドのエイリアスにするのが便利です。
表示されるインジケータの変更
byobuの下部には、各種ステータスが表示される欄があります。表示項目を変更するには、byobu-configを実行します。
図5 byobu-configメニュー。「 エスケープシーケンスの変更」からキーバインドの変更を行うことができる。一番下のメニューは、byobu-enable/disableを呼び出す
「ステータス通知の切り替え」で設定を行うことで、画面下部に表示されるステータスバーの内容を変更することができます。
図6 ステータス通知の切り替え。screen-profile時代から極端な変化はない
インジケータとして表示される各種項目は、「 byobu-status-detail」を用いることで一覧することもできます。
図7 byobu-status-detailによる一覧。内部的にはvimとvimのfoldが利用される
ここであまりにもインジケータを増やしすぎると、ウィンドウが表示されるスペースがなくなってしまいます。もしも表示するインジケータが増えすぎて扱いにくい場合、~/.byobu/statusのtmux_left/tmux_right設定を編集してください。この設定項目は、byobuの「サブ表示」のためのものです。「 Shift+F5」で切り替えることができます。
各種エージェントとの再接続
ssh-agentやgpg-agentといったエージェントソフトウェアを利用している場合、「 byobu-reconnect-sockets」を実行することで、byobuをエージェントに再接続することができます。ショートカットとして、「 Ctrl+F5」が割り当てられています(byobuでは、これらのファンクションキーベースのショートカットを利用する場合はエスケープ操作は不要です) 。
ssh -Aなどのエージェントフォワードをした状態でリモートログインした場合などに便利です。
複数のウィンドウを使いこなす
byobu上でエスケープ操作をした後に「Ctrl+F2」すると、既存のウィンドウを分割することができます。分割された各領域内を移動するには、エスケープ操作をした後にカーソルキーを用います。複数の操作を変更するような場合に便利です。
事前レイアウトの展開
あまりにも何度もウィンドウを分割すると、それぞれの表示範囲(ペイン)の狭さが気になってきます。そのような場合、エスケープ操作をした後に、次の操作を行うことでウィンドウを分割することができます。
Alt+1:even-horizontal/縦線で分割
Alt+2:even-vertical/ヨコに分割
Alt+3:main-horizontal/ヨコに分割(偏りあり)
Alt+4:main-vertical/縦線で分割(偏りあり)
Alt+5:tiled/タイル配置
Shift+F8:レイアウトのローテーション
図8 main-horizontalでレイアウトした例。大きなペインがひとつと、小型ペイン3つがその下に並んでいる
また、「 Ctrl+F8」で、レイアウトプリセットを呼び出すメニューを表示することができます(byobu-layout restore) 。これはエスケープ+Alt+1の並び替え機能と異なり、呼び出すことでウィンドウを複数に分割します。新しいレイアウトを創りだした場合、「 Shift+Ctrl+F8」で保存しておくと、このメニューから呼び出すことも可能です。
「プリントスクリーン」
「Shift+F9」を押すと、現在表示されているウィンドウの『スクリーンショット』を撮ることができます。実際にはそのウィンドウの過去のバッファを含め、表示された文字をテキストファイルとしてエディタで開く機能です。
過去に実行したコマンドを確認したり、操作手順をドキュメントにまとめたりする際に便利です。
図9 「 プリントスクリーン」による履歴確認
ファンクションキーの無効化
ターミナルで操作するアプリケーションであっても、ファンクションキーの一部を利用することがあります。このような場合、「 Shift+F12」を押すことで、一時的にbyobuのファンクションキー割り当てを無効にすることができます。