tmuxの「制御モード」とは何ですか?

tmuxの「制御モード」とは何ですか?

以下で起動オプションを確認してくださいman tmux

-C:制御モードで起動します(制御モードのセクションを参照)。 (-CC)を2回指定するとエコーはディセーブルになります。

その後、制御モードセクションにはman tmux次の説明があります。

CONTROL MODE
     tmux offers a textual interface called control mode.  This allows
     applications to communicate with tmux using a simple text-only protocol.

     In control mode, a client sends tmux commands or command sequences
     terminated by newlines on standard input.  Each command will produce one
     block of output on standard output.  An output block consists of a %begin
     line followed by the output (which may be empty).  The output block ends
     with a %end or %error.  %begin and matching %end or %error have two
     arguments: an integer time (as seconds from epoch) and command number.
     For example:

           %begin 1363006971 2
           0: ksh* (1 panes) [80x24] [layout b25f,80x24,0,0,2] @2 (active)
           %end 1363006971 2

     The refresh-client -C command may be used to set the size of a client in
     control mode.

     In control mode, tmux outputs notifications.  A notification will never
     occur inside an output block.

これが何を意味するのかはわかりませんが、少なくともいくつかのコマンドを試してtmux -CC()を介してどのように見え、感じられるかを確認しようとすると、それを起動するのと同じように見えますtmux new-session

では、「制御モード」とは何であり、通常モードとどう違いますか?


編集する

-CCコントロールモード()で開始されたセッションとウィンドウは、tmuxコマンドのキーボードショートカット(ウィンドウ分割など)に反応しないことがわかりました。では、そもそもコントロールモードを使用するのはなぜですか?

答え1

私はMacを使用しており、iTerm2を使用しています。私が知る限り、tmux統合機能を備えた唯一の端末エミュレータです。実行から開始するtmux -CCと、iTermはtmuxセッションを制御します。これは、通常どおりiTerm2を正常に使用できることを意味します(ウィンドウを垂直に分割するにはCMDD、水平に分割するにはCMD-SHIFT-D)。代わりに、マウスを使用してウィンドウの位置を変更できますC-b {。プレフィックスをまったく使用する必要はありません。ウィンドウでの作業中にコピーして貼り付けても問題ありません。

tl;dr 使用法を使用すると、tmux -CCtmux をサポートする端末で「デフォルトで」使用できます。これまでこれをサポートするLinuxターミナルは見たことがなく、MacではiTerm2しか見えません。

答え2

制御モードの興味深い点は、実際のtmuxプロセスを受け取るバックグラウンドプロセスを書くことができることです。実際のtmuxで何が起こっているのかを通知し、コマンドを送信できます。 2つの端末を使用し、1つの端末で通常のセッションを実行する場合

tmux new -s mysession

そして他の場所では

tmux -C attach -t mysession

その後、ウィンドウを分割したり、新しいウィンドウを追加したり、通常のtmuxで閉じたりすると、次の行が表示されます。

%layout-change @2 91a8,80x23,0,0[80x11,0,0,5,80x11,0,12,7]
%window-add @3
%window-close @1

tmuxを制御しながらこれに反応するプログラムを書くことができます。助けるためにPythonライブラリこのメカニズムを活用するためです。そこの例をご覧ください。

答え3

tmux制御モードは直接使用できません。アクションをインタラクティブからtmux「エージェント」に似たアクションに変更します。この機能をサポートするターミナルエミュレータ(iTerm2など)から呼び出されます。残念ながら、現在の制御モードをサポートするLinux端末はありません。 (しかしターミネーター進展が行われているようです。 )

これはキラー機能です。

これを使用する方法の例として、sshリモートサーバーに関連するワークフローを考えます。そのサーバーでの作業中に別のセッションを開始するには、新しい接続を作成する必要がありますssh(困難ではありませんが、面倒でマイナーなコンテキスト切り替えが必要です)。

入力するtmux

tmux単一の接続で複数のリモートセッション(したがって名前に「マルチプレクサ」がある)を作成し、それらを複数のタブとペインに表示できます。これは間違いなくうまくいきますが、ナビゲーションに必要なキーの組み合わせがあまりにもtmux面倒で、より良いものを望んでいました。リモートでタブと分割ウィンドウをデフォルトの端末エミュレータと同じくらい滑らかで自然にする方法があったら...

入力するtmux -CC

tmux制御モードを使用すると、これをサポートする端末エミュレータがtmuxセッションに直接コマンドを実行してセッションを制御できます(meuhの回答を参照)。たとえば、リモートセッションで新しいウィンドウ/タブを開くことができますが、ローカルウィンドウ/タブを開くのと同じキー入力/コマンドを使用すると、はいローカルウィンドウ/タブですが、リモートセッションに接続されています。

答え4

私が知る限り、制御モードは通常のクライアントと同じです。違いは制御モードです。tmuxクライアントは標準入力からコマンドを読み取り、それをtmuxサーバーに送信します。代わりに、制御モードのクライアントは、通常のクライアントのように端末に描画するのではなく、サーバーからメッセージを受け取り、標準出力に印刷します。

関連情報