Tela GNU: Estranho TERMCAP ao usar -d -m

3

Dependendo de como eu executo screen , ele tem ou não as informações corretas de TERMCAP. O sintoma disso é que as cores nem sempre aparecem no meu terminal corretamente (por exemplo: ls, realce de sintaxe vim, etc).

Isso funciona bem:

$ echo $TERMCAP
  <empty output>
$ screen -S foo
$ screen -r foo
  <now I'm inside a screen session>
$ echo $TERMCAP
  <long output>
$ ls
  <nice pretty colors>

Isso tem problemas:

$ echo $TERMCAP
  <empty output>
$ screen -d -m -S foo
$ screen -r foo
  <now I'm inside a screen session>
$ echo $TERMCAP
  <long output, but different than before>
$ ls
  <no colors ):>

Agora, posso contornar isso. Eu posso mexer com meu TERMCAP manualmente, etc.

Mas eu realmente gostaria de entender o que está acontecendo. Eu gostaria de encontrar uma solução 'limpa', se possível.

Alguém sabe o que está acontecendo aqui? Que diferença deve fazer se eu usar -d -m ao executar screen ?

Isso está no FreeBSD, se isso importa.

    
por jwd 10.03.2013 / 06:19

2 respostas

2

Quando você usa as opções -d -m , screen inicia no modo desanexado e, nesse caso, não tenta melhorar sua descrição do terminal com base na sua variável TERM atual. Ele procura apenas a variável TERM quando ela é iniciada normalmente (não desanexada). Quando você anexa à sessão que foi iniciada desanexada, é tarde demais para fazer essa inicialização com base em TERM .

A seção 16.1 Escolhendo a entrada termcap para uma janela no manual descreve algumas das correções que faz.

O que você viu para o caso que não funciona é assim:

