tmux の現在の分割ペインに別のウィンドウからターミナルを読み込む

tmux の現在の分割ペインに別のウィンドウからターミナルを読み込む

GNU Screen では、特定の分割領域内の任意のウィンドウ番号に切り替えることができます。例:

  • Enter キーを押しscreenて起動します。
  • Ctrl+を押してa c新しいウィンドウを作成します。これで、ウィンドウ 0 とウィンドウ 1 の 2 つのウィンドウができました。現在のウィンドウはウィンドウ 1 です。
  • Ctrl+ a Shift+を押してs新しい分割を作成します。
  • Ctrl+ を押すa Tabと新しい分割に移動します。
  • Ctrl+ を押す0と、この新しい分割でウィンドウ 0 が読み込まれます。

Tmux で同様のことを行うにはどうすればよいでしょうか? これまでのところ、次のようになっています。

  • Enter キーを押しtmuxて起動します。
  • Ctrl+を押してb c新しいウィンドウを作成します。現在、ウィンドウ 0 とウィンドウ 1 の 2 つのウィンドウがあります。現在のウィンドウはウィンドウ 1 です。
  • Ctrl+を押すb "と新しい分割ペインが作成されます。現在のペインが新しい分割ペインになります。
  • ウィンドウ 0 のシェルをこの新しい分割ペインに読み込むにはどうすればよいでしょうか?

tmux で画面のこの動作をシミュレートする方法はありますか?

答え1

Tmux は、同じペインを 2 つの異なるウィンドウに表示することも、同じペインを同じウィンドウに 2 回表示することもサポートしていません。元のセッションからリンクを解除せずに、ウィンドウ全体をセッションにリンクすることができます。または、ペインを別のウィンドウに配置することもできますが、これにより元のウィンドウからペインが削除されます。

この例では、目的のペインを配置するペインがすでに作成されています。この場合、tmux コマンドを使用して 2 つのペインを交換できますswap-paneman 1 tmux

swap-pane [-dDU] [-s src-pane] [-t dst-pane]
(別名: swapp)

2 つのペインを入れ替えます。[…] は、-dtmux にアクティブなペインを変更しないように指示します。

-sが省略され、マークされたペインが存在する場合(を参照select-pane -m)、現在のペインではなく、マークされたペインが使用されます。

さらに良いのは、-s-tが両方とも省略され、マークされたペインが存在する場合、マークされたペインと現在のペインが入れ替わることです。任意の時点で、tmux サーバー全体の中で最大 1 つのマークされたペインが存在する可能性があります。

ウィンドウ 0 のシェルをこの新しい分割ペインに読み込むにはどうすればよいでしょうか?

ウィンドウ 0 に移動し、移動するペインをマークします (この例では、そこにある唯一のペインです)。 RMB (マウスがサポートされている場合) またはprefix m(デフォルトprefixCtrl+ b) を使用して実行します。新しいペインに戻り、次を呼び出します。

tmux swapp

呼び出したシェルはtmux swapp自動的に破棄されず、マークされたペインがあったウィンドウ 0 に存在します。あなたの例では、このシェル自体は必要なく、新しいペインだけが必要なようです。そうであれば、tmux swapp && exit代わりに検討してください。マークされたペインがない場合 (または現在のペインがマークされている場合) は、実質的に何も実行されないことに注意してくださいtmux swapp。そのような場合は、tmux swapp && exitシェルを終了するだけです。

あるいは、その代わり新しい分割ペインを作成すると、目的のペインを 1 つの手順で現在のウィンドウに移動できます。

join-pane [-bdhv] [-l size | -p percentage] [-s src-pane] [-t dst-pane]
(別名: joinp)

と似ていますが、分割して新しいペインを作成するsplit-windowのではなく、分割してスペースに移動します。[…]dst-panesrc-pane

-sが省略され、マークされたペインが存在する場合(select-pane を参照-m)、現在のペインではなくマークされたペインが使用されます。

したがって、代わりにprefix ":

  1. 移動するペインをマークします。
  2. 分割したいペインを分割します。

    • tmux joinp -vシェル内で呼び出されるか、
    • またはprefix : joinp -v Enter; と組み合わせると、特に分割するペインにアイドル シェルがない場合に便利です (ただし、最初にペインを現在のペインにすることを忘れないでください)。

メソッドを使用して、またはその他の tmux コマンドprefix :を呼び出すことができます。swapp

以下に、tmux の外部からペインを操作する方法についていくつか注意点があります。例では を使用していますtmux swappが、同様に呼び出すこともできますtmux joinp


swap-pane交換することができますどれでもtmuxサーバー内の2つのペインtmux swapp交換したい 2 つのペインのアドレス指定方法がわかっていれば、手動でペインをマークしたり変更したりすることなく、tmux を使用できます。次のようになります。

tmux swapp -s 0:1.1 -t 0:0.0

フォーマットは です。session:window.paneについて説明しているマニュアルを参照してくださいtarget-pane。これらの数字は「相対的」であることに注意してください(少なくとも の:window.pane部分は、数字についてはよくわかりません)。と交換した後のsession最初のペインは になります。一方、tmux セッション、ウィンドウ、ペインには0:0.00:1.10:1.1個性的識別子(それぞれ$、、@およびがプレフィックスとして付きます%)。この場合、コマンドは次のようになります。

tmux swapp -s %2 -t %0

ただし、古いペインが実際に%0にあり0:0.0、新しいペインが にあった%2場合0:1.1、それらはそれぞれ と になります。%0各ペインの一意の識別子は、ペインのコンテンツ (プロセス) に「添付」され、それとともに「移動」します。ペインのプレフィックスなしの識別子は、ペインの合計数とウィンドウ内の配置によって異なります。0:1.1%20:0.0

セッション ( rename-session) とウィンドウ ( rename-window) に名前を付けることができます。これにより、ペインの識別がsession:window.pane容易になります。


複数の tmux サーバーを実行できます。サーバーは、ソケット パス (-Lオプション) またはソケット名 ( -S) で識別されます。デフォルト名は ですdefault。tmux 内からこれらのオプションなしで呼び出すとtmux、適切なサーバーが検索されます (TMUX環境変数経由だと思います)。tmuxtmuxの外部からこれらのオプションなしで呼び出すと、 のようになりますtmux -S default。デフォルト以外の tmux サーバーに属する 2 つのペインを入れ替える必要がある場合があります。例:

tmux -S other swapp -s 0:1.1 -t 0:0.0

Tmux は、サーバー間でのペインの交換をサポートしていません。2 つのサーバーを持つ主な目的は、それらが別々であることです。tmux の 2 つの半分独立したエンティティ間でペインを交換する必要がある場合は、これらのエンティティは単一の tmux サーバー内のセッションである必要があります。異なるセッション間でペインを交換することができます。

別のtmuxサーバーで実行されているプロセスを「ハイジャック」する必要がある場合は、reptyrこのツールは tmux から完全に独立しています。

関連情報