私をペロペロするがよい

lazy_dog のブログです。

だんだん覚えていく tmux

tmux は Terminal multiplexer と呼ばれる複数のコンソールを管理するソフトウェアです。一つの画面に複数のコンソールを表示したり、Session という単位でコンソールを管理することができます。

f:id:lazy_dog:20170730185640p:plain

今までなんとなく tmux を使用してきたのですが、しっかりと使えるようになりたいと思い、下記の通り勉強しました。

とりあえず使えるようになるために覚える必要があること一覧

  • 各種名称を覚える
  • 初期設定
  • Window の作成、切り替え、削除
  • Pane の新規作成(画面の分割)と削除
  • Pane の切り替え
  • セッションの終了・再開
  • Copy-mode について

各種名称を覚える

“Session” , “Window” , “Pane” を覚えれば OK。

Session

各仮想コンソールの状態を Session という単位で管理する。

Window や Pane の状態、ターミナルの状態をセッションの単位で保存や再開することができる。複数の仮想コンソールの状態を、任意のタイミングで停止(バックグラウンド化)・保存・再開することが可能。

Window

ブラウザで言うところのタブ。Session 内に複数の Window を持つことができる。なお、Window も下記の Pane という形で画面分割することができる。

なお、Window には任意の名前を付けることができ、デフォルトだとシェルの名前($SHELL)になる。

Pane

Window の画面を分割した単位。Pane の状態は Window ごとに持つ。Pane ごとに仮想コンソールを持ち、その分起動しているシェルも増える。

上記の通り、"Session" → “Window” → “Pane” という親子関係というイメージ。

Status bar

tmux のステータス状態やその他もろもろを表す行のこと。タブブラウザのように Window の一覧化を表示したり、時刻を表示したりと、任意の内容を出力することが可能。オシャレなエンジニアはよくここをカスタマイズしている。

初期設定

${HOME}/.tmux.conf が tmux の設定ファイルの保存場所になる。(独断と偏見であるが)必要最低限の設定のみ解説する。キーバインドは後述。

# Window に割り振られる番号の開始。Window 切り替え時、Window 番号をキーで指定し切り替えるため、1 始まりが使用上、楽。
set -g base-index 1

# Prefix Key の指定。tmux の各種コマンドを実行する始点のキーを指定する。C-a が Screen 互換だが、C-t が個人的にオススメ。
set -g prefix C-t

# tmux の各 Pane が保持するヒストリ行の指定。
set -g history-limit 50000

# 好みの問題であるが、マウスサポートが一切不要の場合、下記の通り。
set -g mouse off
set -g terminal-overrides ',xterm*:smcup@:rmcup@'

Status bar の設定はネット上にたくさん掲載されている。設定も複雑なので、詳しい内容は割愛。下記は個人的な設定を記載する。ステータスバーに色々な情報を載せると、確かに見栄えや便利さは上がるのだが、反面 tmux が物凄い勢いで CPU を食いだすのでほどほどに。

# Status bar
set -g status-left '#[fg=black,bg=white]#{?client_prefix,#[reverse][P],}#[default]'
set -g status-right ''
set -g status-interval '0'

# Color
set -g status-bg white
set -g status-fg black
set -g window-status-current-fg white
set -g window-status-current-bg blue
set -g pane-border-fg black
set -g pane-active-border-fg black

Window の切り替え

  • 作成: Prefix Key を押した後、c
  • 切り替え: Prefix Key を押した後、Window の番号の数字キー
  • 削除: シェルから exit するか、Prefix Key を押した後、&
    • pane が一つ(画面分割していない)状態で kill-pane コマンド(Pane を削除する)を実行すると、Window が削除される。

Pane の新規作成と削除

画面分割をすると、Pane が増える。

  • 縦分割: Prefix Key を押した後、%
  • 横分割: Prefix Key を押した後、"

ただし、デフォルトはあまり直感的ではないので、画面に線が入る場所を意識しやすいように -| キーを利用すると分かりやすい。

# 縦分割
bind - split-window -v

# 横分割
bind | split-window -h

カレントの Pane を消すには、Prefix Key を押した後、x。個人的に、Emacs ライクにするため k キーにしている。

bind k confirm-before -p "kill-pane #P? (y/n)" kill-pane

Pane は一個の tty でもあるので、exit や Ctrl + d でも削除できる。

Pane を Window にしたい場合、Prefix Key を押した後、!

Pane の切り替え

  • Pane の切り替えを行うためには、Prefix Key を押した後、o
  • 一つ前の Pane に戻るには、、Prefix Key を押した後、;
  • カレントの Pane から上下左右の任意の Pane に移動したい場合、Prefix Key を押した後、任意のカーソルキー。

Pane はちょっとややこしいけど、作成と切り替えをきちんと覚えれば難しくない。

セッションの終了・再開

基本的に、Session を保存せず tmux を終了させるには、最後の Pane を消す(exit する)ことをすればよい。

ただし、Session を次回以降も再利用したかったりする場合、Session を保存すると良い。これを Detach(デタッチ)と呼ぶ。Prefix Key を押した後 d

再度 tmux を実行すると Session は新規に作成されるが、デタッチされた Session は保存されている。tmux ls で保存されたセッションを一覧表示できる。

~ $ tmux ls
0: 1 windows (created Tue Jul 18 07:42:47 2017) [128x39]
1: 1 windows (created Wed Jul 26 23:26:08 2017) [128x39]

上記だと左端の数字が Session Name となる。デフォルトだと 0 から始まる数字が Session Name となり、Session が増えていく度 1 ずつインクリメントされていく。

最後にアクティブだった Session を再開するには tmux a を実行。Session を再開することを Attach (アタッチ)と呼ぶが、tmux attach -t {target-session} で可能。{target-session} は Session Name を選択する。

$ tmux ls
0: 1 windows (created Tue Jul 18 07:42:47 2017) [128x39]
1: 1 windows (created Wed Jul 26 23:26:08 2017) [128x39]
$ 
$ tmux attach -t 1
  # "1" の target-session を選択しアタッチした。

カレントの Session Name を変更するには Prefix Key を押した後 $

Copy-mode について

各 Pane は history-limit で指定した数の行数分、出力を遡って確認することができる。その Mode のことを Copy-mode と呼ぶ。Copy-mode に移行するには Prefix Key を押した後 [

デフォルトでは less コマンドのように vi キーバインドで見ることができる。下記の通り .tmux.conf に設定すれば Emacs キーバインドとなる。

# Emacs keybind for Copy-mode
set -g mode-keys emacs

あとがき

tmux はとてもカスタマイズブルで設定や機能が大量にあります。本記事では使い方のレクチャを優先して、詳細は書ききれなかったのですが、是非 man を読んでみてください。

http://man.openbsd.org/OpenBSD-current/man1/tmux.1