tmux 内からセッションを共有している 2 つの tmux クライアントのリンクを解除するよりエレガントな方法はありますか?

tmux 内からセッションを共有している 2 つの tmux クライアントのリンクを解除するよりエレガントな方法はありますか?

これはほぼコードレビュー質問ですが、非常に *nixy で、コードよりも構成に関するものです。tmuxからに切り替えてから何年もの間screen、いくつかの問題が悩みの種で、思ったように動作させることができませんでした。シェルを tmux セッションで実行するように設定してから、ついにこの問題を修正する時が来たと判断しました。

デフォルトでは、2 つの tmux クライアントを同じセッションに接続すると、それらは一緒にロックされます。 一方のペインを切り替えると、両方のペインが同期して切り替わります。 これは、デフォルトの動作がペインのセットを共有するがクライアント自体は独立している screen とは異なります。

私が求めていたのは、同じセッションにアタッチされた 2 つの tmux クライアントのバインドを解除する方法でした。これは、tmux の外部で新しいクライアントを起動する場合、簡単に実行できます。親セッションへの参照を使用して新しいセッションを開始するだけです。

tmux new-session -t original_session -s new_session

しかし、これを試してみてくださいクライアントでセッションを共有している他のクライアントとのリンクを解除したい場合、状況はさらに複雑になります。私は何十もの方法を試しましたが、うまく機能する方法は見つかりませんでした。私が最もうまくいった方法は、bind <key> prompt-command ...古いセッション名と新しいセッション名の両方を入力するように求める方法でした。何らかの理由で、tmux は aまたは#{session_name}の引数内の変数を展開しません。new-sessionprompt-command他の多くのコマンドの引数ではそうなります (たとえば、run以下で使用します) が、その拡張がないと、この特定のタスクは突然複雑になります。手動で値を入力しても、なんとか機能するだけです。

今日、ようやく動作するようになりました。ただし、結果は思ったよりも醜いものでした。ほとんどの魔法を実行するには、シェル関数が必要です。外部スクリプトを使用せずにこれを構成ファイルのみに収めるために (ドットファイルの移植性のため)、ハックを使用しています。構成は、最初の 2 列を切り取ると、実際にはシェル スクリプトとして実行できます。すべてが関数でラップされているため、必要なスクリプトの部分だけを任意のキーバインドから呼び出すことができます。シェル スクリプトの部分は構成内のコメントですが、シェル スクリプトでは、構成部分は here-doc で破棄されます。

今日の解決策こんな感じになりました(私の完全な.tmux.confファイル):

# : << ENDOFCONF

# Clear the default binding
unbind C-c
# Pass the name of the current session to a function to clone it
bind C-c run "cut -c3- ~/.tmux.conf | sh -s clone #S"

# ENDOFCONF
# clone () {
#   orig=${1%-*}
#   copy="$orig-$(($( tmux list-sessions -F '#S' | sed -nE "/^${orig}-[0-9]+$/{s/[^0-9]//g;p}" | tail -n1 )+1))"
#   TMUX= tmux new-session -d -t $orig -s $copy
#   tmux switch-client -t $copy
#   tmux set -q -t $copy destroy-unattached on
# }
# $@

これは機能します。実行中の tmux クライアントから、Ctrl++B CtrlC現在の名前に番号を追加した新しいセッションを作成し、現在のセッションをペインのターゲットとして使用して、そのセッションに切り替えます。

単純なものを必要以上に複雑にしてしまったというしつこい思いを除けば、これで満足しています。これを実現するより簡単な方法はありますか?

答え1

私がやったことは以下の通りです:

alias ta='export NEW_SESSION=\$(uuidgen) ; tmux new-session -t 0 -s \$NEW_SESSION ; tmux kill-session -t \$NEW_SESSION'

これは、「0」という名前のセッション (指定しない場合は最初のセッションの名前) から新しいセッションを作成し、一意のランダムな名前 (uuidgen を使用) を付けて、デタッチ時にそのセッションを強制終了します。

zshを使用していることに注意してください。「ta」は「tmux attached」の略です。

関連情報