TERMCAP=SC|screen|VT 100/ANSI X3.64 virtual terminal:\
        :DO=\E[%dB:LE=\E[%dD:RI=\E[%dC:UP=\E[%dA:bs:bt=\E[Z:\
        :cd=\E[J:ce=\E[K:cl=\E[H\E[J:cm=\E[%i%d;%dH:ct=\E[3g:\
        :do=^J:nd=\E[C:pt:rc=\E8:rs=\Ec:sc=\E7:st=\EH:up=\EM:\
        :le=^H:bl=^G:cr=^M:it#8:ho=\E[H:nw=\EE:ta=^I:is=\E)0:\
        :li#24:co#80:am:xn:xv:LP:sr=\EM:al=\E[L:AL=\E[%dL:\
        :cs=\E[%i%d;%dr:dl=\E[M:DL=\E[%dM:dc=\E[P:DC=\E[%dP:\
        :im=\E[4h:ei=\E[4l:mi:IC=\E[%d@:ks=\E[?1h\E=:\
        :ke=\E[?1l\E>:vi=\E[?25l:ve=\E[34h\E[?25h:vs=\E[34l:\
        :ti=\E[?1049h:te=\E[?1049l:k0=\E[10~:k1=\EOP:k2=\EOQ:\
        :k3=\EOR:k4=\EOS:k5=\E[15~:k6=\E[17~:k7=\E[18~:\
        :k8=\E[19~:k9=\E[20~:k;=\E[21~:F1=\E[23~:F2=\E[24~:\
        :kh=\E[1~:@1=\E[1~:kH=\E[4~:@7=\E[4~:kN=\E[6~:kP=\E[5~:\
        :kI=\E[2~:kD=\E[3~:ku=\EOA:kd=\EOB:kr=\EOC:kl=\EOD:

enquanto o bom se parece com isso:

TERMCAP=SC|screen|VT 100/ANSI X3.64 virtual terminal:\
        :DO=\E[%dB:LE=\E[%dD:RI=\E[%dC:UP=\E[%dA:bs:bt=\E[Z:\
        :cd=\E[J:ce=\E[K:cl=\E[H\E[J:cm=\E[%i%d;%dH:ct=\E[3g:\
        :do=^J:nd=\E[C:pt:rc=\E8:rs=\Ec:sc=\E7:st=\EH:up=\EM:\
        :le=^H:bl=^G:cr=^M:it#8:ho=\E[H:nw=\EE:ta=^I:is=\E)0:\
        :li#25:co#80:am:xn:xv:LP:sr=\EM:al=\E[L:AL=\E[%dL:\
        :cs=\E[%i%d;%dr:dl=\E[M:DL=\E[%dM:dc=\E[P:DC=\E[%dP:\
        :im=\E[4h:ei=\E[4l:mi:IC=\E[%d@:ks=\E[?1h\E=:\
        :ke=\E[?1l\E>:vi=\E[?25l:ve=\E[34h\E[?25h:vs=\E[34l:\
        :ti=\E[?1049h:te=\E[?1049l:us=\E[4m:ue=\E[24m:so=\E[3m:\
        :se=\E[23m:md=\E[1m:mr=\E[7m:me=\E[m:ms:\
        :Co#8:pa#64:AF=\E[3%dm:AB=\E[4%dm:op=\E[39;49m:AX:G0:\
        :as=\E(0:ae=\E(B:\
        :ac=00aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~..--++,,hhII00:\
        :k0=\E[10~:k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:k5=\E[15~:\
        :k6=\E[17~:k7=\E[18~:k8=\E[19~:k9=\E[20~:k;=\E[21~:\
        :F1=\E[23~:F2=\E[24~:kb=^H:K2=\EOE:kB=\E[Z:kh=\E[1~:\
        :@1=\E[1~:kH=\E[4~:@7=\E[4~:kN=\E[6~:kP=\E[5~:kI=\E[2~:\
        :kD=\E[3~:ku=\EOA:kd=\EOB:kr=\EOC:kl=\EOD:km:

No caso positivo, screen notou que TERM foi definido como xterm e adicionou recursos a partir dessa descrição.

Você notará este problema com o FreeBSD porque o termcap distribuído com screen não tem cor, quando você limita a descrição ao limite de 1023 bytes assumido pelos aplicativos termcap (as configurações extras são descartadas). Em outras plataformas, você provavelmente estaria usando a descrição fornecida por ncurses, que faz dizer como usar cores. A diferença não é devida à biblioteca usada; Embora screen seja um aplicativo termcap , ele usa ncurses no FreeBSD:

$ ldd 'which screen'
/usr/local/bin/screen:
    libncurses.so.8 => /lib/libncurses.so.8 (0x80086a000)
    libelf.so.1 => /usr/lib/libelf.so.1 (0x800ab6000)
    libutil.so.9 => /lib/libutil.so.9 (0x800ccb000)
    libulog.so.0 => /lib/libulog.so.0 (0x800edd000)
    libcrypt.so.5 => /lib/libcrypt.so.5 (0x8010df000)
    libc.so.7 => /lib/libc.so.7 (0x8012ff000)
    libmd.so.6 => /lib/libmd.so.6 (0x801698000)

Em vez disso, a diferença é devida a

  • O FreeBSD constrói ncurses usando o banco de dados termcap em vez de terminfo (você pode obter o banco de dados terminfo usando uma porta) e
  • O FreeBSD tem um arquivo termcap, que não corresponde a outros bancos de dados do terminal. Enquanto algumas correções foram feitas, ainda tem peculiaridades como VT100s com cor , e modificações para fazer as diferenças entre seu console com TERM=xterm e um xterm real menos aparente (exceto para pessoas que usam o xterm, é claro).

Um pouco irônico, pode-se notar que screen define TERMCAP para um formato de várias linhas. Isso foi usado em 4.2BSD e 4.3BSD, mas tornou obsoleto em 4.4BSD (cerca de 25 anos atrás), com a mudança para o uso de bancos de dados com hash e ao mesmo tempo descartando o espaço em branco (que contava com o limite de 1023 bytes no tamanho do termcap) . Desde que o FreeBSD mudou para o ncurses nos anos 90 , esse formato está mais desatualizado, com poucos aplicativos contando na variável TERMCAP . Mas ls é um desses.

screen tem uma opção -T que deve ajudar com isso especificando uma entrada termcap específica (que tem cor), mas ao testá-la, aparece que não pode resolver o problema. / p>

Leitura adicional:

por 03.04.2016 / 03:02
2

Bem, eu tenho algo que não é muito bruto para corrigir o problema:

No meu script em que estou criando screen sessions, estou perto do topo:

# This runs the commands:
# TERM=screen
# TERMCAP='...'
# with values appropriate for a 'screen' terminal
eval "$(tset - -s screen | tail -n+2)"

# Set up the SCREENCAP variable, which 'screen' will use for new sessions
SCREENCAP="$TERMCAP"; export SCREENCAP

# ...

screen -d -m -S my-session

Agora, quando me conecto a my-session , as cores dos terminais funcionam.

Não totalmente satisfatório, mas funciona bem o suficiente.

    
por 13.03.2013 / 23:15