tmux: Aktuellen Fenstertitel (#T) in verschachtelten tmux-Sitzungen freigeben

5

Ich habe kürzlich begonnen, tmux zu verwenden, um meine Terminalsitzungen wirklich zu verbessern. Ich muss in der Lage sein, eine Verbindung zu einem Remote-Server herzustellen, auf dem auch tmux ausgeführt wird. Ich habe jedoch festgestellt, dass der aktuelle Fenstertitel (in tmux als #T bezeichnet) in einer sekundären tmux-Shell nicht aktualisiert wird. Ich möchte den Wert der primären tmux-Sitzung in der sekundären Sitzung aktualisieren.

"#T" übernimmt eindeutig den von PROMPT_COMMAND verarbeiteten Wert. Dies ist ein Befehl, der bei jedem erneuten Laden der Eingabeaufforderung ausgeführt wird. Wenn ich jedoch eine Verbindung zu einem Remote-Server herstelle, wird eine serverseitige Shell geöffnet, die dann tmux öffnet und in der sekundären tmux-Sitzung eine völlig neue Shell ausführt. Die einzige Möglichkeit, den primären tmux-Fenstertitel zu aktualisieren, besteht darin, die serverseitige Shell-Eingabeaufforderung neu zu laden. Dies geschieht jedoch nicht in einer sekundären tmux-Sitzung.

Gibt es einen Befehl, um die beiden Sitzungen so zu verbinden, dass sie #T gemeinsam nutzen? Ich dachte ursprünglich, dass es mit der Option zum Überschreiben von Terminals machbar sein könnte, aber es funktioniert entweder nicht oder ich habe es falsch eingerichtet.

Alle mögliche Gedanken oder Vorschläge würden sehr geschätzt. Vielen Dank!

(PS. Ich vermute, diese Frage ist besser für Superuser geeignet, aber ich hatte zuvor eine Frage zum Stack-Overflow gestellt. Ich hoffe, dies ist das richtige Forum für diese Art von Frage.)

Scicalculator
quelle

Antworten:

2

Ich grub ein bisschen und fand die Antwort für mich. Nun, die Art und Weise, wie ich mein Ziel erreicht habe, ist nicht elegant, aber es wird funktionieren, um die Arbeit zu erledigen.

Zunächst muss die Option "set-titles" in Ihrer .tmux.conf-Datei aktiviert sein. Sowie den passenden Titelstring:

set -g set-titles on
set -g set-titles-string '#T'

Wenn Sie dies jedoch implementieren, werden Sie sofort feststellen, dass es nicht funktioniert. Das Problem ist, dass dies den Titelstring nur dann aufwärts sendet, wenn er in einer xterm-Variante startet (tmux / screen TERM-Variable ist "screen *"). Wenn Sie also eine verschachtelte tmux-Sitzung starten, müssen Sie das Terminal täuschen, indem Sie die Variable zurücksetzen. Im folgenden Beispiel wird das TERM-Suffix beibehalten (z. B. "-256color").

TEMP_TERM=$TERM
TEMP_TERM_SUFFIX=${TERM#$(echo $TERM | cut -f 1 -d'-')}
TERM="xterm${TEMP_TERM_SUFFIX}"

Ich bin mir nicht sicher, ob es wichtig ist, aber ich finde es klug, TERM nach dem Schließen von tmux zurückzusetzen (also in einer temporären Variablen speichern). Mithilfe dieses Skripts kann ein einfaches Shell-Skript erstellt werden, um eine verschachtelte tmux-Sitzung zu öffnen, die die Titelvariable #T im Upstream an die übergeordneten Sitzungen sendet.

Das alles funktioniert, ist aber etwas schmerzhaft, wenn man bedenkt, dass Arbeit geleistet werden muss, um sicherzustellen, dass keine unendlichen Verschachtelungsschleifen erstellt werden, falls wir unsere Shell automatisch in tmux starten. Wenn jemand eine bessere Lösung hat, würde ich es auch hier lieben!

Scicalculator
quelle
Auf der tmuxManpage heißt es: „Die Umgebungsvariable TERM muss screenfür alle Programme, die in tmux ausgeführt werden, auf gesetzt sein. Neue Fenster werden automatisch TERM=screenzu ihrer Umgebung hinzugefügt, aber es muss darauf geachtet werden, dass dies nicht in Shell-Startdateien zurückgesetzt wird. ”
ELLIOTTCABLE
@elliottcable ja, du hast recht, das sagt es. Meine Lösung für dieses Problem ist mehr oder weniger ein Hack. Dies kann Ihre Sitzung durcheinander bringen und sogar langsame Computer einfrieren, aber ich bin mir nicht sicher, ob ich mir darüber Sorgen mache. Wenn Sie beispielsweise TERM auf einen anderen tmux attach-session -t $(tmux display -p "#S")Wert als screen * zurücksetzen, wird am Ende eine Endlosschleife verschachtelter tmux-Sitzungen erstellt (Chaos!). Ich bin mir anderer, extremerer Beispiele möglicher Probleme nicht sicher, aber Sie sollten auf jeden
Fall
@elliottcable Ich möchte nur noch einen Punkt hinzufügen. Wenn Sie dies verwenden und sich Sorgen machen, empfehle ich, dies NUR vor dem Anhängen an eine Sitzung zu tun, in der nicht derselbe Bereich angezeigt wird, UND Sie sollten die Variable nach dem export TERM=$TEMP_TERM
Trennen der