ITエンジニアのための勉強会・イベントレポート情報メディア

それゆけ!ターミナル部 第11回tmuxをカスタマイズして使いやすくしよう!
skill

それゆけ!ターミナル部 第11回
tmuxをカスタマイズして使いやすくしよう!

2017.03.21

 
  • このエントリーをはてなブックマークに追加

みなさんこんにちは!ターミナル部部長のタナカトモフミです。

本連載では意外と見落としがちな基本的な事柄からちょっとマニアックなテクニックまで、ターミナルを使いこなすための方法を若手エンジニアのタミ夫くんとシェルスキー先生と一緒に学んでいきます。

今回は2回連続tmux紹介の後編です。前回はtmuxの基本的な使い方を解説しましたが、今回はtmuxをより活用するためのカスタマイズ方法を紹介します。tmuxを活用してより快適なターミナルライフを送りましょう。

タナカトモフミ

前回tmuxの基本的な使い方を教わったタミ夫くんですが、シェルスキー先生からtmuxをより便利にカスタマイズできると聞いて待ちきれない様子です。

はい、じゃあ早速教えてもらっていいスか?

いろいろかっ飛ばすのう。前回は tmux の基本的な使い方を紹介したんじゃったな。

そうっすね。だいたいどんなことできるか?どう使うかみたいなのはもうオッケーっス。

で、今回はtmuxのカスタマイズじゃな。今回は自分好みの設定でカスタマイズして使いやすくするのが目標じゃ。

大好物っス。じゃ、とりあえず本題言ってもらっていいっスか?

お、おう・・・

設定ファイルの変更方法を覚えよう!

tmuxをカスタムするための設定ファイルは、ホームディレクトリ以下の「.tmux.conf」というファイルになります。

まずは、作成してみましょう!

# お好みのエディタで ~/.tmux.conf を開く
$ vim ~/.tmux.conf


# .tmux.conf ファイルの内容を以下にして保存する
set-option -g status-right "#[fg=black][%Y/%m/%d %H:%M:%S]"

設定ファイルが保存できたら、一度tmuxを終了して再起動しましょう。

# kill-server でtmuxのプロセスを落とす
$ tmux kill-server

# セッションがなくなったことを確認する
$ tmux ls

# 再起動する
$ tmux

これで先ほどの設定が反映されました。画面下の緑色のステータスバーに注目してください。右下に日時が表示されるようになっていれば成功です。

このように.tmux.confを変更することで、tmuxの見た目や振る舞いをカスタマイズすることができます。

しかし設定を変更するたびに、再起動をしていては日が暮れてしまいますね。実は以下のコマンドを実行することで設定ファイルをリロードすることができます。

$ tmux source-file ~/.tmux.conf

ただし、設定の種類や順序によっては、うまくいかなくなるパターンもありますので、おかしいなと思ったら、一度「tmux kill-server」をして再起動するようにしましょう。

また、設定ファイルに記載するコマンドは、tmuxのサブコマンドでもあります。そのため、設定ファイルを変更せずともオプションを変えるとどのようになるのか?をその場で試すことができます。例えば、tmuxを起動した状態で、以下のコマンドを実行することで、オプションを変更し反映することができます。

# ステータスバーの右側を赤色の日時表示にする
$ tmux set-option status-right "#[fg=red][%Y/%m/%d %H:%M:%S]"

設定ファイルに書く前に実行して試してみるのも良いでしょう。

主要なオプションを設定しよう!

「set-option」というコマンドを使ってtmuxの設定を変更しました。この「set-option」は様々な種類があり、少しわかりづらくなっていますので、注意が必要です。

まず、「set-option」の種類には、以下5種類あります。主に、設定ファイルで使用されるのは、2番と4番で、次点で1番です。サーバー、セッション、ウィンドウの関係は、前回紹介した通りです。忘れてしまった方は、前回を読み直して復習しておきましょう。

1. Server Option サーバーオプション
  • ● tmuxのサーバープロセス全体で共有されるオプション
  • ● コマンド「set-option -s」で指定する
  • ● Windows/Sessionの単位で変更することができないオプション
2. Session Global Option セッショングローバルオプション
  • ● セッション全体で適用されるデフォルトのオプション
  • ● コマンド「set-option -g」で指定する
3. Session Option セッションオプション
  • ● 個別のセッションでオプションを上書きする
  • ● 例: ステータスバーの表示・非表示を切り替える「status」オプションをグローバルでは「on」にするが特定のセッションでは「off」にすることができます。
  • ● コマンド「tmux set-option」 で指定することで、現在のセッションにだけの設定を反映できます。
