zsh: define TERM = screen-256color no tmux, mas xterm-256color sem tmux

17

Eu preciso que eu $TERMesteja xterm-256colorfora do tmux (no terminal "simples" com zsh), mas screen-256colordentro do tmux.

Primeiro eu tentei:

  • adicionar export TERM='xterm-256color'ao meu ~/.zshrc.
  • adicionar set -g default-terminal "screen-256color"ao meu~/.tmux.conf

Agora, quando abro o terminal (digamos, xterm), TERMé xterm-256color, o que está correto. Mas quando eu corro tmux, TERMé de novo xterm-256color!

Então eu tentei comentar a linha no meu ~/.zshrc. Agora, quando abro o terminal, TERMé xterm, e quando executo o tmux, TERMé screen-256color. Assim, parece se eu definir TERMna .zshrc, tmux em primeiro lugar conjuntos TERMpara screen-256color, corre Shell (que é zsh), e zsh lê .zshrce redefine TERMa xterm-256color.

Então, como fazer TERMpara estar xterm-256colorno terminal "simples" e screen-256colorno tmux?

Dmitry Frank
fonte
5
Defina o TERM para xterm na configuração xterm (recursos X) e o para tmux na configuração tmux. Não há motivo para você fazer isso no zsh.
Stéphane Chazelas
Hmm, mas eu também uso outros emuladores de terminal: digamos, console suspenso no estilo gnome-terminal e no quake "altyo" github.com/linvinus/AltYo , ainda não consigo encontrar a maneira de corrigir TERMesses terminais
Dmitry Frank
1
Bem, esses aplicativos são responsáveis ​​por definir seu TERM corretamente. Pois gnome-terminal, isso provavelmente deveria ser gnome-256color... Portanto, são esses aplicativos que você precisa configurar corretamente, não zsh. O motivo pelo qual eles usam xtermé provavelmente para evitar problemas ao enviar para máquinas que não possuem as entradas terminfo mais específicas. Se você sabe que está fazendo o sshing apenas para máquinas com um banco de dados terminfo exaustivo, pode e deve alterar isso nos próprios aplicativos.
Stéphane Chazelas
E se você precisar adicionar um .zshrc kludge, IMO, que deve estar em máquinas com bancos de dados terminfo incompletos (para substituir o xterm-256color por xtermse o xterm-256color não for suportado, ainda seria melhor adicionar essas entradas em nosso próprio banco de dados ~ / .terminfo).
Stéphane Chazelas
Deveríamos definir termo no emulador de terminal, não em .zshrc. Não é o caminho correto.
Jdhao 22/10

Respostas:

23

A variável de ambiente TERM deve ser definida pelo aplicativo que está atuando como seu terminal. Esse é o ponto principal: deixar os programas executados dentro deles saberem qual terminal está sendo usado e, portanto, que tipo de recursos ele suporta.

Zsh não é um terminal. É uma concha. Pode se importar com o que seu TERM está definido, se desejar fazer coisas especiais, mas não deve ser responsável por defini- lo. Em vez disso, é responsável por definir variáveis ​​como ZSH_VERSION, que podem ser usadas por scripts ou outros processos filhos para entender qual comportamento esperar do shell pai.

Em vez disso, você precisa verificar a configuração para qualquer aplicativo de terminal que esteja usando e solicitar que ele se reporte adequadamente. Por exemplo, você pode fazer isso no xterm adicionando esta linha ao ~/.Xdefaultsarquivo que ele usa para valores de configuração:

xterm*termName: xterm-256color

Parece que o gnome-terminal faz a coisa idiota de ler qual seria a sua configuração xterm em vez de ter a sua própria. Isso pode ajudá-lo em alguns casos, mas deve ser definido mais adequadamente como gnome-256color. Parece ser uma reclamação de longa data contra ele (e alguns outros emuladores de terminal baseados em VTE). Uma maneira comum de contornar isso é explorar outro valor que ele define:

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

Mas isso traz você de volta ao seu problema com o tmux, então você teria que explicar isso, não redefinindo TERM se já fosse algo como "screen-256color" ou "screen":

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

Para outros terminais, você precisará procurar as rotinas de configuração adequadas.

Caleb
fonte
zshnão é responsável pela configuração $SHELL. loginé responsável por defini-lo, e você é responsável por alterá-lo para outra coisa, se desejar informar aos aplicativos ( xterm, vi...) qual shell você deseja como seu shell preferido. zshé responsável pela configuração $ZSH_VERSIONe algumas variáveis ​​especiais documentadas do shell, mas não toca $SHELL.
Stéphane Chazelas
@ StéphaneChazelas Isso foi desleixado da minha parte, obrigado pela correção.
Caleb
Obrigado por isso, ele me fez procurar como konsoledefinir TERM em vez de colocá-lo no meu bashrc. Encontrado definido na guia Geral do perfil, Ambiente, alterado de xtermparaxterm-256color
Mike Lippert
vale ressaltar que, no meu baunilha deb10, instale os relatórios do Terminal GNOME em truecolorvez de gnome-terminalpara $COLORTERMe, portanto, o mecanismo de detecção acima pode não funcionar. O XTERM não parece definir esse valor, pode ser válido verificar qualquer valor. este tipo de termo é discutido parcialmente nesta lista, possivelmente em outro lugar: gist.github.com/XVilka/8346728#true-color-detection
Shaun Wilson
8

Dentro do seu .zshrc, coloque

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

E, dentro do seu .tmux.conf

set -g default-terminal "screen-256color"
thiagowfx
fonte
2
Ou [[ $TMUX != "" ]] && export TERM="screen-256color" Desta forma zsh irá definir prazo só se for chamado dentro de uma sessão tmux
Titou