Tmux の魔法のトリック
日々の開発作業において、ターミナルは最もよく使用されるツールの 1 つです。ターミナルでは、さまざまなインタープリターを呼び出してコマンドを実行し、作業を完了できます。ただし、ターミナルのデフォルト機能のみを使用する開発者は、生産性を大幅に向上させる強力なツールやテクニックを見逃している可能性があります。
最も便利なターミナル ツールの 1 つはTmux
です。 Tmux
は、ターミナル ウィンドウで複数のターミナル セッションを同時に実行できるようにするターミナル マルチプレクサで、セッション管理、ウィンドウ分割、ペイン レイアウトなどの多くの便利な機能を提供します。この記事では、 Tmux
の基本概念と、読者が Tmux
を上手に活用して端末の作業効率を向上させるのに役立ついくつかの一般的に使用される機能を紹介します。
確かに oh-my-tmux を使用することはできますが、基本を学ぶと、これらのツールをより使いやすくなります。
1. なぜ Tmux を使うのか?
1.1 端末の再利用
ssh
経由でリモート サーバーに接続した後、デフォルトで対話型インタープリタ (bash
など) に接続するシナリオを想像してください。 zsh
)。同じ対話型インタープリターでは、一度に 1 つのコマンドのみを実行でき、コマンドが完了するまで待ってから次のコマンドを実行できます。しかし、多くの場合、私たちは複数のインタープリターに接続し、複数のコマンドを並行して実行したいと考えています。
たとえば、あなたが大規模なプロジェクトに取り組んでいるソフトウェア開発者であると想像してください。開発を促進するには、アプリケーションの実行、ログの表示、コマンドの実行など、複数のタスクを同時に実行する必要があります。
- まず、ウィンドウを作成し、「コード編集」という名前を付けます。このウィンドウでコード エディターを開き、プロジェクトのコードの作成を開始します。このウィンドウはコード編集に使用され、ターミナル出力を表示するには別のウィンドウを作成する必要があります。
- 次に、別のウィンドウを作成し、「Test」という名前を付けます。このウィンドウでテスト スクリプトを実行し、テスト結果を表示します。
- 同時に、リモート サーバーに接続し、いくつかの展開および管理タスクを実行するための「サーバー」というウィンドウも作成します。
このシナリオでは、開発作業を完了するために複数の異なるウィンドウを開き、ウィンドウを切り替えるたびにキーボードから離れてマウスをクリックする必要があります。このようにして、私たちの効率は大幅に低下します。
次のソフトウェアがあると想像してください。
- これを使用して、インタープリターとのセッションを作成できます。このセッションでは、アプリケーションの実行、ログの表示、コマンドの実行など、複数のタスクを同時に実行できます。
- 次に、これを使用してウィンドウを作成し、「コード編集」という名前を付けることができます。このウィンドウでコード エディターを開き、プロジェクトのコードの作成を開始します。次に、これを使用して、ウィンドウを 2 つのペインに水平に分割し、1 つはコード編集用、もう 1 つはターミナル出力の表示用にします。
- 次に、別のウィンドウを作成し、「Test」という名前を付けます。このウィンドウでは、テスト スクリプトを実行し、テスト結果を表示するためのターミナルを開きます。提供されるショートカット キーを使用してさまざまなウィンドウをすばやく切り替えることができ、コードの作成とテストの実行を簡単に切り替えることができます。
- 最後に、リモート サーバーに接続し、展開および管理タスクを実行するために使用する「サーバー」というウィンドウも作成します。このウィンドウを使用して、ウィンドウを 2 つのペインに垂直に分割するペイン レイアウト機能を提供できます。1 つはサーバーへの接続用で、もう 1 つはコマンドの実行とログの表示用です。
このソフトウェアを使用すると、複数のターミナル ウィンドウを開くことなく、コード編集、テスト、サーバー管理などの複数のタスクを同じターミナル ウィンドウで同時に実行できます。ショートカット キーを使用してウィンドウとペインをすばやく切り替え、さまざまなタスクを簡単に切り替えて、作業効率を向上させることができます。
1.2 永続的なセッション
もう 1 つのシナリオは、サーバーにリモートで接続しており、データ処理、モデルのトレーニング、バックグラウンド サービスなど、完了までに時間がかかるタスクをサーバー上で実行する必要がある場合です。
- 次に、サーバーに接続してタスクを開始し、切断後も実行を継続できるようにします
SSH
。つまり、SSH
セッションが中断されたり、ターミナル ウィンドウを閉じたりした場合でも、タスクはバックグラウンドで実行され続けます。これは、タスクが中断されたり終了したりすることを心配する必要がないため、長時間実行されるタスクに役立ちます。 - しかし
SSH
デフォルトで接続されているターミナルは接続を閉じるとSSH
終了し、まだ実行中の対応するタスクも終了します。 。
したがって、このシナリオでは、SSH
リンクを閉じるか、ターミナル ウィンドウを閉じて再度開くことで、ターミナルとの永続的なセッションを維持できるようにしたいと考えています。以前の動作状態に戻します。
2.Tmuxをインストールする
2.1 パッケージマネージャーのインストール
ほとんどのLinux
ディストリビューションでは、パッケージ マネージャーを使用してインストールを実行できます。たとえば、Ubuntu
では、次のコマンドを使用してインストールできます。
sudo apt-get install tmux
2.2 手動でのコンパイルとインストール
テクノロジーを追求するプログラマとしては、もちろん、ソース コードから手動でコンパイルしてインストールすることもできます。さらに、パッケージ マネージャーのソフトウェア ソースのバージョンが比較的古い可能性があるため、手動でコンパイルしてインストールすることも良い選択です。
まずソースコードをダウンロードして解凍します
mkdir ~/opt/tmux && cd ~/opt/tmux
wget -c https://github.com/tmux/tmux/releases/download/3.3a/tmux-3.3a.tar.gz
tar xzvf tmux-3.3a.tar.gz
mkdir v3.3a && mv tmux* v3.3a
それからコンパイルします
cd v3.3a/tmux-3.3a
./configure --prefix=/home/jack/opt/tmux/v3.3a/
make -j $(nproc)
make install
コンパイルが完了すると、tmux
がすでに存在していることがわかります。
cd ..
tree -L 2 -I tmux-3.3a
最後に、将来のバージョン更新を容易にするためにソフト接続を作成します。
ln -s v3.3a/bin bin
ln -s v3.3a/share share
ll
PS: 環境変数を追加することを忘れないでください。
echo 'export PATH="/home/jack/opt/tmux/bin:${PATH}"' >> ~/.zshrc
3. Tmux の基本概念
始める前に、Tmux
の基本概念を理解しましょう。
Tmux
はC/S
モデルを使用して構築されています。Tmux
コマンドを入力することは、Tmux
サーバーにリンクすることと同じです。今回は、デフォルトで新しい作成が作成されます。セッション、次にセッション内にデフォルトで新しいウィンドウが作成され、ウィンドウ内にデフォルトで新しいパネルが作成されます- 現在のセッションはサーバーに保存されます
Tmux
。このセッションを終了しても、次回このセッションに再接続でき、そこで実行中のコマンドは中断されません。
Tmux
セッション、ウィンドウ、パネル間の接続は次のとおりです。
- 1 つの
Tmux
session
(セッション) には複数のwindow
(ウィンドウ) を含めることができます。デフォルトではウィンドウはセッション インターフェースで埋められているため、これらのウィンドウを実行できます。依存関係なし、大きなタスク。 - 1 つの
window
には複数のpane
(パネル) を含めることができます。ウィンドウの下のパネルはすべて同じインターフェイス内にあります。これらのパネルは依存関係の実行に適しています。 . それらの操作を同時に観察できるようにするための高レベルのタスク。
4. Tmuxの基本的な使い方
4.1 セッションの操作
新しいセッション
tmux セッションの作成は非常に簡単です。構文は tmux new -s session-name
で、tmux
と省略することもできます。管理を容易にするために、次のようにすることをお勧めします。次のようにセッション名を指定します。
tmux # 新建一个无名称的会话
tmux new -s demo # 新建一个名称为demo的会话
注意:
Tmux
デフォルトではセッション間のネストが許可されていないため、このコマンドはセッション外で使用する必要があります
セッションに入ると、端末の下に緑色のステータス バーが表示され、多くの情報が説明されます。
現在のセッションを切断する
しばらくセッションで操作していましたが、セッションを切断して次回も使用できるようにしたいのですが、どうすればよいですか?現時点では、detach コマンドを使用できます。
tmux detach # 断开当前会话,会话在后台运行
面倒だと思われるかもしれませんが、tmux セッションでは tmux ショートカット キーを使用できます。ショートカット キーの組み合わせ Ctrl+b
+ d
を 3 回押して現在のセッションを切断します。
前のセッションに戻る
セッションを切断した後、前回中断したところから作業を続行したい場合は、tmuxattach コマンドを使用する必要があります。構文は tmux attach-session -t session-name
で、< と省略できます。 /a >。通常、次の 2 つの方法のいずれかを使用できます。tmux a -t session-name
または tmux a
tmux a # 默认进入第一个会话
tmux a -t demo # 进入到名称为demo的会话
セッションを閉じる
セッションのタスクが完了したら、セッションを閉じる必要があります。 tmux の kill コマンドを使用できます。kill コマンドには、kill-pane
、kill-server
、kill-session
、 の構文は です。次のように:kill-window
kill-session
tmux kill-session -t session-name
tmux kill-session -t demo # 关闭demo会话
tmux kill-server # 关闭服务器,所有的会话都将关闭
すべての会話を表示
セッション管理の最初のステップは、すべてのセッションを表示することです。次のコマンドを使用できます。
tmux list-session # 查看所有会话
tmux ls # 查看所有会话,提倡使用简写形式
セッション中にたまたま参加してしまった場合はどうすればよいですか?心配しないでください。対応する tmux ショートカット キー Ctrl+b
+ s
を使用できます。このとき、tmux はセッション リストを開き、上下キーを押します。 (⬆︎⬇︎) またはマウス ホイール を使用して、ターゲット セッションを選択できます。左右のキーを押して、セッション ウィンドウを折りたたむか展開します。ターゲット セッションまたはウィンドウを選択した後、Enter キーを押して切り替えを完了します。
セッション名の変更
tmux rename-session
コマンドはセッションの名前を変更するために使用されます。
tmux rename-session -t 0 <new-name>
上記のコマンドはセッション 0 の名前を変更します。
実際には、一般的には現在のセッションの名前を変更するために使用されることが多いため、ショートカット キーを直接使用しますCtrl+b
+ $
4.2 ウィンドウの操作
新しい窓
tmux new-window
コマンドは新しいウィンドウを作成するために使用されます。
tmux new-window
# 新建一个指定名称的窗口
tmux new-window -n <window-name>
ウィンドウを切り替える
tmux select-window
ウィンドウを切り替えるにはコマンドを使用します。
# 切换到指定编号的窗口
tmux select-window -t <window-number>
# 切换到指定名称的窗口
tmux select-window -t <window-name>
ウィンドウの名前を変更
tmux rename-window
コマンドは、現在のウィンドウに名前を付ける (または名前を変更する) ために使用されます。
tmux rename-window <new-name>
ウィンドウのショートカットキー
ウィンドウ操作のショートカットキーを以下に示します。
Ctrl+b c
: 新しいウィンドウを作成すると、ステータス バーに複数のウィンドウの情報が表示されます。Ctrl+b p
:前のウィンドウ(ステータスバーの順)に切り替えます。Ctrl+b n
:次のウィンドウに切り替えます。Ctrl+b <number>
: 指定した番号のウィンドウに切り替えます。<number>
はステータス バーのウィンドウ番号です。Ctrl+b w
: リストからウィンドウを選択します。Ctrl+b ,
: ウィンドウの名前を変更します。
コマンドを使用するよりも、ショートカット キーを直接使用する方がよく使用されるため、これ以上のコマンドは紹介しません。
5. Tmux ショートカット キー
ショートカット キーに関して、最初に認識することは次のとおりです: tmux
のすべてのショートカット キーには同じプレフィックスが含まれており、デフォルトは Ctrl+b
です。プレフィックスが渡されると、コンソールがアクティブになり、コマンド キーが有効になります。前の tmux
セッション関連の操作では、2 つのショートカット キー Ctrl+b
+ d
、 Ctrl+b
+ s
ですが、これは氷山の一角にすぎません。tmux
の巨大なショートカット キー システムを垣間見るには、下の表を参照してください。
5.1 Tmux システムコマンド
接頭語 | 命令 | 説明する |
---|---|---|
Ctrl+b |
? |
ショートカットのヘルプドキュメントを表示する |
Ctrl+b |
d |
現在のセッションを切断する |
Ctrl+b |
D |
切断するセッションを選択してください |
Ctrl+b |
Ctrl+z |
現在のセッションを一時停止します |
Ctrl+b |
r |
現在のセッションを強制的にリロードします |
Ctrl+b |
s |
選択および切り替えのためのセッションリストを表示します |
Ctrl+b |
: |
コマンド ライン モードに入ります。この時点では、ls などのコマンドを直接入力できます。 |
Ctrl+b |
[ |
コピー モードに入り、q を押して終了します |
Ctrl+b |
] |
コピーしたテキストをコピーモードで貼り付ける |
Ctrl+b |
~ |
プロンプト情報キャッシュをリストする |
5.2 ウィンドウコマンド。
接頭語 | 命令 | 説明する |
---|---|---|
Ctrl+b |
c |
新しい窓 |
Ctrl+b |
& |
現在のウィンドウを閉じます (閉じる前に y または n を入力して確認する必要があります) |
Ctrl+b |
0~9 |
指定したウィンドウに切り替える |
Ctrl+b |
p |
前のウィンドウに切り替える |
Ctrl+b |
n |
次のウィンドウに切り替える |
Ctrl+b |
w |
ウィンドウを切り替えるためのオープンウィンドウリスト |
Ctrl+b |
, |
現在のウィンドウの名前を変更する |
Ctrl+b |
. |
現在のウィンドウ番号を変更します (ウィンドウの並べ替えに適用されます) |
Ctrl+b |
f |
ウィンドウをすばやく見つけます (ウィンドウ名に一致するキーワードを入力します) |
5.3 パネルコマンド。
接頭語 | 命令 | 説明する |
---|---|---|
Ctrl+b |
" |
現在のパネルが 2 つの部分に分割され、下側に新しいパネルが作成されます。 |
Ctrl+b |
% |
現在のパネルが左右に2分割され、右側に新規パネルが作成されます。 |
Ctrl+b |
x |
現在のパネルを閉じます (閉じる前に y または n を入力して確認する必要があります) |
Ctrl+b |
z |
現在のパネルを最大化し、もう一度キーを押すと通常に戻ります (v1.8 バージョンの新機能) |
Ctrl+b |
! |
現在のパネルを新しいウィンドウに移動して開きます (元のウィンドウに 2 つ以上のパネルがある場合に有効) |
Ctrl+b |
; |
最後に使用したパネルに切り替える |
Ctrl+b |
q |
パネル番号が表示されますので、数字が消える前に該当する番号を入力すると、該当するパネルに切り替わります。 |
Ctrl+b |
{
|
現在のパネルを前方に移動します |
Ctrl+b |
} |
現在のパネルを後方に移動します |
Ctrl+b |
Ctrl+o |
現在のウィンドウ内のすべてのパネルを時計回りに回転します |
Ctrl+b |
方向键 |
カーソルを移動してパネルを切り替えます |
Ctrl+b |
o |
次のパネルを選択してください |
Ctrl+b |
空格键 |
内蔵パネルのレイアウトを循環する |
Ctrl+b |
Alt+方向键 |
現在のパネルの端を 5 セル分調整します |
Ctrl+b |
Ctrl+方向键 |
現在のパネルの端を 1 セル単位で調整します (Mac のシステム ショートカット キーでカバーされます) |
Ctrl+b |
t |
時計を表示する |
tmux
の滑らかな分割画面機能は、システム、ウィンドウ、パネルの上記のショートカット コマンドによるものです。必要に応じて、ショートカット コマンドを削除して、好きなコマンドをバインドすることができます。 、これにはtmux
の構成が含まれます。
6. Tmux 設定ファイル
.bashrc
および .zshrc
と同様に、tmux も同様の構成ファイルを提供します。設定ファイルを記述することで、より強力な機能を実現できます。
tmux のユーザーレベルの構成ファイルは~/.tmux.conf
です (存在しない場合は作成します)。ショートカット コマンドを変更するには、次の 3 行を追加するだけです。ホーム ディレクトリに .tmux.conf
ファイルがない場合は、テキスト エディタを使用して新しいファイルを作成し、 .tmux.conf
として保存できます。
構成ファイルは、単純な構文を使用して設定とコマンドを定義します。各設定またはコマンドは 1 行を占め、#
表記を使用してコメントできます。
6.0 Tmux 設定ファイルの説明
Tmux 構成ファイルでは、次のタイプのコマンドを使用できます。
-
set
コマンド: さまざまなオプションやパラメータを設定するために使用されます。set -g
コマンドを使用してグローバル オプションを設定し、set -u
コマンドを使用してオプション設定をキャンセルし、set -g option value
コマンドを使用して特定のオプションと対応する値を設定します。たとえば、set -g prefix C-a
はプレフィックス キーをCtrl+a
に設定します。 -
bind-key
コマンド: 特定のキーを指定されたコマンドにマップするキー バインディングを作成するために使用されます。bind-key -n
コマンドを使用してプレフィックスなしのキーバインドを作成し、bind-key
コマンドを使用してプレフィックス付きキーバインドを作成できます。たとえば、bind-key -n C-a new-window
はCtrl+a
をコマンドにバインドして、新しいウィンドウを作成します。 -
unbind-key
コマンド: キーのバインドを解除し、特定のキーのマッピングをキャンセルするために使用されます。unbind-key -n
コマンドを使用してプレフィックスのないキーのバインドを解除したり、unbind-key
コマンドを使用してプレフィックスの付いたキーのバインドを解除したりできます。たとえば、unbind-key -n C-a
はCtrl+a
のバインドを解除します。 -
source-file
コマンド: 構成ファイルをリロードして新しい設定を有効にするために使用されます。メイン設定ファイルは、source-file ~/.tmux.conf
コマンドを使用して再ロードできます。これは、構成ファイルを編集し、その変更を有効にする必要がある場合に便利です。 -
alias
コマンド: コマンド エイリアスの作成に使用されます。alias -g
コマンドを使用してグローバル エイリアスを作成し、alias
コマンドを使用してローカル エイリアスを作成できます。たとえば、alias -g L "list-sessions"
は コマンドのエイリアスとしてL
を定義します。list-sessions
これらのコマンドを Tmux 構成ファイルで使用して、Tmux の動作、キーバインド、外観、その他のオプションをカスタマイズおよび構成できます。これらのコマンドを適切に使用することで、ニーズに合った Tmux 環境を作成できます。
一般的に使用される構成をいくつか示します。
6.1 コマンドプレフィックスの変更
tmux を数回使用したことがある限り、Ctrl+b
コマンド プレフィックスが非常に不便であることがわかると思いますCtrl+a
キーの組み合わせ、またはあまり使用されない ` キーに置き換える必要があります。
set -g prefix C-a # 将快捷键前缀设置为Ctrl+a
unbind C-b # C-b即Ctrl+b键,unbind意味着解除绑定
bind C-a send-prefix # 绑定Ctrl+a为新的指令前缀
# 从tmux v1.6版起,支持设置第二个指令前缀
set-option -g prefix2 ` # 设置一个不常用的`键作为指令前缀,按键更快些
変更した~/.tmux.conf
設定ファイルを有効にするには、次の 2 つの方法があります。
- tmuxを再起動します。
- tmux ウィンドウで、まず
Ctrl+b
コマンド プレフィックスを押し、次にシステム コマンドを押し:
、コマンド モードに入り、 < a i=3> の場合、Enter キーを押すと有効になります。source-file ~/.tmux.conf
6.2 設定ファイルを読み込むためのショートカットキー
ショートカット キーは非常に便利なので、より洗練されたアプローチは、以下に示すように、構成ファイルをロードするためのショートカット キーを追加して、いつでもどこでも新しい構成をロードできるようにすることです。
# 绑定快捷键为r
bind r source-file ~/.tmux.conf \; display-message "Config reloaded.."
请特别注意,在已经创建的窗口中,即使加载了新的配置,旧的配置依然有效(只要你新加的功能没有覆盖旧的配置,因此如果你第一次绑定快捷指令为x
键,然后又改为绑定y
键,那么x
和y
都将有效),新建会话不受此影响,将直接采用新的配置。
既然我们已经迈出配置化的第一步,那么接下来我们可以做得更多。
6.3 新增面板
tmux中,使用最多的功能之一就是新增一个面板。水平方向新增面板的指令是 prefix
+ "
,垂直方向是 prefix
+ %
,"
和 %
需要两个键同时按下才能完成,加上指令前缀至少需要3~4次按键才能组成一个完整的指令,同时这个两个键也不够醒目和方便,因此我们可以绑定两个更常用的指令 -
、|
,如下所示:
unbind '"'
bind - splitw -v -c '#{pane_current_path}' # 垂直方向新增面板,默认进入当前目录
unbind %
bind | splitw -h -c '#{pane_current_path}' # 水平方向新增面板,默认进入当前目录
6.4 开启鼠标支持
默认情况下,tmux的多窗口之间的切换以及面板大小调整,需要输入指令才能完成,这一过程,涉及到的指令较多,而且操作麻烦,特别是面板大小调整,指令难以一步到位,这个时候开启鼠标支持就完美了。
对于tmux v2.1(2015.10.28)之前的版本,需加入如下配置:
setw -g mode-mouse on # 支持鼠标选取文本等
setw -g mouse-resize-pane on # 支持鼠标拖动调整面板的大小(通过拖动面板间的分割线)
setw -g mouse-select-pane on # 支持鼠标选中并切换面板
setw -g mouse-select-window on # 支持鼠标选中并切换窗口(通过点击状态栏窗口名称)
有的地方可能会出现set-window-option
的写法,setw
就是它的别名。
对于tmux v2.1及以上的版本,仅需加入如下配置:
set-option -g mouse on # 等同于以上4个指令的效果
需要注意的是,开启鼠标支持后,iTem2默认的鼠标选中即复制功能需要同时按下 Alt
键,才会生效。
6.5 快速面板切换
鼠标支持确实能带来很大的便捷性,特别是对于习惯了鼠标操作的tmux新手,但对于键盘爱好者而言,这不是什么好消息,对他们而言,双手不离键盘是基本素质。
虽然指令前缀加方向键
可以切换面板,但方向键
太远,不够快,不够Geek。没关系,我们可以将面板切换升级为熟悉的h
、j
、k
、l
键位。
# 绑定hjkl键为面板切换的上下左右键
bind -r k select-pane -U # 绑定k为↑
bind -r j select-pane -D # 绑定j为↓
bind -r h select-pane -L # 绑定h为←
bind -r l select-pane -R # 绑定l为→
-r
表示可重复按键,大概500ms之内,重复的h
、j
、k
、l
按键都将有效,完美支持了快速切换的Geek需求。
除了上下左右外, 还有几个快捷指令可以设置。
bind -r e lastp # 选择最后一个面板
bind -r ^e last # 选择最后一个窗口
bind -r ^u swapp -U # 与前一个面板交换位置
bind -r ^d swapp -D # 与后一个面板交换位置
6.6 面板大小调整
习惯了全键盘操作后,命令的便捷性不言而喻。既然面板切换的指令都可以升级,面板大小调整的指令自然也不能落后。如下配置就可以升级你的操作:
# 绑定Ctrl+hjkl键为面板上下左右调整边缘的快捷指令
bind -r ^k resizep -U 10 # 绑定Ctrl+k为往↑调整面板边缘10个单元格
bind -r ^j resizep -D 10 # 绑定Ctrl+j为往↓调整面板边缘10个单元格
bind -r ^h resizep -L 10 # 绑定Ctrl+h为往←调整面板边缘10个单元格
bind -r ^l resizep -R 10 # 绑定Ctrl+l为往→调整面板边缘10个单元格
以上,resizep
即resize-pane
的别名。
6.7 面板最大化
当窗口中面板的数量逐渐增多时,每个面板的空间就会逐渐减少。为了保证有足够的空间显示内容,tmux从v1.8版本起,提供了面板的最大化功能,输入tmux-prefix+z
,就可以最大化当前面板至窗口大小,只要再重复输入一次,便恢复正常。
6.8 窗口变为面板
面板可以轻松地最大化为一个新的窗口。那么反过来,窗口是不是可以最小化为一个面板呢?
试想这样一个场景:当你打开多个窗口后,然后想将其中几个窗口合并到当前窗口中,以便对比观察输出。
实际上,你的要求就是将其它窗口变成面板,然后合并到当前窗口中。对于这种操作,我们可以在当前窗口,按下prefix
+ :
,打开命令行,然后输入如下命令:
join-pane -s window01 # 合并名称为window01的窗口的默认(第一个)面板到当前窗口中
join-pane -s window01.1 # .1显式指定了第一个面板,.2就是第二个面板(我本地将面板编号起始值设置为1,默认是0)
每次执行join-pane
命令都会合并一个面板,并且指定的窗口会减少一个面板,直到面板数量为0,窗口关闭。
除了在当前会话中操作外,join-pane
命令甚至可以从其它指定会话中合并面板,格式为join-pane -s [session_name]:[window].[pane]
,如join-pane -s 2:1.1
即合并第二个会话的第一个窗口的第一个面板到当前窗口,当目标会话的窗口和面板数量为0时,会话便会关闭。
注:上一节中的swap-pane
命令与join-pane
语法基本一致。
6.9 其他配置
bind m command-prompt "splitw -h 'exec man %%'" # 绑定m键为在新的panel打开man
# 绑定P键为开启日志功能,如下,面板的输出日志将存储到桌面
bind P pipe-pane -o "cat >>~/Desktop/#W.log" \; display "Toggled logging to ~/Desktop/#W.log"
6.10 恢复用户空间
tmux会话中,Mac的部分命令如 osascript
、open
、pbcopy
或 pbpaste
等可能会失效(失效命令未列全)。
部分bug列表如下:
- applescript - Unable to run ‘display notification’ using osascript in a tmux session
- osx - “open” command doesn’t work properly inside tmux
- clipboard - Can’t paste into MacVim
对此,我们可以通过安装reattach-to-user-namespace
包装程序来解决这个问题。
brew install reattach-to-user-namespace
在~/.tmux.conf
中添加配置:
set -g default-command "reattach-to-user-namespace -l $SHELL"
这样你的交互式shell最终能够重新连接到用户级的命名空间。由于连接状态能够被子进程继承,故以上配置保证了所有从 shell 启动的命令能够被正确地连接。
有些时候,我们可能会在不同的操作系统中共享配置文件,如果你的tmux版本大于1.9,我们还可以使用if-shell
来判断是否Mac系统,然后再指定default-command
。
if-shell 'test "$(uname -s)" = Darwin' 'set-option -g default-command "exec reattach-to-user-namespace -l $SHELL"'
对于tmux v1.8及更早的版本,可以使用如下包装后的配置:
set-option -g default-command 'command -v reattach-to-user-namespace >/dev/null && exec reattach-to-user-namespace -l "$SHELL" || exec "$SHELL"'
以上,$SHELL
对应于你的默认Shell,通常是/usr/bin/bash
或 /usr/local/bin/zsh
。
7. 复制模式
tmux中操作文本,自然离不开复制模式,通常使用复制模式的步骤如下:
- 输入 ``+[` 进入复制模式
- 按下
空格键
开始复制,移动光标选择复制区域 - 按下
回车键
复制选中文本并退出复制模式 - 按下 ``+]` 粘贴文本
查看复制模式默认的快捷键风格:
tmux show-window-options -g mode-keys # mode-keys emacs
默认情况下,快捷键为emacs
风格。
为了让复制模式更加方便,我们可以将快捷键设置为熟悉的vi
风格,如下:
setw -g mode-keys vi # 开启vi风格后,支持vi的C-d、C-u、hjkl等快捷键
7.1 自定义复制和选择快捷键
除了快捷键外,复制模式的启用、选择、复制、粘贴等按键也可以向vi
风格靠拢。
bind Escape copy-mode # 绑定esc键为进入复制模式
bind -t vi-copy v begin-selection # 绑定v键为开始选择文本
bind -t vi-copy y copy-selection # 绑定y键为复制选中文本
bind p pasteb # 绑定p键为粘贴文本(p键默认用于进入上一个窗口,不建议覆盖)
以上,绑定 v
、y
两键的设置只在tmux v2.4版本以下才有效,对于v2.4及以上的版本,绑定快捷键需要使用 -T
选项,发送指令需要使用 -X
选项,请参考如下设置:
bind -T copy-mode-vi v send-keys -X begin-selection
bind -T copy-mode-vi y send-keys -X copy-selection-and-cancel
7.2 Buffer缓存
tmux コピー オペレーションの内容は、デフォルトで buffer
に保存されます。buffer
はペースト バッファ領域です。新しいバッファは常に次の場所に配置されます。スタックの最上位。操作コマンドは次のとおりです。
tmux list-buffers # 展示所有的 buffers
tmux show-buffer [-b buffer-name] # 显示指定的 buffer 内容
tmux choose-buffer # 进入 buffer 选择页面(支持jk上下移动选择,回车选中并粘贴 buffer 内容到面板上)
tmux set-buffer # 设置buffer内容
tmux load-buffer [-b buffer-name] file-path # 从文件中加载文本到buffer缓存
tmux save-buffer [-a] [-b buffer-name] path # 保存tmux的buffer缓存到本地
tmux paste-buffer # 粘贴buffer内容到会话中
tmux delete-buffer [-b buffer-name] # 删除指定名称的buffer
上記のバッファ操作でバッファ名を指定しない場合、デフォルトの処理はスタックの最上位にあるバッファ キャッシュです。
tmux セッションのコマンドラインを入力する場合、上記の tmux プレフィックスは省略でき、list-buffers の動作は次のようになります。
choose-buffer の操作は次のとおりです。
デフォルトでは、バッファの内容はシステム ペーストボードから独立しており、tmux プロセス内に存在し、セッション間で共有できます。
7.3 システム ペーストボードの使用
tmux プロセスに存在するバッファ キャッシュはセッション間で共有できますが、システム ペーストボードと直接共有することはできないのが残念です。幸いなことに、私たちは現在、この機能を実現するための成熟したソリューションを持っています。
A. Linux でのペーストボードの使用
通常、Linux のxclip
ツールを使用してシステム ペーストボードにアクセスできます。
まず、xclip
をインストールする必要があります。
sudo apt-get install xclip
すると、.tmux.conf
は次のように構成されます。
# buffer缓存复制到Linux系统粘贴板
bind C-c run " tmux save-buffer - | xclip -i -sel clipboard"
# Linux系统粘贴板内容复制到会话
bind C-v run " tmux set-buffer \"$(xclip -o -sel clipboard)\"; tmux paste-buffer"
prefix
+ Ctrl
+ c
キーを押すと、バッファ キャッシュの内容が キーを押します。 a> キーを押すと、tmux がパスします。 + + xlip
プログラムをペーストボードにコピーし、prefix
Ctrl
v
xclip
B. Mac でペーストボードを使用する
Mac にはコピーとペーストのための pbcopy
コマンドと pbpaste
コマンドがそれぞれ付属していることは誰もが知っていますが、これらは tmux コマンドでは正しく機能しません。その理由を詳しくご紹介します。
Mac のペーストボード サービスはブート名前空間に登録されます。名前空間には階層があり、上位レベルの名前空間は下位レベルの名前空間 (ルート ブート名前空間など) にアクセスする権限を持ちますが、その逆はありません。 Mac ログイン セッションの一部として作成されたプロセスは、ユーザー レベルのブート名前空間に自動的に組み込まれるため、ユーザー レベルの名前空間のみがペーストボード サービスにアクセスできます。 tmux は daemon(3) ライブラリ関数を使用してサーバー プロセスを作成しますが、Mac OS X 10.5 では、Apple は daemon(3) 戦略を変更し、生成されたプロセスを初期ブート名前空間からルート ブート名前空間に移動しました。ルート ブート名前空間のアクセス権は低くなります。これは、tmux サーバーとその子プロセスが元のブート名前空間にアクセスできなくなったことを意味します (つまり、ペーストボード サービスにアクセスする権限がありません)。
この場合、小さなラッパーを使用して適切な名前空間に再接続し、ユーザーレベルの名前空間にアクセスするペーストボード サービスを実行できます。このラッパーはreattach-to-user-namespace
です。
Mac での .tmux.conf
の構成は次のとおりです。
# buffer缓存复制到Mac系统粘贴板
bind C-c run "tmux save-buffer - | reattach-to-user-namespace pbcopy"
# Mac系统粘贴板内容复制到会话
bind C-v run "reattach-to-user-namespace pbpaste | tmux load-buffer - \; paste-buffer -d"
reattach-to-user-namespace
をラッパーとして Mac ペーストボードにアクセスし、prefix
+ Ctrl
+ c
キーを押してバッファ キャッシュします。コンテンツがペーストボードにコピーされます。prefix
+ Ctrl
+ v
キーを押してください。ペーストボードのコンテンツは、 load-buffer. を追加し、paste-buffer によって tmux セッションに貼り付けます。
Mac システムのペーストボードをコピー モードで使用するには、次のように設定します。
# 绑定y键为复制选中文本到Mac系统粘贴板
bind-key -T copy-mode-vi 'y' send-keys -X copy-pipe-and-cancel 'reattach-to-user-namespace pbcopy'
# 鼠标拖动选中文本,并复制到Mac系统粘贴板
bind-key -T copy-mode-vi MouseDragEnd1Pane send -X copy-pipe-and-cancel "pbcopy"
上記の構成を完了したら、必ず tmux サーバーを再起動してください。この時点で、コピー モードで y
キーを押して選択したテキストを Mac のシステム ペーストボードに保存し、Command
+ v