zsh: establece TERM = screen-256color en tmux, pero xterm-256color sin tmux

18

Necesito $TERMque esté xterm-256colorfuera de tmux (en la terminal "simple" con zsh), pero screen-256colordentro de tmux.

Primero probé:

  • añadir export TERM='xterm-256color'a mi ~/.zshrc.
  • agregar set -g default-terminal "screen-256color"a mi~/.tmux.conf

Ahora, cuando abra terminal (por ejemplo, xterm), TERMes xterm-256color, lo que es correcto. Pero cuando ejecuto tmux, ¡ TERMestá de nuevo xterm-256color!

Luego traté de comentar en mi línea ~/.zshrc. Ahora, cuando abro el terminal, TERMes xterm, y cuando ejecuto tmux, TERMes screen-256color. Por lo que parece si fijo TERMen el .zshrc, en primer lugar, tmux conjuntos TERMa screen-256color, carreras de concha (que es zsh), y zsh lee .zshrcy se restablece TERMa xterm-256color.

Entonces, ¿cómo hacer TERMpara estar xterm-256coloren la terminal "simple" y screen-256coloren tmux?

Dmitry Frank
fuente
55
Establezca el TERM para xterm en la configuración de xterm (recursos X) y el de tmux en la configuración de tmux. No hay razón para que hagas nada de eso en zsh.
Stéphane Chazelas
Hmm, pero también uso otros emuladores de terminal: por ejemplo, consola desplegable gnome-terminal y de estilo sismo "altyo" github.com/linvinus/AltYo , todavía no puedo encontrar la manera de configurar correctamente TERMestos terminales
Dmitry Frank
1
Bueno, esas aplicaciones son responsables de establecer su PLAZO correctamente. Para gnome-terminal, eso probablemente debería ser gnome-256color... Así que son esas aplicaciones las que necesitas configurar correctamente, no zsh. La razón por la que usan xtermes probablemente para evitar problemas al enviar ssh a máquinas que no tienen las entradas terminfo más específicas. Si sabe que solo está enviando a máquinas con una base de datos terminfo exhaustiva, entonces puede y debe cambiar eso en las propias aplicaciones.
Stéphane Chazelas
Y si necesita agregar un .zshrc kludge, IMO, eso debería estar en máquinas que tienen bases de datos terminfo incompletas (para reemplazar xterm-256color con xtermsi xterm-256color s no es compatible, aunque sería aún mejor agregar esas entradas en nuestro propia base de datos ~ / .terminfo).
Stéphane Chazelas
Deberíamos establecer el término en el emulador de terminal, no en .zshrc. No es la forma correcta.
jdhao

Respuestas:

24

La variable de entorno TERM debe ser establecida por la aplicación que actúa como su terminal. Este es el objetivo principal: dejar que los programas que se ejecutan dentro de ellos sepan qué terminal se está utilizando y, por lo tanto, qué tipo de características admite.

Zsh no es una terminal. Es una concha. Puede que le importe en qué está configurado su TERM si quiere hacer cosas especiales, pero no debería ser responsable de configurarlo . En su lugar, es responsable de establecer variables como ZSH_VERSION que pueden ser utilizadas por los scripts u otros procesos secundarios para comprender qué comportamiento esperar de su shell principal.

En su lugar, debe verificar la configuración de cualquier aplicación de terminal que esté utilizando y pedirle que se informe correctamente. Por ejemplo, puede hacer esto para xterm agregando esta línea al ~/.Xdefaultsarchivo que usa para los valores de configuración:

xterm*termName: xterm-256color

Parece que gnome-terminal hace lo idiota de leer cuál sería su configuración xterm en lugar de tener la suya propia. Esto puede ayudarlo en algunos casos, pero debería establecerse más adecuadamente en gnome-256color. Esto parece ser una queja de larga data en su contra (y algunos otros emuladores de terminales basados ​​en VTE). Una forma común de hackear esto es explotar otro valor que sí establece:

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

Pero esto lo lleva de vuelta a su problema con tmux, por lo que debería tenerlo en cuenta al no restablecer TERM si ya es algo así como "screen-256color" o "screen":

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

Para otros terminales, deberá buscar sus rutinas de configuración adecuadas.

Caleb
fuente
zshNo es responsable de la configuración $SHELL. logines responsable de configurarlo, y usted es responsable de cambiar eso a otra cosa si desea decirle a las aplicaciones ( xterm, vi...) qué shell desea como su shell preferido. zshes responsable de la configuración $ZSH_VERSIONy algunas variables de shell especiales documentadas, pero no toca $SHELL.
Stéphane Chazelas
@ StéphaneChazelas Eso fue descuidado de mi parte, gracias por la corrección.
Caleb
Gracias por esto, me hizo buscar cómo konsoleconfigurar TERM en lugar de ponerlo en mi bashrc. Nos pareció que estaba situado en la ficha General del perfil, Medio ambiente, lo cambió a partir xtermdexterm-256color
Mike Lippert
Vale la pena señalar que en mi vanilla deb10 instalar informes de Terminal de GNOME en truecolorlugar de gnome-terminalpara $COLORTERMy, por lo tanto, el mecanismo de detección anterior puede no funcionar. XTERM no parece establecer este valor en absoluto, puede ser válido verificar cualquier valor. este tipo de término se discute parcialmente en este resumen,
Shaun Wilson
8

Dentro de tu .zshrc, pon

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

Y, dentro de su .tmux.conf

set -g default-terminal "screen-256color"
thiagowfx
fuente
2
O De [[ $TMUX != "" ]] && export TERM="screen-256color" esta manera, zsh establecerá TERM solo si se llama dentro de una sesión tmux
Titou