Códigos de cores no bash $ PS1 não funcionam no tmux

0

Eu tenho um prompt colorido configurado em .bash_profile :

export PS1="\[3[0:33m\]testprompt@\h\[3[00m\] "

Fora do tmux eu recebo um prompt colorido lendo testprompt@hostname .

Dentro de uma sessão do tmux, o texto é definido, mas o prompt não é colorido. Outros programas produzem cores normalmente.

Eu configurei um terminal de cores em .tmux.conf :

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

Estou usando o terminal padrão no macOS. Bash e tmux são as versões mais recentes do gerenciador de pacotes homebrew. A mesma versão do bash rodando dentro do tmux e do lado de fora.

As seguintes variáveis de ambiente são exatamente as mesmas dentro e fora do tmux:

$ echo $PS1
\[3[0:33m\]testprompt@\h\[3[00m\]'
$ echo $TERM
xterm-256color
$ echo $SHELL
/usr/local/bin/bash
$ echo $BASH_VERSION
4.4.23(1)-release

A cor funciona perfeitamente para outros comandos dentro do tmux, como ls -la e git log . O shell fish tem um prompt de cores dentro do tmux. Abrir uma nova instância bash novamente dentro do tmux não faz qualquer diferença - ainda sem cor. .bash_profile está sendo lido e $PS1 está sendo definido. As cores do prompt funcionam na tela e em "raw" bash fora do tmux, mas não no tmux. O que estou perdendo?

    
por Wes Lord 11.09.2018 / 02:40

2 respostas

2

Embora seja correto que você sempre defina a variável de ambiente TERM para corresponder ao seu tipo de terminal, e não suponha que seu tipo de terminal é xterm-* , isso não tem nada a ver com o problema, como a variável de ambiente TERM não tem relação com sequências de controle literais incorporadas no seu prompt.

O problema é que você está usando sub-parâmetros em sua sequência de controle, não em parâmetros. Os parâmetros são separados por ponto-e-vírgula ; , conforme especificado em ECMA-48: 1991 § 5.4.2. Os sub-parâmetros são separados por dois pontos : , conforme especificado no ITU-T T.416: 1993 § 13.1.8.

Seu emulador de terminal externo é aparentemente um dos que lidam com sub-parâmetros com um bodge que os trata como parâmetros. Assim, CSI 0 : 3 3 m é tratado como SGR 0 e SGR 33. Outros emuladores de terminal são mais rigorosos sobre processar seqüências de controle corretamente ou ainda não implementam suporte a sub-parâmetros. Eles podem tratá-lo como SGR 0 com um sub-parâmetro de 33, simples SGR 0 (considerando o primeiro número) ou apenas SGR 33 (considerando o último número).

Os emuladores de terminal não suportavam sub-parâmetros em alguns anos atrás, então isso é algo que está mudando; e é de se esperar que eventualmente todos eles apóiem os sub-parâmetros corretamente. Nesse caso, o seu prompt será simplesmente universalmente errado. ☺

Pessoalmente, eu prefiro o shell Z, onde é possível usar seqüências como %F{yellow} em um prompt sem ter que se preocupar com o que são as seqüências de controle, acertando-as e marcando-as como não-espaçadas.

    
por 11.09.2018 / 11:25
2

A FAQ do tmux aponta que

Inside tmux TERM must be "screen", "tmux" or similar (such as "tmux-256color"). Don't bother reporting problems where it isn't!

xterm-256color é diferente de tmux-256color .

    
por 11.09.2018 / 03:06