4. Window Global Option ウィンドウグローバルオプション
  • ● ウィンドウ全体で適用されるデフォルトのオプション
  • ● コマンド「set-option -w -g」で指定する
5. Window Option ウィンドウオプション
  • ● 個別のウィンドウでオプションを上書きする
  • ● 例: コピーモードのキーバインドのオプション「mode-keys」を、グローバルでは「vi」、一部のウィンドウでは「emacs」にすることができます。
  • ● コマンド「set-option -w」で指定する

このように、セッションやウィンドウなどの管理単位ごとに設定できるオプションが違うということを認識しておきましょう。

また、混乱しやすい要素として、「set-option」は、「set」というエイリアスがあるため、省略できます。さらに、ウィンドウオプションはよく使われるため、「set-window-option」というコマンドがあり、これは「set-option -w」と同義です。そして、「set-window-option」は、「setw」というエイリアスがあるため、「setw」で使用できます。

一度整理します。まずは以下のことを覚えておきましょう!

  • ● 「tmux set-option」コマンドで、設定を即時に反映できる
  • ● オプションの管理もサーバー、セッション、ウィンドウの単位で分かれている
  • ● セッション、ウィンドウは、全体に影響するグローバルな値と個別の値を分けることができる
  • ● 設定ファイルで使うのは、「set -g」と「setw -g」がほとんど

変更方法はわかりました、続いて現在の設定を表示する方法を紹介します。

# サーバーオプションを表示する
$ tmux show-options -s

# セッショングローバルオプションを表示する
$ tmux show-options -g

# 現在のセッションにだけ適用されたオプションを表示する
$ tmux show-options

# ウィンドウグローバルオプションを表示する
$ tmux show-options -wg
# 以下も同じ
$ tmux show-window-options -g

# 現在のウィンドウにだけ適用されたオプションを表示する
$ tmux show-window-options

それぞれ異なる表示がされたのではないでしょうか?詳細な設定の一覧は、「man tmux」で確認しましょう。

ここでは、よく設定されるオプションを簡単に紹介します。

#
# 「set -g」で指定するセッションオプション
#

# プレフィックスキーの変更
# デフォルトで C-b になっているプレフィックスキーも任意の値に変更することができます。
# ここでは C-a に変更する場合の例です。好きなキーに置き換えて設定してください
set -g prefix C-a
# bind-key/unbind-key は後ほど紹介します
bind-key C-a send-prefix
unbind-key C-b

# ウィンドウの番号の開始位置を指定。デフォルトは0。以下は1からにする例。
set -g base-index 1

# マウスによる操作のサポート有効化
set -g mouse on

# ステータスバーの表示: ステータスバーのカスタマイズは後ほど紹介します
set -g status on


#
# 「setw -g」で指定するウィンドウオプションの例
#

# コピーモードのキーバインドをviにする
setw -g mode-keys vi

# ペインの番号の開始位置を指定。デフォルトは0。以下は1からにする例。
setw -g pane-base-index 1

キーバインドをカスタマイズしよう!

キーバインドを設定するコマンドは「bind-key」と「unbind-key」の2つです。「bind-key」では、どのキーを押したらどのコマンドを実行するか?を指定します。逆に「unbind-key」は、bind-keyで設定されたキーを解除します。

早速カスタマイズしてみましょう!今回は、プレフィックスキーの後に、「r」を押した場合の挙動を設定してみましょう。「~/.tmux.conf」を開いて以下を追記します。

# 書式: bind-key <キー> <コマンド>
bind-key r source-file ~/.tmux.conf

# スペースのような特殊な文字の指定もあり
bind-key Space next-window

# 大文字・小文字の区別もあり。大文字の場合はシフトを押しながら入力しましょう
bind-key R source-file ~/.tmux.conf

# シフトキーを押しながらを指定する場合は 「S-」をつける
# 矢印キーは Up/Down/Right/Left で指定
bind-key S-Up source-file ~/.tmux.conf

スペースキーは、「Space」と表現しますが、通常のキーは「r」など一文字で表現します。また、「bind-key」は、「bind」と省略することができます。同様に「unbind-key」は「unbind」と省略したものを使うことができます。

