zsh: setze TERM = screen-256color in tmux, aber xterm-256color ohne tmux

17

Ich brauche meine $TERMsein xterm-256coloraußerhalb von tmux (in „plain“ Terminal mit zsh), aber screen-256colorinnerhalb tmux.

Zuerst habe ich versucht:

  • hinzufügen export TERM='xterm-256color'zu meinem~/.zshrc .
  • hinzufügen set -g default-terminal "screen-256color"zu meinem~/.tmux.conf

Nun, wenn ich Terminal öffne (sprich xterm), TERMistxterm-256color das richtig. Aber wenn ich tmux laufen lasse, TERMgeht das wieder xterm-256color!

Dann habe ich versucht, die Zeile in meinem zu kommentieren ~/.zshrc. Jetzt, wenn ich das Terminal öffne, TERMist xtermund wenn ich tmux starte, TERMist screen-256color. So scheint es , wenn ich gesetzt TERMin die .zshrc, tmux zunächst Sätze TERMzu screen-256color, Shell läuft (die zsh), und zsh liest.zshrc und setzt TERMauf xterm-256color.

Also, wie macht TERMman es sich xterm-256colorim " screen-256colornormalen " Terminal und im tmux?

Dmitry Frank
quelle
5
Stellen Sie den TERM für xterm in der xterm-Konfiguration (X resources) und den für tmux in der tmux-Konfiguration ein. Es gibt keinen Grund, warum Sie dies in zsh tun sollten.
Stéphane Chazelas
Hmm, aber ich verwende auch andere Terminal-Emulatoren: Sagen wir, Gnome-Terminal und Dropdown-Konsole im Beben-Stil "altyo" github.com/linvinus/AltYo , TERMin diesen Terminals kann ich immer noch keine korrekten Einstellungen vornehmen
Dmitry Frank
1
Nun, diese Anwendungen sind dafür verantwortlich, ihre TERM richtig einzustellen . Für gnome-terminalsollte das wahrscheinlich sein gnome-256color... Es sind also die Anwendungen, die Sie richtig konfigurieren müssen, nicht zsh. Der Grund, den sie verwenden, xtermist wahrscheinlich, um Probleme beim Versenden an Computer zu vermeiden, die nicht die spezifischeren terminfo-Einträge haben. Wenn Sie wissen, dass Sie nur auf Computer mit einer umfassenden Terminfo-Datenbank zugreifen, können und sollten Sie dies in den Anwendungen selbst ändern.
Stéphane Chazelas
Und wenn Sie einen .zshrc-Kludge (IMO) hinzufügen müssen, sollte dieser sich auf Computern mit unvollständigen terminfo-Datenbanken befinden (um xterm-256color durch xtermxterm-256color zu ersetzen , obwohl es sogar besser wäre, diese Einträge in unserem hinzuzufügen eigene ~ / .terminfo Datenbank).
Stéphane Chazelas
Wir sollten term im Terminalemulator setzen, nicht in .zshrc. Es ist nicht der richtige Weg.
JDHAO

Antworten:

23

Die Umgebungsvariable TERM sollte von der Anwendung festgelegt werden, die als Ihr Terminal fungiert. Das ist der springende Punkt: Lassen Sie Programme, die in ihnen ausgeführt werden, wissen, welches Terminal verwendet wird und welche Art von Funktionen es unterstützt.

Zsh ist kein Terminal. Es ist eine Muschel. Es kann von Bedeutung sein, auf was Ihr TERM eingestellt ist, wenn Sie spezielle Aufgaben ausführen möchten, es sollte jedoch nicht für die Einstellung verantwortlich sein sein. Stattdessen ist es dafür verantwortlich, Variablen wie ZSH_VERSION festzulegen, die von Skripten oder anderen untergeordneten Prozessen verwendet werden können, um zu verstehen, welches Verhalten von der übergeordneten Shell zu erwarten ist.

Stattdessen müssen Sie die Konfiguration für die von Ihnen verwendete Terminalanwendung überprüfen und sie auffordern, sich selbst ordnungsgemäß zu melden. Sie können dies beispielsweise für xterm tun, indem Sie diese Zeile zu der ~/.XdefaultsDatei hinzufügen, die für Konfigurationswerte verwendet wird:

xterm*termName: xterm-256color

Es sieht so aus, als ob gnome-terminal die idiotische Sache macht, zu lesen, wie Ihre xterm-Konfiguration aussehen würde, anstatt eine eigene zu haben. Dies kann in einigen Fällen von Vorteil sein, sollte aber besser auf gnome-256color eingestellt sein. Dies scheint ein langjähriger Kritikpunkt zu sein (und einige andere VTE-basierte Terminalemulatoren). Ein üblicher Weg, dies zu umgehen, ist es, einen anderen Wert zu nutzen, den es festlegt:

if [ "$COLORTERM" = "gnome-terminal" ]; then
    export TERM=gnome-256color
fi 

Damit kehren Sie zu Ihrem Problem mit tmux zurück. Sie müssten dies berücksichtigen, indem Sie TERM nicht zurücksetzen, wenn es sich bereits um "screen-256color" oder "screen" handelt:

if [ "$COLORTERM" = "gnome-terminal" -a "$TERM" =~ xterm.* ]; then
    export TERM=gnome-256color
fi

Für andere Terminals müssen Sie die entsprechenden Konfigurationsroutinen nachschlagen.

Caleb
quelle
zshist nicht verantwortlich für die Einstellung $SHELL. loginist für die Einstellung verantwortlich, und Sie sind dafür verantwortlich, dies in etwas anderes zu ändern, wenn Sie Anwendungen mitteilen möchten ( xterm, vi...), welche Shell Sie als bevorzugte Shell verwenden möchten. zshist verantwortlich für das Setzen $ZSH_VERSIONund einige dokumentierte spezielle Shell-Variablen, aber es berührt nicht $SHELL.
Stéphane Chazelas
@StéphaneChazelas Das war schlampig von mir, danke für die Korrektur.
Caleb
Vielen Dank dafür, dass ich herausgefunden habe, wie konsoleTERM eingestellt ist, anstatt es in meinen bashrc zu schreiben. Found it set Registerkarte in der General Profil, Umwelt, änderte sie sich von xtermzuxterm-256color
Mike Lippert
Erwähnenswert ist, dass unter meiner Vanille-Deb10-Installation GNOME-Terminal-Berichte truecoloranstelle von gnome-terminalfor installiert werden $COLORTERMund daher der oben genannte Erkennungsmechanismus möglicherweise nicht funktioniert. XTERM scheint diesen Wert überhaupt nicht festzulegen. Möglicherweise ist es gültig, nach einem Wert zu suchen. Dieser Begriffstyp wird in dieser Zusammenfassung teilweise an anderer Stelle behandelt: gist.github.com/XVilka/8346728#true-color-detection
Shaun Wilson
8

Setzen Sie in Ihre .zshrc

[[ $TMUX = "" ]] && export TERM="xterm-256color"

Und in Ihrer .tmux.conf

set -g default-terminal "screen-256color"
thiagowfx
quelle
2
Oder Auf [[ $TMUX != "" ]] && export TERM="screen-256color" diese Weise setzt zsh TERM nur, wenn es in einer tmux-Sitzung
aufgerufen wird