A variável de ambiente TERM deve ser definida pelo aplicativo que está atuando como seu terminal. Esse é o ponto principal da coisa: deixar os programas rodando dentro deles saberem qual terminal está sendo usado e, portanto, que tipo de recursos ele suporta.
O Zsh não é um terminal. É uma concha. Pode ser que o seu TERM esteja configurado para fazer coisas especiais, mas não deve ser responsável por configurar . Em vez disso, ele é 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 de qualquer aplicativo de terminal que esteja usando e solicitar que ele se informe adequadamente. Por exemplo, você pode fazer isso para o xterm adicionando esta linha ao arquivo ~/.Xdefaults
que ele usa para valores de configuração:
xterm*termName: xterm-256color
Parece que o gnome-terminal faz a coisa idiota de ler o que seria sua configuração xterm em vez de ter sua própria configuração. Isso pode levá-lo em alguns casos, mas deve ser configurado corretamente para gnome-256color. Esta parece ser uma queixa de longa data contra ela (e alguns outros emuladores de terminal baseados em VTE). Uma forma comum de invadir esta é explorar outro valor que ele define:
if [ "$COLORTERM" = "gnome-terminal" ]; then
export TERM=gnome-256color
fi
Mas isso o leva de volta ao seu problema com o tmux, então você teria que considerar isso não redefinindo o TERM se já for 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 suas rotinas de configuração adequadas.