どんなアクションが使えるのか?は、tmuxのヘルプやmanで確認できますが、既存のキーバインドにどのコマンドが設定されているか?も確認したいことがあります。その場合は、前回紹介したプレフィックスキーの後に「?」を押すことで表示することができますが、同等の表示は、「tmux list-keys」コマンドで表示できます。これは、「?」が「bind-key」で、「list-keys」コマンドを呼び出すように割り当てられているためです。

$ tmux list-keys
bind-key	-T prefix C-b          	send-prefix
bind-key	-T prefix C-o          	rotate-window
bind-key	-T prefix C-z          	suspend-client
bind-key	-T prefix Space        	next-window
bind-key	-T prefix !            	break-pane
bind-key	-T prefix "            	split-window
bind-key	-T prefix #            	list-buffers
bind-key	-T prefix $            	command-prompt -I #S "rename-session '%%'"
bind-key	-T prefix %            	split-window -h
bind-key	-T prefix &            	confirm-before -p "kill-window #W? (y/n)" kill-window
# 長いため省略

「-T prefix」というオプションが表示されますが、これはプレフィックスキーを押した後にキーを押した場合の挙動を設定するという意味です。prefix以外に使うものとしては、「root」があります。「root」ではプレフィックスなしのキーバインドを設定できるので、ウィンドウの移動やペインの移動を割り当てることでスムーズに移動ができるでしょう。

例: Shiftを押しながら 右矢印キーを押すと次のウィンドウに移動する。プレフィックスキーの入力が不要に。

$ tmux bind-key -T root S-Right next-window

さらに、copyモードのキーバインドを変更することもできます。現在のcopyモードのキーバインドは以下のコマンドで確認できます。

$ tmux list-keys -t vi-copy
bind-key -t vi-copy           	C-b page-up
bind-key -t vi-copy           	C-c cancel
bind-key -t vi-copy           	C-d halfpage-down
bind-key -t vi-copy           	C-e scroll-down
bind-key -t vi-copy           	C-f page-down
bind-key -t vi-copy           	C-h cursor-left
bind-key -t vi-copy           	C-j copy-selection
bind-key -t vi-copy         	Enter copy-selection
bind-key -t vi-copy           	C-u halfpage-up
bind-key -t vi-copy           	C-y scroll-up
# 長いため省略

Emacsバインドの場合は、「-t vi-copy」を「-t emacs-copy」に置き換えることで確認できます。

$ tmux list-keys -t emacs-copy
bind-key -t emacs-copy            	C-Space begin-selection
bind-key -t emacs-copy                	C-a start-of-line
bind-key -t emacs-copy                	C-b cursor-left
bind-key -t emacs-copy                	C-c cancel
bind-key -t emacs-copy                	C-e end-of-line
bind-key -t emacs-copy                	C-f cursor-right
bind-key -t emacs-copy                	C-g clear-selection
bind-key -t emacs-copy                	C-k copy-end-of-line
bind-key -t emacs-copy                	C-n cursor-down
bind-key -t emacs-copy                	C-p cursor-up
# 長いため省略

キーバインドをより使いやすくするために、一緒に使われる機能を紹介します。

複数のコマンドを実行するパターン

先ほど以下のように設定して、設定ファイルをリロードするキーバインドを設定しました。

bind-key r source-file ~/.tmux.conf

しかしながらこのキーバインドを実行したところで、本当にキーバインドを押せてコンフィグがリロードされたのか?はパッと見ではわかりません。このようなケースでは、「display-message」コマンドを使うことで、ステータスバーに任意の文字列を表示することができます。

# \; で繋いで、display-message コマンドも実行するようにする
bind-key r source-file ~/.tmux.conf \; display-message "Reloaded ~/.tmux.conf"

実行前にプロンプトを出すパターン

ウィンドウの削除「kill-window」のような、うっかり押したら大打撃を受けるようなキーバインドは大変危険です。そこで、うっかり押しても大丈夫なように、「yes|no」プロンプトを出す「confirm-before」コマンドが用意されています。

デフォルトの設定でも、「kill-window」と「kill-pane」のショートカットは以下のように安全に作られています。

$ tmux list-keys | grep confirm
bind-key	-T prefix &            	confirm-before -p "kill-window #W? (y/n)" kill-window
bind-key	-T prefix x            	confirm-before -p "kill-pane #P? (y/n)" kill-pane
# 書式: confirm-before -p "プロンプトメッセージの内容" <コマンド>
confirm-before -p "本当にkill-windowしていいですか?(y/n)" kill-window

