😺

ターミナル多重化ソフトウェアtmuxの始め方

に公開

ターミナル多重化ソフトウェアであるtmuxは、歴史のあるソフトウェアであり、すでに多くの技術記事やブログが存在します。
本記事は、初心者の観点で覚えることは最小限に、良いところは最大限にtmuxを使えるようになることを狙ったものです。

この記事でできること

本章はtmuxの操作を忘れてしまったらここだけ見て思い出ための自分用メモのようなものです。詳細は次章以降に記載しております。
私は基本的に以下のフローで作業をしています。

  1. 準備
    1. 新しいターミナルを開く。SSHを実行。
    2. tmuxをインストール
    3. (任意)設定ファイルを作成
  2. 画面分割
    1. 起動 tmux a もしできなかったら tmux
    2. 分割 Ctrl+b %, Ctrl+b "
    3. 他の分割画面への移動 Ctrl+b 方向キー
    4. マウスの有効化 tmux set -g mouse on
    5. 分割画面を大きくして見たい時 Ctrl+b z
    6. 作業の中断 Ctrl+b d
  3. 作業切り替え
    1. 分割セットの追加 Ctrl+b c
    2. 分割セット名を作業名に Ctrl+b ,
    3. 分割セットの切り替え Ctrl+b nCtrl+b pまたはCtrl+b w

できるだけ画面分割までで仕事が済むように意識するとよいでしょう。

tmuxの言葉では、

  • 分割した画面→ペイン
  • ペインを束ねたもの(上記で"分割セット"と言っているもの)→ウィンドウ

といいます。
さらにウィンドウを束ねたものとしてセッションというものもありますが、初心者は思い切って使わないという選択もアリかと思います。実際に私も今の所はあまり使わない(使いこなせてない)です。

背景

tmuxが使えると以下のことができるようになります。

  • 1つの画面を複数に分割
  • クライアントPCをシャットダウンしたり、SSH接続が途中で切れてしまったとしてもサーバー側で作業が継続
  • 再接続した際に画面の分割状況や作業ディレクトリなど前回の続きから作業が可能

画面を分割で使うだけであれば以下のような代替案があります。

ただし、SSH先との通信が切れてしまうとターミナルの情報がなくなってしまうため、ターミナルに表示されていたものが消えてしまったり、作業ディレクトリがリセットされてしまったり、現在の分割していた状態が解除されてしまいます。具体例としては、大きなファイルを圧縮したり転送したりしようとしたときに、別の理由でクライアント側のPCの電源や接続を泣く泣く切らなければならないというときもあるかと思います。

そこで、長い歴史を持つtmuxを使ってみようと思い立ったわけですが、いろいろな機能があり初心者にはなかなかとっつきにくそうな印象をうけました。さまざまな技術記事やブログで網羅的に説明されているページは多くありますが、実際にはどこから手を付けたらよいのかわからず、またその量の多さに圧倒されてしまいました。そこでこの記事では、自身が実際に手を動かしてみたtmuxを段階を追って、かつ極力覚えることを少なく使う方法をご紹介します。

インストール

aptで入れる場合

sudo apt install tmux

snapで入れる場合

sudo snap install tmux --classic

Homebrewで入れる場合

brew install tmux

yumで入れる場合

sudo yum install tmux

その他は、公式ページをご参照ください。

使い方

【レベル1】基本動作

まずはtmuxの起動と終了をしましょう。

  • 起動 tmux (ターミナルに入力してEnter。)
  • 終了 exit, Ctrl+d

ここで、Ctrl+dCtrldの同時押しを意味しています。

tmuxを起動をするとターミナルの中でさらにターミナルを開いているような状態になります。現在通常のターミナルを操作しているのかtmuxのターミナルを操作しているかは、ステータスバーの有無で判定できます。

これは通常のターミナルで、

Before starting tmux

tmuxを使用したときのターミナルは下部に緑色のステータスバーが付きます。

After starting tmux

ターミナルの終了はここに示すやり方ですと通常のターミナルと変わりません。作業している途中で中断して次回続きから始めたい場合には、セッションのデタッチとアタッチという操作を使えるようになりましょう。

  • セッションのデタッチ Ctrl+b d
  • 前回のセッションのアタッチ tmux a

ここで、Ctrl+b d の入力の方法はCtrlbを同時押しした後、それらのキーを離してからdを押すということを意味しています。tmuxではCtrl+bをプレフィックスキーといって、これはショートカットキーのトリガーとして働きます。

