Como posso usar entradas terminográficas no FreeBSD?

6

Na minha máquina Linux local, estou usando cupim (baseado em VTE) . Ele vem com seu próprio arquivo terminfo ( xterm-termite ), que não é distribuído com ncurses por padrão.

Eu tento conectar-me a um servidor remoto do FreeBSD. Infelizmente, o FreeBSD por padrão só usa o formato termcap mais antigo. Eu não consegui encontrar uma maneira de converter o terminfo para termcap. Assim, enquanto eu posso compilar uma versão de ncurses que inclui suporte terminfo das portas ( devel/ncurses ), os aplicativos ncurses irão vincular à biblioteca fornecida pelo sistema por padrão. Isso resulta em aplicativos que não conseguem iniciar:

$ echo $TERM
xterm-termite
$ toe | grep termite
xterm-termite   VTE-based terminal
$ tmux
open terminal failed: can't find terminfo database
$ htop
Error opening terminal: xterm-termite.

( toe lista entradas terminográficas)

Como posso fazer o FreeBSD usar o terminfo por padrão, ou forçar os aplicativos a usar o ncurses lib fornecido pela porta, ou pelo menos converter o terminfo em dados termcap?

(estou ciente das soluções alternativas como configurar TERM para um valor seguro como xterm-256color , mas acho que isso anula o propósito do terminfo)

    
por Wilhelm Schuster 22.06.2016 / 18:08

2 respostas

6

A maneira convencional de converter o terminfo em termcap é com

infocmp -Cr

A opção infocmp -C diz infocmp para usar termcap names, e a opção -r diz para traduzir os recursos terminfo para o formato termcap. Alguns (como as expressões usadas em sgr ) não serão convertidos e infocmp poderá deixar recursos comentados se houver espaço suficiente.

Por "espaço suficiente", refere-se ao fato de que aplicativos termcap real permitem apenas 1023 bytes em uma descrição. O FreeBSD usa ncurses por baixo, mas algumas aplicações fazem suposições sobre o tamanho da entrada.

O FreeBSD, no entanto, possui um arquivo termcap que é independente de ncurses. Há também uma "porta" para ncurses, que alguns acham útil.

A propósito, você pode estar se referindo a isso: termite / termite.terminfo . Se você traduziu, você pode ver algo como

