zsh: set TERM = screen-256color dans tmux, mais xterm-256color sans tmux


18

J'ai besoin que je $TERMsois en xterm-256colordehors de tmux (dans un terminal "ordinaire" avec zsh), mais à l' screen-256colorintérieur de tmux.

J'ai d'abord essayé:

  • ajouter export TERM='xterm-256color'à mon ~/.zshrc.
  • ajouter set -g default-terminal "screen-256color"à mon~/.tmux.conf

Maintenant, quand j'ouvre le terminal (disons, xterm), TERMc'est xterm-256color, ce qui est correct. Mais quand je lance tmux, TERMc'est à nouveau xterm-256color!

Ensuite, j'ai essayé de commenter la ligne dans mon ~/.zshrc. Maintenant, quand j'ouvre le terminal, TERMc'est xterm, et quand j'exécute tmux, TERMc'est screen-256color. Il semble donc que si je mets TERMdans le .zshrc, tmux définit d'abord TERMsur screen-256color, exécute shell (qui est zsh), et zsh lit .zshrcet se réinitialise TERMsur xterm-256color.

Alors, comment faire TERMpour être xterm-256colordans un terminal "ordinaire", et screen-256colordans tmux?


5
Définissez le TERM pour xterm dans la configuration xterm (ressources X) et celui pour tmux dans la configuration tmux. Il n'y a aucune raison que vous fassiez cela en zsh.
Stéphane Chazelas

Hmm, mais j'utilise également d'autres émulateurs de terminaux: disons, gnome-terminal et la console déroulante de style quake " altyo " github.com/linvinus/AltYo , ne parviennent toujours pas à trouver le moyen de définir correctement TERMdans ces terminaux
Dmitry Frank

1
Eh bien, ces applications sont responsables de définir correctement leur TERM. Pour gnome-terminal, cela devrait probablement être gnome-256color... Ce sont donc ces applications que vous devez configurer correctement, non zsh. La raison pour laquelle ils les utilisent xtermest probablement pour éviter les problèmes lors de la lecture sur des machines qui n'ont pas les entrées terminfo plus spécifiques. Si vous savez que vous utilisez uniquement des machines avec une base de données terminfo exhaustive, vous pouvez et devez changer cela dans les applications elles-mêmes.
Stéphane Chazelas

Et si vous devez ajouter un kludge .zshrc, IMO, qui devrait être sur des machines qui ont des bases de données terminfo incomplètes (pour remplacer xterm-256color par xtermsi xterm-256color n'est pas pris en charge, bien qu'il serait encore mieux d'ajouter ces entrées dans notre propre base de données ~ / .terminfo).
Stéphane Chazelas

Nous devons définir le terme dans l'émulateur de terminal, pas dans .zshrc. Ce n'est pas la bonne façon.
jdhao du

Réponses:


24

La variable d'environnement TERM doit être définie par l'application qui fait office de terminal. C'est tout l'intérêt de la chose: permettre aux programmes qui y sont exécutés de savoir quel terminal est utilisé et donc quel type de fonctionnalités il prend en charge.

Zsh n'est pas un terminal. C'est une coquille. Il peut se soucier de ce que votre TERM est défini s'il veut faire des choses spéciales, mais il ne devrait pas être responsable de le définir . Au lieu de cela, il est chargé de définir des variables telles que ZSH_VERSION qui peuvent être utilisées par des scripts ou d'autres processus enfants pour comprendre le comportement à attendre de leur shell parent.

Au lieu de cela, vous devez vérifier la configuration de l'application de terminal que vous utilisez et lui demander de se signaler correctement. Par exemple, vous pouvez le faire pour xterm en ajoutant cette ligne au ~/.Xdefaultsfichier qu'il utilise pour les valeurs de configuration:

xterm*termName: xterm-256color

Il semble que gnome-terminal fasse la chose idiote de lire ce que serait votre configuration xterm au lieu d'avoir la sienne. Cela peut vous aider dans certains cas, mais devrait être plus correctement défini sur gnome-256color. Cela semble être un grief de longue date contre lui (et certains autres émulateurs de terminaux basés sur VTE). Une façon courante de contourner cela est d'exploiter une autre valeur qu'elle définit:

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

Mais cela vous ramène à votre problème avec tmux, vous devrez donc en tenir compte en ne réinitialisant pas TERM s'il s'agit déjà de quelque chose comme "screen-256color" ou "screen":

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

Pour les autres terminaux, vous devrez rechercher leurs routines de configuration appropriées.


zshn'est pas responsable du réglage $SHELL. loginest responsable de sa configuration, et vous êtes responsable de changer cela en quelque chose d'autre si vous voulez dire aux applications ( xterm, vi...) quel shell vous voulez comme shell préféré. zshest responsable de la définition $ZSH_VERSIONet de quelques variables de shell spéciales documentées, mais il ne les touche pas $SHELL.
Stéphane Chazelas

@ StéphaneChazelas C'était bâclé de ma part, merci pour la correction.
Caleb

Merci pour cela, cela m'a fait chercher comment konsoledéfinir TERM plutôt que de le mettre dans mon bashrc. Je l' ai trouvé situé dans l'onglet Général du profil, l' environnement, il a changé de xtermàxterm-256color
Mike Lippert

il convient de noter que sous mon van10 deb10, installez les rapports GNOME Terminal truecolorau lieu de gnome-terminalfor $COLORTERMet que le mécanisme de détection ci-dessus peut ne pas fonctionner. XTERM ne semble pas du tout définir cette valeur, il peut être valide de vérifier n'importe quelle valeur. ce type de terme est partiellement discuté dans cet essentiel peut-être ailleurs: gist.github.com/XVilka/8346728#true-color-detection
Shaun Wilson

8

Dans votre .zshrc, mettez

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

Et, à l'intérieur de votre .tmux.conf

set -g default-terminal "screen-256color"

2
Ou De [[ $TMUX != "" ]] && export TERM="screen-256color" cette façon, zsh ne définira TERM que s'il est appelé dans une session tmux
Titou
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.