ターミナル終了を Ctrl+dする代わりにデタッチを行うCtrl+b dで終了し、tmux コマンドの代わり tmux aコマンドで実行するように習慣づけるとよいでしょう。

【レベル2】画面の分割

tmuxの基本としてセッション、ウィンドウ、ペインと段階的に管理できます。しかしながら、それぞれの操作方法を覚えるのが大変なので、まずはペインしか使わないという方針をとろうと思います。ペインとはターミナル画面を分割した1つのターミナルだと思っていただければ大丈夫です。このペイン操作に絞ることにより、覚えるべきショートカット以下の4つに絞れます。

  • 左右分割(右にペインを作成): Ctrl+b %
  • 上下分割(下にペインを作成): Ctrl+b "
  • ペインのフォーカスを移動 : Ctrl+b 方向キー
  • ペインを最大化(またはその解除): Ctrl+b z

例としてCtrl+b %の後Ctrl+b "として分割したときの結果は以下の通りです。

separate with multi pane

左右分割された後は右にフォーカスが移り、右側のペインがさらに上下分割されて右下にフォーカスが移る形となります。
1つのペインを終了したい場合には、Ctrl+b dで終了させてください。

【レベル3】便利な設定

ここから先は必須ではありません。 しかし知っているとちょっと便利になると思います。

まず、以下のコマンドでマウス操作の有効化と無効化を切り替えられます。

  • マウス操作オン: tmux set -g mouse on
  • マウス操作オフ: tmux set -g mouse off

マウスを有効化すると、ターミナルの表示のスクロールが使えたり、ペインのフォーカス切り替えがクリックでできたりします。一方で、ドラッグによる選択ができなくなるため、ターミナルの文字列をCtrl+Shift+cでコピーすることができなくなってしまいます。そのため、文字をコピーしたい場合には、マウス操作をオフに戻すとよいでしょう。
しかしながら、これのオンオフはデフォルトのショートカットには準備されておりません。また、現在がオンなのかオフなのかがわかりにくいという問題もあります。

これらの問題を解決する手段として、tmuxの設定ファイルである~/.tmux.confというテキストファイルを作成してみましょう。ここではマウス関連の他にも、ついでに2つほど追加の設定を混ぜておりますが、詳細は後述します。まずは、tmux a で起動して、Ctrl+b mでマウス操作のオンオフが切り替えられることを確認してください。

# tmux内でも同じ色が出るように設定
set-option -g default-terminal screen-256color
set -g terminal-overrides 'xterm:colors=256'

# セッションがない状態で tmux a で起動すると画面を4分割した状態で始まる
new-session -d
split-window -h
split-window -v
select-pane -t 0
split-window -v
select-pane -t 0

# m キーでマウス操作のオンオフを切り替える
bind m run-shell '
  if [ "$(tmux show -g -v mouse)" = "on" ]; then
    tmux set -g mouse off
  else
    tmux set -g mouse on
  fi
'
# ステータスバーにマウス状態の表示を追加
set -g status-right 'Mouse: #{?mouse,on,off} | %Y-%m-%d %H:%M '

この設定ファイルでは、

  • 色の設定
  • 4分割された状態で始まる
  • Ctrl+b mでマウス操作のオンオフを切り替える
  • マウス状態を表示する
    という4つの処理が書かれております。

色の設定をしないと、tmux内ではecho $TERMがscreenとなってしまい、たとえばコマンドラインを入力する前のユーザー名@ホスト名: カレントディレクトリの表示に色がつかないという状態になります。

4分割で始まる仕掛けとしては、起動時に「新しいセッションを作成、左右分割、上下分割、0番目のペインにフォーカスを移動して、さらに上下分割、0番目ペインにフォーカスを戻す」という処理を順に行っています。通常、何もセッションがない状態でtmux aをすると、no sessionsという表示で返ってきてしまい起動しません。そのために、最初に新しいセッションを作成します。そのついでとしてウィンドウ分割もしてしまいます。Ctrl+b %Ctrl+b "はやや入力しにくい指の動かし方をするため、はじめから分割された状態で作業を開始したいという要望を叶えるものです。適宜好みのレイアウトになるように編集していただければと思います。

