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 paraxterm-256color
escreen-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 linhadim=\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.