# コマンドは「y」が入力された場合にのみ実行される
# 入力がなかった場合、「n」が入力された場合は、コマンドは実行されない

使い方は簡単なので説明するほどではありませんが、例によって、「confirm」というエイリアスが用意されていますので、「confirm」だけで大丈夫です。また、「#W」、「#P」という意味ありげな文字列が指定されています。これは、特別な変数で、tmuxから渡される変数を展開して利用することができます。

コマンドで使用可能な代表的な変数を紹介します。

変数説明
#W 現在のウィンドウの名前
#I 現在のウィンドウのインデックス番号
#S 現在のセッションの名前
#P 現在のペインのインデックス番号

実行時に任意の文字列を受け取りたいパターン

「rename-window」や「rename-session」のように、名前を指定するようなコマンドがあります。これをキーバインドに設定したい場合には任意の文字列の入力が必要になりますが、このようなインタラクティブな方法をサポートする「command-prompt」というコマンドも用意されています。

デフォルトでは以下のように使われています。

$ tmux list-keys | grep command-prompt
bind-key	-T prefix $            	command-prompt -I #S "rename-session '%%'"
bind-key	-T prefix '            	command-prompt -p index "select-window -t ':%%'"
bind-key	-T prefix ,            	command-prompt -I #W "rename-window '%%'"
bind-key	-T prefix .            	command-prompt "move-window -t '%%'"
bind-key	-T prefix :            	command-prompt
bind-key	-T prefix f            	command-prompt "find-window '%%'""'"

「command-prompt」の使い方を、「rename-window」のキーバインドを例に解説します。

bind-key	-T prefix ,            	command-prompt -I #W "rename-window '%%'"

「-I」オプションが設定されています。これは、入力画面の初期表示の内容を指定するものです。このケースでは、変数「#W」(つまり 現在のウィンドウの名前)を指定しています。「-I」の指定がない場合は、初期の入力部分は、何も入力がない状態で表示されます。command-promptの最後には、入力が終わった際に最後に実行するコマンドを指定します。「%%」 は、入力された内容を表す特殊な文字列です。

実は、入力は複数受け取ることができますが、あまり使われていないためここでは割愛します。複数の入力を受け取りたくなった場合には、「man tmux」の「command-prompt」を確認してみてください。

また、「-p」オプションは、入力文字列の前に、表示するプロンプトの内容を指定できます。

ステータスバーをカスタマイズしよう!

ここでは、オプションの設定では省略した、ステータスバーのカスタマイズ方法を紹介します。まずは主要なオプションを紹介します。

オプション説明
status ステータスバーの有効・無効を指定します。「on」か「off」が指定できます。セッションオプションなので、セッションごとに表示・非表示を切り替えることもできます。
status-interval ステータスバーの更新間隔を秒で指定します。例えば時刻を秒まで表示した場合、デフォルトでは15秒なので、何も操作しないと15秒単位でしかステータスの時刻が更新されません。
status-left ステータスバーの左側に表示する内容を指定します。デフォルトでは「"[#S] "」となっており、これはキーバインドで紹介した変数セッション名の表示となります。
status-left-length status-leftの長さを指定します。デフォルトは10です。
status-right ステータスバーの右側に表示する内容を指定します。デフォルトでは「" "#{=21:pane_title}" %H:%M %d-%b-%y"」となっており、ペインのタイトルと日時が表示されます。
status-right-length status-rightの長さを指定します。デフォルトは40です。
status-position ステータスバーの表示位置を指定します。デフォルトは「bottom」で下部に表示されます。その他「top」が指定でき、上部に表示されるようになります。
status-style ステータスバーの表示のスタイルを指定します。デフォルトでは、「fg=black,bg=green」となっています。スタイルの書式は後述します。

スタイルの書式について

背景や文字の色を指定したり、太字、下線といったスタイルの書式について説明します。

文字の色は「fg=カラー」、背景は「bg=カラー」で指定します。カラーで指定できるのは、「black, red, green, yellow, blue, magenta, cyan, white」に加えて、「color0」から「color255」の256色も指定することができます。

太字、下線といった属性は「bright (or bold), dim, underscore, blink, reverse, hidden, or italics」が指定できます。複数のものを指定する場合は、以下のようにカンマ区切りで指定することができます。

# , 区切りで複数の内容を指定する
set -g status-style fg=yellow,bold,underscore,blink

# blinkなど逆にoffにしたい場合は、noをつける
set -g status-style fg=yellow,nobold,nounderscore,noblink