# vim: noet:ts=8:sw=8:sts=0
# (untranslatable capabilities removed to fit entry within 1023 bytes)
# (sgr removed to fit entry within 1023 bytes)
# (acsc removed to fit entry within 1023 bytes)
# (terminfo-only capabilities suppressed to fit entry within 1023 bytes)
xterm-termite|VTE-based terminal:\
        :am:hs:km:mi:ms:xn:\
        :co#80:it#8:li#24:\
        :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:IC=\E[%d@:\
        :K2=\EOE:LE=\E[%dD:RI=\E[%dC:SF=\E[%dS:SR=\E[%dT:\
        :UP=\E[%dA:ae=\E(B:al=\E[L:as=\E(0:bl=^G:bt=\E[Z:cd=\E[J:\
        :ce=\E[K:cl=\E[H\E[2J:cm=\E[%i%d;%dH:cr=^M:\
        :cs=\E[%i%d;%dr:ct=\E[3g:dc=\E[P:dl=\E[M:do=^J:\
        :ds=\E]2;
infocmp -Cr
7:ec=\E[%dX:ei=\E[4l:fs=^G:ho=\E[H:im=\E[4h:\ :is=\E[!p\E[?3;4l\E[4l\E>:k1=\EOP:k2=\EOQ:k3=\EOR:\ :k4=\EOS:k5=\E[15~:k6=\E[17~:k7=\E[18~:k8=\E[19~:\ :k9=\E[20~:kD=\E[3~:kI=\E[2~:kN=\E[6~:kP=\E[5~:kb=7:\ :kd=\EOB:ke=\E[?1l\E>:kh=\EOH:kl=\EOD:kr=\EOC:\ :ks=\E[?1h\E=:ku=\EOA:le=^H:md=\E[1m:me=\E[0m:mh=\E[2m:\ :mm=\E[?1034h:mo=\E[?1034l:mr=\E[7m:nd=\E[C:rc=\E8:sc=\E7:\ :se=\E[27m:sf=^J:so=\E[7m:sr=\EM:st=\EH:ta=^I:te=\E[?1049l:\ :ti=\E[?1049h:ts=\E]2;:ue=\E[24m:up=\E[A:us=\E[4m:\ :vb=\E[?5h\E[?5l:ve=\E[?12l\E[?25h:vi=\E[?25l:\ :vs=\E[?12;25h:

Existem alguns erros na entrada terminfo (o VTE não suporta o modo meta, por exemplo). Além disso, no formato termcap você pode notar que a maioria das teclas de função desaparece (limite de 1023 bytes).

Leitura adicional:

  • infocmp - compare ou imprima descrições de terminfo
  • infotocap - converte uma descrição do terminfo em um termcap    descrição
  • tctest - Um utilitário de teste do Termcap
por 22.06.2016 / 21:45
3

Às vezes, você precisa fazer algumas alterações manuais para traduzir as coisas corretamente.

Eu fiz as seguintes alterações para traduzir as partes "importantes" da descrição.

  • Recursos removidos que não podem ser representados no formato termcap:
    • Alteração de cor dinâmica (ccc / initc)
    • Sequência de configuração de vários atributos (sgr)
    • Visual Bell (flash, requer atraso intermediário que não funciona em termcap)
  • Recursos removidos que não são úteis:
    • Caracteres de desenho da caixa VT100 (smacs / rmacs / acsc, também alterados sgr0)
    • A meta-chave de 8 bits (km / smm / rmm), também mencionada por Thomas Dickey, não funciona de verdade.
    • Impressão (mc5i / mc0 / mc4 / mc5)
    • Cursor piscando (cvvis, também alterado cnorm)
    • HP amaldiçoa extensões (meml / memu)
    • Alteração dinâmica de paradas de tabulação (hts / tbc)
    • Atributos usados com pouca frequência (dim / invis)
  • Recursos removidos raramente usados e excessivamente longos
    • Teclas de função / cursor deslocadas (kf13 +, kLFT / etc [nomes de letras maiúsculas], tipo, kri [usado para deslocamento para cima / baixo])
    • Sequências de inicialização e reinicialização de formato longo (is2 / rs2)
    • Identificação e resposta do terminal (u8 / u9)
  • Reescreveu algumas coisas para se adequar melhor / ser compatível com termcap
    • Setab / setaf alterado para versão menos eficiente compatível com termcap
    • Alterou smkx / rmkx / clear para ser mais curto

Isso reduziu para 1001 caracteres sem sacrificar nada "importante" (em particular, ele ainda suporta 256 cores e definindo o texto da barra de título)

xterm-termite|VTE-based terminal:\
    :NP:am:hs:mi:ms:ut:xn:\
    :Co#256:co#80:it#8:li#24:pa#32767:\
    :@7=\EOF:@8=\EOM:AB=\E[48;5;%dm:AF=\E[38;5;%dm:AL=\E[%dL:\
    :DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:F1=\E[23~:F2=\E[24~:\
    :IC=\E[%d@:K2=\EOE:Km=\E[M:LE=\E[%dD:RA=\E[?7l:RI=\E[%dC:\
    :SA=\E[?7h:SF=\E[%dS:SR=\E[%dT:UP=\E[%dA:ZH=\E[3m:\
    :ZR=\E[23m:al=\E[L:bl=^G:bt=\E[Z:cb=\E[1K:cd=\E[J:ce=\E[K:\
    :ch=\E[%i%dG:cl=\E[H\E[J:cm=\E[%i%d;%dH:cr=^M:\
    :cs=\E[%i%d;%dr:cv=\E[%i%dd:dc=\E[P:dl=\E[M:do=^J:\
    :ds=\E]2;
xterm-termite|VTE-based terminal:\
    :NP:am:hs:mi:ms:ut:xn:\
    :Co#256:co#80:it#8:li#24:pa#32767:\
    :@7=\EOF:@8=\EOM:AB=\E[48;5;%dm:AF=\E[38;5;%dm:AL=\E[%dL:\
    :DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:F1=\E[23~:F2=\E[24~:\
    :IC=\E[%d@:K2=\EOE:Km=\E[M:LE=\E[%dD:RA=\E[?7l:RI=\E[%dC:\
    :SA=\E[?7h:SF=\E[%dS:SR=\E[%dT:UP=\E[%dA:ZH=\E[3m:\
    :ZR=\E[23m:al=\E[L:bl=^G:bt=\E[Z:cb=\E[1K:cd=\E[J:ce=\E[K:\
    :ch=\E[%i%dG:cl=\E[H\E[J:cm=\E[%i%d;%dH:cr=^M:\
    :cs=\E[%i%d;%dr:cv=\E[%i%dd:dc=\E[P:dl=\E[M:do=^J:\
    :ds=\E]2;%pre%7:ec=\E[%dX:ei=\E[4l:fs=^G:ho=\E[H:im=\E[4h:\
    :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~:kB=\E[Z:kD=\E[3~:\
    :kI=\E[2~:kN=\E[6~:kP=\E[5~:kb=7:kd=\EOB:ke=\E[?1l:\
    :kh=\EOH:kl=\EOD:kr=\EOC:ks=\E[?1h:ku=\EOA:le=^H:md=\E[1m:\
    :me=\E[m:mr=\E[7m:nd=\E[C:op=\E[39;49m:r1=\Ec:rc=\E8:\
    :sc=\E7:se=\E[27m:sf=^J:so=\E[7m:sr=\EM:ta=^I:te=\E[?1049l:\
    :ti=\E[?1049h:ts=\E]2;:u6=\E[%i%d;%dR:u7=\E[6n:ue=\E[24m:\
    :up=\E[A:us=\E[4m:ve=\E[?25h:vi=\E[?25l:
7:ec=\E[%dX:ei=\E[4l:fs=^G:ho=\E[H:im=\E[4h:\ :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~:kB=\E[Z:kD=\E[3~:\ :kI=\E[2~:kN=\E[6~:kP=\E[5~:kb=7:kd=\EOB:ke=\E[?1l:\ :kh=\EOH:kl=\EOD:kr=\EOC:ks=\E[?1h:ku=\EOA:le=^H:md=\E[1m:\ :me=\E[m:mr=\E[7m:nd=\E[C:op=\E[39;49m:r1=\Ec:rc=\E8:\ :sc=\E7:se=\E[27m:sf=^J:so=\E[7m:sr=\EM:ta=^I:te=\E[?1049l:\ :ti=\E[?1049h:ts=\E]2;:u6=\E[%i%d;%dR:u7=\E[6n:ue=\E[24m:\ :up=\E[A:us=\E[4m:ve=\E[?25h:vi=\E[?25l:

Observe que todas as linhas recuadas devem usar guias para indentação.

O importante para o suporte a cores são os recursos AB e AF - eles não podem ser traduzidos automaticamente de setab / setaf porque é um terminal de 256 cores. A parte relevante do termcap é :AB=\E[48;5;%dm:AF=\E[38;5;%dm: ; para o modo não-256 cores, seria :AB=\E[4%dm:AF=\E[3%dm: (e Co#8 , pa#64 para corresponder).

    
por 25.09.2016 / 08:13