Por que não há necessidade de escapar de uma sequência para aplicar um estilo ao texto em um terminal dentro do tmux?

2

Se eu quiser que a cor ANSI 0 seja vermelha, no terminal urxvt , eu preciso passar a seqüência \e]4;0;red\a para a última:

printf '\e]4;0;red\a'

Encontrei a sintaxe geral aqui :

OSC 4 ; c ; spec BEL

Dentro de tmux , ele não funciona, talvez porque foi consumido por tmux antes do terminal. Então, eu preciso protegê-lo através de outra seqüência encontrada aqui :

printf '\ePtmux;\e\e]4;0;red\a\e\'

Agora, se eu quiser aplicar um estilo ao texto, como sublinhar, por exemplo, se estou dentro ou fora de tmux , não importa. A mesma sequência parece sempre funcionar:

printf '\e[4m underline \e[0m'

Eu pensei que talvez essa diferença pudesse ser explicada porque eu configurei algumas opções em ~/.tmux.conf . Especificamente, eu defino a opção terminal-overrides para adicionar e definir as extensões terminológicas não oficiais Ss e Se para alterar a forma do cursor dentro de tmux conforme explicado em man tmux (section TERMINFO EXTENSIONS ):

set-option -as terminal-overrides ',*:Ss=\E[%p1%d q:Se=\E[2 q'

Mas quando tentei aplicar um estilo ao texto dentro de tmux , iniciei o segundo sem nenhuma configuração:

tmux -Ltest -f/dev/null

Por dentro de tmux , por que você não precisa proteger a sequência \e[4m underline \e[0m como você precisa para \e]4;0;red\a ?

    
por user786441 12.02.2018 / 20:35

1 resposta

4

tmux não é XTerm (mesmo se você estiver usando dentro do XTerm). Ele atua como seu próprio emulador de terminal (e, é claro, multiplexador) sobre qualquer terminal que você esteja usando. A página que você vinculou é seqüências de controle XTerm, que (embora muito útil) não são aplicáveis a todos os terminais existentes. Para screen , a página de manual on-line screen(1) lista as seqüências de controle aceitas. tmux(1) não contém uma seção similar, mas há uma antiga descrição de várias seqüências de controle para terminais datada de 1984, refletindo pelo menos o que seus autores pretendiam há vários anos, embora não estritamente documentando qual é seu comportamento atual, em seu código-fonte. em tools/ansicode.txt .

Em qualquer caso, as seqüências SGR para configurar atributos de texto são mais universalmente suportadas do que os "Comandos do sistema operacional", como o que você usa para alterar a paleta de cores. Na mesma página vinculada:

CSI Pm m Character Attributes (SGR)

  • Ps = 0 -> Normal (default).
  • Ps = 1 -> Bold.
  • Ps = 2 -> Faint, decreased intensity (ISO 6429).
  • Ps = 3 -> Italicized (ISO 6429).
  • Ps = 4 -> Underlined
  • Ps = 5 -> Blink (appears as Bold in X11R6 xterm).
  • Ps = 7 -> Inverse.
  • Ps = 8 -> Invisible, i.e., hidden (VT300).
  • Ps = 9 -> Crossed-out characters (ISO 6429).
  • Ps = 2 1 -> Doubly-underlined (ISO 6429).
  • Ps = 2 2 -> Normal (neither bold nor faint).
  • Ps = 2 3 -> Not italicized (ISO 6429).
  • Ps = 2 4 -> Not underlined.
  • Ps = 2 5 -> Steady (not blinking).
  • Ps = 2 7 -> Positive (not inverse).
  • Ps = 2 8 -> Visible, i.e., not hidden (VT300).
  • Ps = 2 9 -> Not crossed-out (ISO 6429).
  • Ps = 3 0 -> Set foreground color to Black.
  • Ps = 3 1 -> Set foreground color to Red.
  • Ps = 3 2 -> Set foreground color to Green.
  • Ps = 3 3 -> Set foreground color to Yellow.
  • Ps = 3 4 -> Set foreground color to Blue.
  • Ps = 3 5 -> Set foreground color to Magenta.
  • Ps = 3 6 -> Set foreground color to Cyan.
  • Ps = 3 7 -> Set foreground color to White.
  • Ps = 3 9 -> Set foreground color to default (original).
  • Ps = 4 0 -> Set background color to Black.
  • Ps = 4 1 -> Set background color to Red.
  • Ps = 4 2 -> Set background color to Green.
  • Ps = 4 3 -> Set background color to Yellow.
  • Ps = 4 4 -> Set background color to Blue.
  • Ps = 4 5 -> Set background color to Magenta.
  • Ps = 4 6 -> Set background color to Cyan.
  • Ps = 4 7 -> Set background color to White.
  • Ps = 4 9 -> Set background color to default (original).

(Tenho a sensação de que Pm deveria ser Ps para corresponder aos itens.)

Faz sentido que tmux os suportem diretamente, pois eles são usados com frequência por aplicativos e os usuários podem ficar frustrados com a falta de suporte.

Também pode ser interessante notar que o console do Linux usa uma sequência de escape diferente para definir o índice 0 da paleta para vermelho: 3]P0ff00003\ . Em geral, é OSC P n rr gg bb ST , em que n é o índice da paleta (em hexadecimal) e rr gg bb é a cor (também em hexadecimal).

    
por 12.02.2018 / 21:23