はじめに
セットアップ シリーズ、tmux 編。
tmuxは、意外と「導入」も「基本的な使い方」も簡単だし(高機能なだけ)、何より恐ろしいくらいに便利。
ただ、設定ファイルは「ゼロコンフィグ」とは到底呼べない上、バージョンアップ頻度が高くて書き方が割と変わる。
基本的に公式ドキュメントを参照して欲しい。
環境:
OS | 端末エミューレーター | tmux |
---|---|---|
macOS 10.15 Catalina | ターミナル.app | tmux 3.1c |
Ubuntu 20.04 LTS on WSL 2 | Windows Terminal v1.5.10271.0 | tmux 3.0a |
プラグインなし、配色以外は極力デフォルトの設定で説明する。
以下、「端末エミューレーター」を「端末」と呼ぶ。
端末多重化ソフトウェアとは?
tmux について説明する前に、端末多重化ソフトウェア(Terminal multiplexer)について。
特徴:
- 「1 つの端末」で「複数の仮想的な端末」を扱える(画面分割やタブ切り替えが可能に)
代表的なソフトウェア:
-
tmux(ティーマックス、2007 年 ~)
- 本ドキュメントで説明する。
- 積極的に開発が続けられており、現在のリリース間隔は 約 6 ヶ月ごと。
-
GNU Screen(グニュー スクリーン、1987 年 ~)
- 開発は続けられているが、特に理由がなければ後発の tmux を使えば良い気がする。
-
Byobu(びょうぶ、屏風、2009 年 ~)
- tmux および GNU Screen を便利に使うためのラッパースクリプト。
- しかし、macOS での動作は問題が多いので採用を断念。(2020 年現在も解消されていない)
インストール & 初期設定
確認:
tmux
が未インストール、または、バージョンが古ければ、最新版の tmux
をインストールする。
which tmux && tmux -V
macOS でのインストール:
後述のコピーモードで使う pbcopy
コマンドは OS 標準なのでインストール不要。
brew install tmux
Ubuntu でのインストール:
後述のコピーモードために xsel
もインストール。より高機能な xclip
でも良いが、xsel
で十分。
sudo apt install xsel tmux
RHEL/CentOS でのインストール:
RHEL/CentOS 6、7、8 はメインリポジトリにある tmux のバージョンが古いので、galaxy4 リポジトリを使う。
cf. https://github.com/tmux/tmux/wiki/Installing#red-hat-enterprise-linux--centos-rpms
# sudo yum install http://galaxy4.net/repo/galaxy4-release-<release>-current.noarch.rpm
# RHEL/CentOS 7 の場合:
sudo yum install http://galaxy4.net/repo/galaxy4-release-7-current.noarch.rpm
sudo yum install xsel tmux
共通:
# バージョン確認
❯ tmux -V
tmux 3.1c
# "VISUAL" または "EDITOR" の環境変数を確認
## tmux では、これらの環境変数のいずれかが
## "vi" を含む場合は「vi スタイル」のキー入力となり、
## そうでない場合は「emacs スタイル」のキー入力となる。
❯ echo "${VISUAL}/${EDITOR}"
vim/vim
# 本ドキュメントでは、「vi スタイル」のキー入力を例に説明する。
# 設定ファイル作成。下記の内容をコピペする。
❯ vi ~/.tmux.conf
# ================================
# 基本設定
# ================================
# TERM 環境変数のデフォルト値を変更 (MUST)
## デフォルトは screen なので、端末エミューレーターに合わせて変更
set -s default-terminal 'xterm-256color'
# エスケープキー入力後の待ち時間 (MAY)
## デフォルトの 500 ミリ秒が長ければ短くする
set -s escape-time 10
# マウス操作を有効に (SHOULD)
## コピーモードはマウス操作の方が圧倒的に便利なので推奨
set -g mouse on
# 各ペインで保持する行数を変更 (MAY)
## デフォルトの 2000 行が少なければ、多めにしておくとコピーモードで便利
## ただし、巨大にしすぎるとメモリを圧迫する
# set -g history-limit 6000
# ステータスラインの更新頻度を変更 (MAY)
## デフォルトの 15 秒が遅ければ短くする
# set -g status-interval 1
# ウィンドウ名の自動更新を停止 (MAY)
## off にすることで、特に低スペックな PC で CPU 負荷を下げることができる
# setw -g automatic-rename off
# Home / End キーが動作しない問題への対応
## cf. https://stackoverflow.com/a/55616731
bind-key -n Home send Escape "OH"
bind-key -n End send Escape "OF"
# PREFIX キーを C-b から変更 (MAY)
# set -g prefix M-f
# unbind C-b
# bind M-f send-prefix
# ================================
# コピーモード
# ================================
# コピーモードでバッファにコピーされた内容をクリップボードへ送る (tmux 3.2 〜 用) (SHOULD)
# if-shell 'which xsel' 'set -s copy-command "xsel -i"'
# if-shell 'which pbcopy' 'set -s copy-command "pbcopy"'
# コピーモードでバッファにコピーされた内容をクリップボードへ送る (tmux 2.4 〜 3.1 用) (SHOULD)
if-shell 'which xsel' '\
bind -Tcopy-mode-vi C-j send -X copy-pipe-and-cancel "xsel -i"; \
bind -Tcopy-mode-vi Enter send -X copy-pipe-and-cancel "xsel -i"; \
bind -Tcopy-mode-vi MouseDragEnd1Pane send -X copy-pipe-and-cancel "xsel -i"; \
'
if-shell 'which pbcopy' '\
bind -Tcopy-mode-vi C-j send -X copy-pipe-and-cancel "pbcopy"; \
bind -Tcopy-mode-vi Enter send -X copy-pipe-and-cancel "pbcopy"; \
bind -Tcopy-mode-vi MouseDragEnd1Pane send -X copy-pipe-and-cancel "pbcopy"; \
'
# ================================
# ステータスライン
# ================================
# ステータスバーの色を設定する (MAY)
## 緑から灰色に変更
set -g status-style bg=colour236,fg=white
# 左ステータスの最大幅 (MAY)
## 表示項目を増やすため
set -g status-left-length 30
# 左ステータス: セッション番号、ペイン名(ホスト名) (MAY)
## ssh する度に pane_title に接続先のホスト名が表示されます
## ただし、更新は接続時のみで、切断時は更新されない点に注意
set -g status-left '\
#[bg=colour024,fg=colour255] #S \
#[bg=colour054,fg=colour255] #{=21:pane_title} '
# 右ステータス: システム時計 (MAY)
## 日付フォーマットを変更
set -g status-right '\
#{?window_bigger,[#{window_offset_x}#,#{window_offset_y}] ,} \
%Y-%m-%d(%a) %H:%M'
# 中ステータス: ウィンドウ情報 (MAY)
## アクティブなウィンドウ情報を強調表示
setw -g window-status-separator ''
setw -g window-status-current-style bg=colour239,bold
setw -g window-status-current-format ' \
#[fg=colour119]#I\
#[fg=colour249]:\
#[fg=colour255]#W\
#[fg=colour249]#F\
'
setw -g window-status-style bg=default
setw -g window-status-format ' \
#[fg=colour244]#I\
#[fg=colour237]:\
#[fg=colour250]#W\
#[fg=colour244]#F\
'
# ================================
# ペイン
# ================================
# ペイン ボーダー (MAY)
## 通常の枠線を灰色に、アクティブな場合は白に
setw -g pane-border-style bg=default,fg=colour238
setw -g pane-active-border-style bg=default,fg=colour255
#(参考) tmux の設定を読み込み
## tmux コマンドを実行する度に、設定は自動で読み込まれるため、基本的に実行不要
❯ tmux source-file ~/.tmux.conf
補足:
-
File:Xterm 256color chart.svg - Wikipedia は、256 色の
xterm-256-color
とカラーコード
の対応表。配色を調整する際に便利。 - tmux 2.6 以降、reattach-to-user-namespace の導入は不要に。
-
copy-pipe-and-cancel
オプションでpbcopy
コマンドが単独で使用可能になった。 - なお、tmux 3.2 以降は
copy-command
オプションが登場し、更に簡潔に記載できる。
-
基本用語
特に 👑 のついた用語は頻出するので、覚えておくこと。
用語 | 説明 |
---|---|
tmux サーバー | バックグラウンドで実行される、tmux の状態を保持するプロセス。 tmux コマンドを実行すると自動的に起動し、実行中のプログラムがない場合は自動的に終了する。 |
tmux クライアント | tmux サーバーに接続するクライアント。 普段は意識する必要はないが、サーバーとクライアントに分かれることで、クライアント側で問題が起こっても簡単に復旧できる仕組み。 |
👑 ペイン | tmux 上の仮想的な端末。 ペインを並べて、複数を同時に表示することも可能。 |
👑 ウィンドウ |
ペインを表示する枠。 1 つ以上のペインを持つ。 ウィンドウは 1 度に 1 つずつしか表示できない。 |
👑 セッション | tmux クライアントの接続先。 1 つ以上のウィンドウを持つ。 |
外部端末 | tmux のクライアントとしてセッションに接続する端末。 本例では macOS 標準の「ターミナル.app」を使った。 |
👑 デタッチ | セッションをバックグラウンドで起動させたまま、外部端末に戻る。 |
👑 アタッチ | 外部端末上からセッションに接続。 |
使い方
機能が多いため、まずは 👑 の付いた内容から覚えるのがオススメ。
「ステータス ライン」について
tmux にアタッチすると、画面下部に「ステータス ライン」が表示される。
デフォルト設定だとステータスラインの左側は、以下を意味する。
[<セッション名>] <ウィンドウ番号>:<ウィンドウ名>
なお、<ウィンドウ名> 右側の記号は、以下を意味する。
-
*
: 現在開いているウィンドウ -
-
: 直前に開いていたウィンドウ -
Z
: ペインをズーム中(詳細後述)
例:
[0] 0:foo 1:bar- 2:baz 3:puz*
と表示される場合、以下のことが分かる。
- セッション名は
0
- 4 つのウィンドウが存在:
foo
,bar
,baz
,puz
-
puz
は、現在開いているウィンドウ -
bar
は、直前に開いていたウィンドウ
「PREFIX キー」について
アタッチ中に tmux を操作するには、PREFIX キー
、「任意の操作に対応するキー」を順に入力します。
- 👑
PREFIX キー
のデフォルトはC-b
。 - 例えば、ヘルプを表示するのは
PREFIX キー
->?
キー です。(ヘルプの終了はC-c
)
PREFIX キーを変更したい場合
デフォルトの C-b
は、「カーソル左移動」や「ページ戻し」などの一般的なキーバインドと衝突する。
この記事ではデフォルト設定のまま説明するが、気になるようなら変更した方が良い。
公式の例では C-q
を割り当てているが、(まず使わないとはいえ)画面ロック解除のキーバインドと衝突し、片手だとやや押しづらい。
個人的にはひとまず M-f
(Alt + F
) にしている。
# 例: PREFIX キーを "C-b" から "M-f" に変更
set -g prefix M-f
unbind C-b
bind M-f send-prefix
何のキーを割り当てるかは、以下の記事が参考になるかもしれない。
cf. hotkeys - What's the least conflicting prefix/escape sequence for screen or tmux? - Super User
cf. 新時代だし、対話シェルキーバインドの棚卸しに Ctrl+A〜Z の挙動に思いを馳せてみた | DevelopersIO
セッションの操作
tmux
コマンドを実行すると、自動的に 1 つのウィンドウと 1 つのペインを持つセッションにアタッチします。
細かい話をすれば、このセッションは自動起動した tmux サーバー上に存在し、同じく自動起動した tmux クライアントがこのセッションに接続しています。
なお、セッション上のウィンドウが全て削除された場合、そのセッションも自動的に削除されます。
-
新規作成:
-
tmux
: 👑 セッション名が「自動的に振られる 0 以上の数字」のセッションを作成 -
tmux new -s <セッション名>
: 「任意のセッション名」のセッションを作成
-
-
一覧表示:
-
tmux ls
: デタッチしたセッション一覧を表示
-
-
デタッチ:
-
PREFIX キー
->d
キー: アタッチ中のセッションからデタッチ
-
-
アタッチ:
-
tmux a
: 直前に閉じたセッションにアタッチ -
tmux a -t <セッション名>
: 任意のセッションにアタッチ
-
-
リネーム:
-
PREFIX キー
->$
キー: アタッチ中のセッション名を変更 -
tmux rename -t <変更前セッション名> <変更後セッション名>
: デタッチしたセッション名を変更
-
-
削除:
-
tmux kill-session -t <セッション名>
: デタッチしたセッションを削除
-
ウィンドウの操作
デフォルトで作成されるウィンドの「ウィンドウ名」は実行中の コマンド名
となり、「ウィンドウ番号」は 0
からの連番となります。これらの情報は、画面下部の「ステータスライン」から確認できます。
なお、ウィンドウ上のペインが全て削除された場合、そのウィンドウも自動的に削除されます。
-
新規作成:
-
PREFIX キー
->c
キー: 👑 ウィンドウを作成し、そのウィンドウを表示
-
-
切り替え:
-
PREFIX キー
->n
キー: 次のウィンドウ番号へ移動 -
PREFIX キー
->p
キー: 前のウィンドウ番号へ移動 -
PREFIX キー
->l
キー: 直前に開いていたウィンドウへ移動(往復) -
PREFIX キー
-><ウィンドウ番号>
: 任意のウィンドウを開く
-
-
リネーム:
-
PREFIX キー
->,
キー: ウィンドウ名を変更
-
-
削除:
-
PREFIX キー
->&
キー: 開いているウィンドウを削除 -
tmux killw -t <ウィンドウ番号>
: デタッチしたセッション上のウィンドウを削除
-
ペインの操作
デフォルト作成されるペインは 0
から始まる「ペイン番号」を持ちます。
「ペイン名」は自動的に付与され、ユーザーが任意に変更することはできません。
なお、ペイン上の端末を終了させた場合、そのペインも自動的に削除されます。
-
新規作成(分割):
-
PREFIX キー
->%
キー: 👑 右側に新しいペインを作成(ウィンドウを左右分割) -
PREFIX キー
->"
キー: 👑 下側に新しいペインを作成(ウィンドウを上下分割)
-
-
切り替え:
-
PREFIX キー
->o
キー: 次のペインへ移動 -
PREFIX キー
->;
キー: 直前のペインへ移動(往復) -
PREFIX キー
-> カーソルキー: 任意の方向にあるペインへ移動- カーソルキーを連続で押すことで
PREFIX キー
の入力状態を継続できる。
- カーソルキーを連続で押すことで
-
-
削除:
-
exit
: 👑 端末を終了することで、ペインも自動的に削除 -
PREFIX キー
->x
キー: ペインを削除 -
tmux killp -t <ペイン番号>
: デタッチしたセッション上のペインを削除
-
-
レイアウト変更:
-
PREFIX キー
->z
キー: 👑 一時的に、現在のペインをウィンドウのサイズに最大化(ズーム)- もう一度入力することで元に戻る。
- ズーム中は、ステータスラインの「ウィンドウ名」の右側に
Z
と表示される。
-
PREFIX キー
->!
キー: 現在のペインを新規ウィンドウへ移動 (逆はできないかも?) -
PREFIX キー
->Space
キー: レイアウトを変更 -
PREFIX キー
->Control
キー + カーソルキー: ペインのサイズを変更- Control キーを入力したまま、カーソルキーを連続で押すことで
PREFIX キー
の入力を継続できる。
- Control キーを入力したまま、カーソルキーを連続で押すことで
-
PREFIX キー
->{
キー: レイアウトを維持したまま、現在のペインの位置を一つ前へ -
PREFIX キー
->}
キー: レイアウトを維持したまま、現在のペインの位置を一つ後ろへ -
PREFIX キー
->Control
キー +o
キー: レイアウトを維持したまま、全てのペインの位置を一つずつずらす
-
-
その他:
-
PREFIX キー
->q
キー: ペイン番号を表示 -
PREFIX キー
->t
キー: ペインに時計を表示- キー入力で表示解除。
-
「ツリーモード」について
接続されているセッション、ウィンドウ、ペインの情報を確認する画面として、ツリーモードがあります。
-
PREFIX キー
->w
キー: ウィンドウ表示からツリーモードへ遷移- 画面上部には、ウィンドウやペインなどが表示されます。
- 画面下部には、ウィンドウのプレビューが表示されます。
ツリーモードでは、PREFIX キー
を使わずに、以下のショートカットを利用できます。
-
↑
or↓
カーソルキー: 項目を選択 -
←
or→
カーソルキー: アイテムを展開/折りたたむ -
Enter
キー: ツリーモードを終了し、選択したウィンドウやペインなどへ移動 -
x
キー: 選択対象を終了 -
v
キー: プレビューを表示/非表示 -
q
キー: ツリーモードを終了
「コピーモード」について
ペインを左右に縦分割している場合、マウスカーソルを使って「ひとつのペイン上の複数行」を選択できない。
例えば macOS の ⌘
+ ⌥
+ ドラッグ で範囲選択する方法もあるが、無駄にスペースが入ったりして不便。
tmux ではペインを一時停止する コピーモードがあるので、これを使う。
なお、前述のとおり「vi
スタイル」と、.tmux.conf
で「クリップボードへコピーする設定」をしていることを前提とする。
マウス操作する場合
-
スクロールアップ
orドラッグ中
: 👑 コピーモード開始。ドラッグした範囲を選択 -
スクロールダウン
orドラッグ解除
: 👑 コピーモード終了 & 選択範囲をクリップボードへコピー
キー操作する場合
-
PREFIX キー
->[
: ウィンドウ表示からコピーモードへ遷移- 遷移後、画面右上に現在のペインの行数が表示されます。
-
q
キー: コピーモードをキャンセルして終了 -
カーソルキー: カーソルを移動。
h
,j
,k
,l
キーでも可能 -
Space
キー: 選択開始 -
Escape
キー: 選択状態を解除 -
Enter
キー: 👑 コピーモードを終了 & 選択範囲をクリップボードへコピー -
PgUp
/PgDn
キー orC-u
/C-d
: 半ページアップ/ダウンへ移 -
^
/$
キー: 行頭/末へ -
w
/b
キー: 次の/前の単語へ -
}
/{
キー: 次の/前の段落へ -
g
/G
キー: 最初の/最後の履歴へ -
H
/L
キー: 最初の/最後の表示されている行へ -
?
//
キー: 前方/後方検索-
n
/N
キー: 次の/前の検索結果へ
-
補足:
- マウス操作は便利だが、ペインが分割されている場合に、ドラッグ解除した位置が別ペインだとコピーモードが終了しない。この場合は
Enter
キーを使うと良い。 - アタッチ中は、ダブルクリックによる「単語選択」や、トリプルクリックによる「行選択」ができない。困るが仕方なさそう。
付録: キーバインドの確認
# PREFIX キー テーブルを参照
❯ tmux lsk -Tprefix
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-layout
bind-key -T prefix ! break-pane
(略)
# PREFIX キー テーブルの省略版を参照
❯ tmux lsk -Tprefix -N
C-b Send the prefix key
C-o Rotate through the panes
C-z Suspend the current client
Space Select next layout
! Break pane to a new window
(略)
# コピーモード キー テーブルの中の、C-a を確認
❯ tmux lsk -Tcopy-mode C-a
付録: オプションの細かな説明について
以下は、.tmux.conf
を編集したい方向けの情報です。
「どんなオプションがあるのか」や「どのオプションの種類に該当するのか」は公式ページを参照してください。
また、より詳細な情報はマニュアルを参照してください。
オプションの種類と、対応する表示/設定のコマンドは、以下のとおりです。
(「ペイン オプション」や「ユーザー オプション」の説明は割愛)
基本的に 👑 の付いたオプションしか使いません。
オプションの種類 | 説明 | コマンド(-option は省略可) |
---|---|---|
👑 サーバー オプション | tmux サーバー全体で共有されるオプション |
show-options -s (show -s )set-option -s (set -s ) |
👑 グローバル セッション オプション | セッション全体で適用されるオプション |
show-options -g (show -g )set-option -g (set -g ) |
セッション オプション | セッションひとつで適用されるオプション |
show-options (show )set-option (set ) |
👑 グローバル ウィンドウ オプション | ウィンドウ全体で適用されるオプション |
show-options -gw ( show-window-options -g , showw -g )set-option -gw ( set-window-option -g , setw -g ) |
ウィンドウ オプション | ウィンドウひとつで適用されるオプション |
show-options -w ( show-window-options , showw )set-option -w ( set-window-option , setw ) |
上記以外の便利なオプションは、以下のとおりです。
-
show-options
(エイリアス:show
) コマンド: 設定を確認します。-
-A
オプション:- 継承されたオプションを含めて表示
- 継承されたオプションには
*
が付与される
-
#(参考) 適用されている status-right オプションの内容を確認
❯ tmux show -A status-right
status-right "#{?window_bigger,[#{window_offset_x}#,#{window_offset_y}] ,}\"#{=21:pane_title}\" %H:%M %d-%b-%y"
-
set-option
(エイリアス:set
) コマンド: 設定を上書きします。-
-u
オプション:- オプション設定の解除
-
set -gu status
なら、グローバル セッション オプションで指定されたstatus
オプションを解除します。
-
-a
オプション:- 指定オプションの末尾に追記
-
#(参考) status-left に foobar とセットする
set -g status-left "foo"
set -ag status-left "bar"
オプションは、tmux 自身が持つ「デフォルト設定」、~/.tmux.conf
の順に適用されます。
「デフォルト設定」は、以下の方法で確認できます。
# デフォルト設定を確認するには、構成ファイルなしで新しい tmux サーバーを起動して show コマンドを実行する
#(参考) デフォルトの「サーバー オプション」
## 変更するには "set -s"(= "set-option -s") オプションを使う
❯ tmux -Lfoo -f/dev/null start\; show -s
#(参考) デフォルトの「グローバル セッション オプション」
## 変更するには "set -g"(= "set-option -g") オプションを使う
❯ tmux -Lfoo -f/dev/null start\; show -g
#(参考) デフォルトの「グローバル ウィンドウ オプション」
## 変更するには "setw -g"(= "set-option -w -g" = "set-window-option -g") オプションを使う
❯ tmux -Lfoo -f/dev/null start\; show -gw
参考文献
-
Home · tmux/tmux Wiki
- tmux 公式サイト
-
tmux(1) - OpenBSD manual pages
- tmux 公式マニュアル
-
tmux を使い始めたので基本的な機能の使い方とかを整理してみた - 完熟トマト
- tmux の利用イメージ
-
tmux チートシート - Qiita
- tmux チートシート
-
GNU Screen と tmux のコマンド比較 - Qiita
- GNU Screen と tmux のコマンド比較
-
それゆけ!ターミナル部 第 11 回 tmux をカスタマイズして使いやすくしよう! | Geekroid
-
.tmux.conf
の細かい説明
-
-
MacOS でも Windows でもまぁまぁ使える tmux + vim 環境を作ってみた - Neo's World
- macOS / Windows の設定共通化
-
tmux のステータスラインの設定を美しくした - 安心院日記
- 配色を参考にさせていただいた。