Tmux e cores sombreadas no Terminal.app no MacOS

5

O problema

No meu Mac (10.11) Tmux não mostra as cores dim -ed corretamente, e isso causa aborrecimento.

Na imagem a seguir, o nome do autor da confirmação deve estar representado em dim white . Isso funciona bem no Terminal.app , mas não dentro do Tmux .

Alguémtemalgumaidéiasobrecomodepurarisso?
Acreditoqueestejarelacionadoàvariável$TERM,masnãoseiporondecomeçar.

EmTerminal.app$TERMestádefinidocomoxterm-256color.
EmTmux$TERMestádefinidoparascreen-256color.

Nomeu.tmux.conf,tenhoset-gdefault-terminal"screen-256color" . xterm-256color , dentro do Tmux , conflita com a cor de fundo do Vim , de alguma forma, mas não muda o comportamento dim .

Mais informações

Eu abri um problema no repositório GitHub do Tmux ; uma resposta foi fornecida, mas eu não entendo completamente isso.

Parece que Terminal.app não tem uma diretiva dim , embora lide bem com isso.
Tmux não pode buscar o dim informações, uma vez que está ausente e, portanto, não mostra a fonte corretamente.

Agora não sei por que um funciona enquanto o outro não.

    
por Atcold 06.10.2015 / 22:47

2 respostas

2

tmux (como a tela GNU) funciona traduzindo os recursos do seu terminal real em um terminal interno (geralmente diferente). Eles fazem isso para permitir que você conecte uma sessão em diferentes terminais ao mesmo tempo , ou em diferentes momentos .

Quando isso funciona bem, você verá o texto "mesmo" não importando de onde esteja se conectando.

Nem todos os terminais suportam dim . De fato, a maioria não. O banco de dados do terminal tem 121 ocorrências de dim versus 1514 descrições de terminal.

Quando o screen foi iniciado por volta de 1990, seus desenvolvedores optaram por ignorar esse recurso e, em vez disso, fornecer o mais útil. Eles projetaram o programa para armazenar, para cada célula de linha / coluna, os atributos de vídeo que os programas termcap provavelmente usariam. O código-fonte define estes:

#define ATTR_DI         0       /* Dim mode */
#define ATTR_US         1       /* Underscore mode */
#define ATTR_BD         2       /* Bold mode */
#define ATTR_RV         3       /* Reverse mode */
#define ATTR_SO         4       /* Standout mode */
#define ATTR_BL         5       /* Blinking */

mas os recursos screen e tmux usam esses recursos internos somente se o terminal externo os suportar, além de ser fornecido no descrição do terminal.

O OSX inclui uma cópia das ncurses e da banco de dados do terminal . Embora você possa instalar o MacPorts ou o homebrew e obter uma versão posterior , o que o OSX tem é ncurses 5.7.20081102 . Se você usar infocmp para mostrar as descrições do terminal, verá algo assim:

