Gibt es eine elegantere Möglichkeit, die Verknüpfung zweier TMUX-Clients, die eine Sitzung gemeinsam nutzen, innerhalb von TMUX aufzuheben?

Gibt es eine elegantere Möglichkeit, die Verknüpfung zweier TMUX-Clients, die eine Sitzung gemeinsam nutzen, innerhalb von TMUX aufzuheben?

Das ist fast einCode-ReviewtmuxFrage, aber sehr *nixy und mehr über Konfiguration als Code. Seit ich von zu gewechselt bin, hatte ich jahrelang screenein paar lästige Probleme, die ich nicht so zum Laufen bringen konnte, wie ich es wollte. Da ich meine Shell so eingerichtet habe, dass sie in einer Tmux-Sitzung ausgeführt wird, habe ich endlich beschlossen, dass es an der Zeit ist, dieses Problem zu beheben.

Wenn Sie zwei tmux-Clients an dieselbe Sitzung anhängen, werden sie standardmäßig miteinander verbunden. Wechseln Sie in einem die Fenster, und beide wechseln synchron. Dies unterscheidet sich vom Bildschirm, wo das Standardverhalten ein gemeinsam genutzter Fenstersatz war, der Client selbst jedoch unabhängig war.

Ich wollte eine Möglichkeit finden, die Bindung zweier tmux-Clients zu lösen, die an dieselbe Sitzung angehängt sind. Das ist ganz einfach, wenn Sie sich außerhalb von tmux befinden und einen neuen Client starten. Starten Sie einfach eine neue Sitzung mit einem Verweis auf die übergeordnete Sitzung:

tmux new-session -t original_session -s new_session

Versuchen Sie dies jedochnachSie befinden sich in einem Client und möchten ihn von dem anderen Client trennen, der diese Sitzung teilt, und dann wird es komplizierter. Ich habe Dutzende von Möglichkeiten ausprobiert und nie eine gefunden, die gut funktioniert hat. Am nächsten kam ich bind <key> prompt-command ...der Sache, indem ich sowohl den alten als auch den neuen Sitzungsnamen abgefragt habe.Aus irgendeinem Grund erweitert tmux die #{session_name}Variable innerhalb der Argumente für ein new-sessionoder nicht prompt-command.Dies ist in Argumenten für viele andere Befehle der Fall (ich verwende es beispielsweise rununten), aber ohne diese Erweiterung wird diese spezielle Aufgabe plötzlich kompliziert. Selbst bei manueller Eingabe der Werte hat es immer nur halbwegs funktioniert.

Heute habe ich es endlich zum Laufen gebracht. Das Ergebnis ist allerdings hässlicher, als ich es mir gewünscht hätte. Für den Großteil der Magie ist eine Shell-Funktion erforderlich. Um dies auf die Konfigurationsdatei zu beschränken, ohne externe Skripte einzubeziehen (für die Portabilität von Dotfiles), verwende ich einen Hack. Wenn Sie die ersten beiden Spalten der Konfiguration abschneiden, ist sie tatsächlich als Shell-Skript ausführbar. Wenn alles in Funktionen verpackt ist, können Sie mit jeder Tastenkombination genau den Teil des Skripts aufrufen, den Sie benötigen. Die Shell-Skript-Bits sind Kommentare in der Konfiguration, während in einem erstellten Shell-Skript das Konfigurations-Bit mit einem Here-Doc verworfen wird.

Die heutige Lösungkam ungefähr so ​​heraus (meine vollständige .tmux.confDatei):

# : << 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
# }
# $@

Beachten Sie, dass dies funktioniert. Von einem laufenden tmux-Client aus erstellt Ctrl+ B Ctrl+ Ceine neue Sitzung mit einer Nummer, die an den Namen der aktuellen Sitzung angehängt wird, verwendet die aktuelle als Ziel für die Fenster und wechselt zu ihr.

Ich bin damit zufrieden, abgesehen von dem quälenden Gedanken, dass ich etwas Einfaches viel komplizierter gemacht habe, als es sein muss. Gibt es einen einfacheren Weg, dies zu erreichen?

Antwort1

Folgendes habe ich getan:

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

Dadurch wird eine neue Sitzung aus der Sitzung mit dem Namen „0“ (der Name der ersten Sitzung, wenn Sie nichts anderes angeben) mit einem eindeutig zufälligen Namen (mithilfe von uuidgen) erstellt und dann beendet, wenn ich die Verbindung trenne.

Beachten Sie, dass ich zsh verwende. „ta“ ist die Abkürzung für „tmux attach“.

verwandte Informationen