# set-optionの-aオプションを使うと指定を複数行に分割することもできる
set -g status-style fg=yellow
set -g status-style bold
set -g status-style underscore

status-styleに適用するとステータスバー全体に影響しますが、個別に変えることもできます。同様のスタイルの書式が使えるオプションがたくさんありますので、それぞれ調べてカスタマイズしていきましょう。

以下はスタイルの書式を使用可能なオプションの例です。

オプション説明
message-style ステータスバーに表示するメッセージの書式を指定します。セッションのオプションです。
status-left-style ステータスバーの左側のスタイルを指定します。セッションのオプションです。
status-right-style ステータスバーの右側のスタイルを指定します。セッションのオプションです。
mode-style コピーモード時に右上に出る表示のスタイルを指定します。ウィンドウのオプションです。
window-status-current-style 現在いるウィンドウのステータスバーでの表示スタイルを指定します。ウィンドウのオプションです。
window-status-separator ステータスバーに表示されるウィンドウの一覧の区切り文字を指定します。デフォルトでは「" "」になっています。

tmuxにプラグイン機能を追加してくれる tpm (Tmux Plugin Manager) を使ってみよう!

ここまでで、見た目や振る舞いをカスタマイズする方法がわかりました。続いては、よくあるカスタマイズをプラグインという形で、簡単に管理できるようにしてくれる「tpm」を紹介します。

tpmを使って、プラグインをインストールすることで、便利なキーバインドや機能を使うことができるようになります。以下のコマンドを実行して、インストールして使ってみましょう。

$ git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm

「~/.tmux.conf」の下部に以下の設定を追記します。

# 使用するプラグインの一覧を指定
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-yank'
# GitHubのリポジトリが指定できるので独自のプラグインも簡単に読み込めるようになります
# set -g @plugin 'github_username/plugin_name'

# Tmux plugin managerを初期化する
run '~/.tmux/plugins/tpm/tpm'

設定ファイルをリロードすると、tpmのキーバインドが有効になっています。プラグインをインストールするキーバインドは、プレフィックスキーの後に、「I」です。
これでプラグインがインストールされ、有効になります。また、プレフィックスキーの後に「U」で、プラグインのアップデートをすることができます。
おすすめのプラグインを紹介します。

プラグイン説明
tmux-resurrect tmuxの状態(セッション、ウィンドウ、ペイン)を保存しておいて、復活させることができます。コンピューターのシャットダウン後もすぐに復帰して作業できるので非常に便利です。
tmux-yank tmuxのコピーモードでコピーした内容をOSのクリップボードに連携する設定などをしてくれます。
tmux-pain-control tmux-pain-control

その他にも幾つかのプラグインがあります。使わずとも設定のカスタマイズ方法の参考に覗いてみると良いでしょう。

まとめ

おや、タミ夫のやつがなんか偉そうに喋っとるのう。

これが、セッション、ウィンドウ、ペインの意味っス。キーバインドの設定はこんな感じっス。

何をしとったんじゃ?

あーtmuxの使ってみたいって言ってる人がいたんで、教えてあげてたんスよ。やっぱ便利なツールや知識は共有してなんぼじゃないスか?

たまにはまともなことも言えるんじゃな。成長が嬉しいわい。

いやいやまだまだっスわー。これからもよろしくお願いしますよー。

お、おう。(あれ?なんかいい子っぽい。しかしタミ夫ともそろそろあれの時期かのう・・・)

次回はいよいよ最終回、タミ夫くんもターミナル部を卒業する時がやってきてしまいました。ターミナル部最後の部活動でシェルスキー先生はいったいどんなテクニックを教えてくれるのでしょうか?そしてタミ夫くんは無事ターミナル部を卒業して一人前のエンジニアになれるのでしょうか?お楽しみに!!

原稿: 株式会社ビズリーチ ターミナル部部長 タナカトモフミ

株式会社ビズリーチ所属。ScalaコードをVimで書く日々をおくる。たまにうっかりIntellij IDEAに浮気してしまう。社内のVim部とEmacs部を和解させ、ターミナル部に統合することに成功したが、社内はEclipse, Intellij IDEA, Sublime Text, Atomが主流のため、戦いは続く。

https://twitter.com/tanacasino

それゆけ!ターミナル部 第11回tmuxをカスタマイズして使いやすくしよう!

この記事はどうでしたか?

おすすめの記事

キャリアを考える

BACK TO TOP ∧

FOLLOW