最後に、マウス操作のオンオフをCtrl+b mに割り当てる処理を書いています。Ctrl+b mにはもともと「ペインにマークする」という機能が割り当てられていますが個人的にはあまり使うことがないため上書きしてしまっています。オンオフ切り替えの仕組みとしては現在の状態を読み取ってif文で逆の状態に切り替えるように処理しています。また、ステータスはターミナルの下部に表示されるのですが、その右側に既存の時刻に加えてマウスの操作状態も記載するように設定しています。ついでに、デフォルトでは表示されるホスト名を消して、時刻も日本人が馴染みのある形式に変更しています。

以上の~/.tmux.confを作成後、何もセッションがない状態でtmux aと起動すると以下のような画面になるかと思います。

start tmux with my config

すでに前回の作業の中断などのセッションがある場合には、新規で作成せずに前回のセッションを開くことができます。
tmuxaなしで実行した場合には、4分割のセッションに加えて、分割なしのセッションができます。セッションの操作は最後の

正直 ~/.tmux.conf を作り込むことでPREFIXキーも含め独自のキーコンフィグなどオレオレ設定を大量生産できますが、そもそもtmuxが使いたくなる状況がSSH先や配布するDockerイメージなど他の方との共有環境の場合が多かったため、あまり自分仕様にしないという方針を取るべきかと個人的には思います。あると便利ですが、なくても困らない、あっても他の人を困らせないという思想で最小限の設定を目指しました。

【レベル4】ウィンドウの追加

ペインのセットを別に作成したい場合には新しいウィンドウを作成しましよう。

  • ウィンドウ名を変更: Ctrl+b ,
  • 新しいウィンドウを作成: Ctrl+b c (create a new window)
  • 隣のウィンドウに切り替え: Ctrl+b n もしくは Ctrl+b p (next, previous)
  • ウィンドウの一覧を確認して切り替え: Ctrl+b w

ウィンドウに名前をつけておくと何の作業をしているかを認識しやすくなります。

具体例としては以下の画像のとおりです。

はじめに、Ctrl+b ,で現在のウィンドウ名を変更しましょう。名前は何でもよいのですがここではでrosと変えています。

Rename current window name

つぎに、Ctrl+b cで新しいウィンドウを作成します。

Create a new window

最後に作成したウィンドウ名をCtrl+b ,で変更しました。

Rename the new window

Ctrl+b n などでウィンドウを切り替えられるのですが、*がついているのが現在のウィンドウです。

【レベル5】さらなる発展

前章ではペインをまとめたくくりとしてウィンドウの操作について書きました。さらに複数のセッションをまとめたくくりとして、新しいセッションを作ることもできます。しかし覚えることが一気に増えるため、無理に覚えてまで使わなくてもよいかと思っております。

  • 存在するセッションの確認、切り替え: Ctrl+b s
  • 新しいセッションの作成: tmux new -s セッション名
  • セッション名の変更: tmux rename-session -t 現在の名前 新しい名前
  • セッションの切り替え: tmux switch -t mysession

これらは覚えて使いこなすと言うよりかは、思い通りの画面が出てこなかったときには違うセッションに入っていないかtmux lsで確認するなどトラブルシューティング的に使うことはよくあります。

また、詳細は各々で調べていただければと思いますが、以下のようなこともできます。

  • キーボード入力による範囲選択とコピー Ctrl+b [(その後なんやかんや操作が必要)
  • ショートカットを見る Ctrl+b ? (qで抜けられます。)
  • 同一マシンにおいてほかユーザーとセッションを共有(ソケットファイルの共有設定が必要)

しかし、最初はこんなものもあるんだなぁくらいで、無理に覚えようとしなくて大丈夫です。

おわりに

さらにtmuxの機能を知りたい場合には、以上の前提知識や経験をベースにご自身で調べられるようになっているかと思います。こちらなど参考になるかと思います。
また私自身tmux初心者であるため、よりよい運用方法や習得手順もあるかと思います。ぜひフィードバックいただけますと幸いです。

参考

操作のイメージを掴みたい場合
https://qiita.com/KoyanagiHitoshi/items/318d4b8ef3b4e5b87390

有名。コンパクトに機能一覧がある。
https://www.tohoho-web.com/ex/tmux.html

この記事に方向性が近い。チュートリアル的な書き方。
https://qiita.com/shin-ch13/items/9d207a70ccc8467f7bab
https://qiita.com/shoma2da/items/2e68c1e59938eb0c2f83
https://www.redhat.com/ja/blog/introduction-tmux-linux
https://mo-gu-mo-gu.com/tmux-basic/

GitHubで編集を提案

Discussion