6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

セットアップ - tmux

Last updated at Posted at 2021-05-09

はじめに

セットアップ シリーズ、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 のイメージ

代表的なソフトウェア:

インストール & 初期設定

cf. Home · tmux/tmux Wiki

確認:

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
.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) にしている。

.tmux.conf
# 例: 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 キー の入力を継続できる。
    • 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 ドラッグ解除: 👑 コピーモード終了 & 選択範囲をクリップボードへコピー

キー操作する場合

cf. https://man.openbsd.org/tmux#WINDOWS_AND_PANES

  • PREFIX キー -> [: ウィンドウ表示からコピーモードへ遷移
    • 遷移後、画面右上に現在のペインの行数が表示されます。
  • q キー: コピーモードをキャンセルして終了
  • カーソルキー: カーソルを移動。h, j, k, l キーでも可能
  • Space キー: 選択開始
  • Escape キー: 選択状態を解除
  • Enter キー: 👑 コピーモードを終了 & 選択範囲をクリップボードへコピー
  • PgUp/PgDn キー or C-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 -sshow -s
set-option -sset -s
👑 グローバル セッション オプション セッション全体で適用されるオプション show-options -gshow -g
set-option -gset -g
セッション オプション セッションひとつで適用されるオプション show-optionsshow
set-optionset
👑 グローバル ウィンドウ オプション ウィンドウ全体で適用されるオプション 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 オプション:
      • 指定オプションの末尾に追記
.tmux.conf
#(参考) 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

参考文献

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?