$ infocmp screen-256color
#       Reconstructed via infocmp from file: /usr/share/terminfo/73/screen-256color
screen-256color|GNU Screen with 256 colors,
        am, km, mir, msgr, xenl,
        colors#256, cols#80, it#8, lines#24, ncv#3, pairs#32767,
        acsc=++\,\,--..00''aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
        bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, civis=\E[?25l,
        clear=\E[H\E[J, cnorm=\E[34h\E[?25h, cr=^M,
        csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
        cud=\E[%p1%dB, cud1=^J, cuf=\E[%p1%dC, cuf1=\E[C,
        cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\EM,
        cvvis=\E[34l, dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM,
        dl1=\E[M, ed=\E[J, el=\E[K, el1=\E[1K, enacs=\E(B\E)0,
        flash=\Eg, home=\E[H, ht=^I, hts=\EH, ich=\E[%p1%d@,
        il=\E[%p1%dL, il1=\E[L, ind=^J, initc@, is2=\E)0, kbs=^H,
        kcbt=\E[Z, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA,
        kdch1=\E[3~, kend=\E[4~, kf1=\EOP, kf10=\E[21~,
        kf11=\E[23~, kf12=\E[24~, kf2=\EOQ, kf3=\EOR, kf4=\EOS,
        kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~,
        khome=\E[1~, kich1=\E[2~, kmous=\E[M, knp=\E[6~, kpp=\E[5~,
        nel=\EE, op=\E[39;49m, rc=\E8, rev=\E[7m, ri=\EM, rmacs=^O,
        rmcup=\E[?1049l, rmir=\E[4l, rmkx=\E[?1l\E>, rmso=\E[23m,
        rmul=\E[24m, rs2=\Ec\E[?1000l\E[?25h, sc=\E7,
        setab=\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m,
        setaf=\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m,
        sgr=\E[0%?%p6%t;1%;%?%p1%t;3%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;m%?%p9%t6%e7%;,
        sgr0=\E[m7, smacs=^N, smcup=\E[?1049h, smir=\E[4h,
        smkx=\E[?1h\E=, smso=\E[3m, smul=\E[4m, tbc=\E[3g,

Não há dim aqui. Em ncurses, isso foi adicionado em Abril de 2015 :

# 2015-04-22
#       + add 'dim' capability to screen entry (report by Leonardo B Schenkel)
#       + add several key definitions to nsterm-bce to match preconfigured
#         keys, e.g., with OSX 10.9 and 10.10 (report by Leonardo B Schenkel)

Da mesma forma, você não verá dim no xterm-256color. Isso foi adicionado em junho de 2014 :

# 2014-06-14
#       + modify sgr for screen.xterm-new to support dim capability -TD
#       + add dim capability to nsterm+7 -TD
#       + cancel dim capability for iterm -TD
#       + add dim, invis capabilities to vte-2012 -TD
#       + add sitm/ritm to konsole-base and mlterm3 -TD

A maneira em que dim é usado no Terminal.app externo não é indicado, mas provavelmente codificado (não usando a descrição do terminal). Mas screen e tmux não sabem como as sequências de escape chegam, mas sabemos que dim não é mencionado na descrição do terminal, portanto não é suportado.

Você pode atualizar seu banco de dados terminfo para adicionar o recurso dim a essas descrições de terminal, usando os utilitários infocmp e tic :

  • use infocmp para obter as descrições de terminal existentes para xterm-256color e screen-256color . Isso mostra apenas o primeiro; você iria, é claro, repetir o processo para a segunda descrição:

    infocmp -1x xterm-256color > foo

  • edite o arquivo de texto criado por infocmp , adicionando esta linha

    dim=\E[2m,
    

    e substituindo a linha por sgr= por esta linha:

    sgr=%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p5%t;2%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m,
    
  • use tic para substituir a descrição do terminal:

    sudo tic -x foo

Nota: O ponto da pergunta foi perguntar por que isso acontece; O Nicholas Marriott forneceu as informações para como resolver o problema.

    
por 14.07.2016 / 01:08
1

Correção fácil

Adicione o seguinte código a ~/.tmux.conf .

set -sa terminal-overrides ",*:dim=\E[2m"

Explicação tentativa

Application.app parece não ter a diretiva dim (veja o número 24).

Terminal 0: xterm-256color [references=1, flags=0x1]:
   1: acsc: (string) ''aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~
   0: AX: (flag) true
   2: bel: (string) 
set -sa terminal-overrides ",*:dim=\E[2m"
7 ... 23: dch1: (string) 3[P 24: dim: [missing] 25: dl: (string) 3[%p1%dM

Esta é a saída do comando tmux showmsgs -T executado dentro do Tmux .

Por outro lado, Terminal.app "envia" o dim de qualquer forma (não faz ideia de como ou porquê ), uma vez que está funcionando, como mostrado na foto acima.

A adição da diretiva dim ausente ( magicamente ) resolve o problema.

    
por 07.10.2015 / 19:56