Como posso usar entradas terminfo no FreeBSD?

Como posso usar entradas terminfo no FreeBSD?

Na minha máquina Linux local, estou usandocupim (baseado em TEV). Ele vem com o seu próprioinformações do termofile ( xterm-termite), que não é distribuído com ncurses por padrão.

Tento me conectar a um servidor FreeBSD remoto. Infelizmente, o FreeBSD, por padrão, usa apenas o formato termcap mais antigo. Não consegui encontrar uma maneira de converter terminfo em termcap. Portanto, embora eu possa compilar uma versão do ncurses que inclua suporte terminfo das portas ( devel/ncurses), os aplicativos ncurses serão vinculados à biblioteca fornecida pelo sistema por padrão. Isso faz com que os aplicativos não sejam iniciados:

$ 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.

( toelista entradas terminfo)

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

(estou ciente dosoluções alternativascomo definir TERMum valor seguro como xterm-256color, mas acho que isso vai contra o propósito do terminfo)

Responder1

A maneira convencional de converter terminfo em termcap é com

infocmp -Cr

Oinfocmpopção -Cdiz infocmppara usartermcapnomes, e a -ropção diz para traduzir terminfocapacidadespara o formato termcap. Algumas (como as expressões usadas em sgr) não serão traduzidas e infocmppoderão deixar recursos comentados se houver espaço suficiente.

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

O FreeBSD, entretanto, possui um arquivo termcap que é independente do ncurses. Também existe uma "porta" para ncurses, que alguns consideram útil.

A propósito, você pode estar se referindo a isto:cupim/cupim.terminfo. Se você traduziu, poderá 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;\007: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=\177:\
        :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 (VTE não suporta meta modo, por exemplo). Além disso, no formato termcap você pode notar que a maioria das teclas de função desaparecem (limite de 1023 bytes).

Leitura adicional:

Responder2

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

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

  • Recursos removidos que não podem ser representados no formato termcap:
    • Mudança dinâmica de cores (ccc/initc)
    • Sequência de configuração multiatributo (sgr)
    • Visual Bell (flash, requer atraso intermediário que não funciona no termcap)
  • Recursos removidos que não são úteis:
    • Caracteres de desenho de caixa VT100 (smacs/rmacs/acsc, também alterado sgr0)
    • Meta-chave de 8 bits (km/smm/rmm), também Thomas Dickey mencionou que na verdade não funciona.
    • Impressão (mc5i/mc0/mc4/mc5)
    • Cursor piscando (cvvis, também mudou cnorm)
    • Extensões de maldições HP (meml/memu)
    • Mudança dinâmica de paradas de tabulação (hts/tbc)
    • Atributos usados ​​com pouca frequência (dim/invis)
  • Recursos removidos que raramente são usados ​​e excessivamente longos
    • Teclas de função/cursor deslocadas (kf13+, kLFT/etc [nomes em maiúsculas], kind, kri [usado para shift-up/down])
    • Sequências de inicialização e redefinição de formato longo (is2/rs2)
    • Identificação e resposta do terminal (u8/u9)
  • Reescrevi algumas coisas para caber melhor/ser compatível com termcap
    • Setab/setaf alterado para uma versão menos eficiente compatível com termcap
    • Alterado smkx/rmkx/clear para ser mais curto

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

xterm-termite|Terminal baseado em VTE:\
    :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;\007: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=\177: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 tabulações para recuo.

O importante para o suporte de cores são os recursos AB e AF - eles não puderam 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 sem 256 cores seria :AB=\E[4%dm:AF=\E[3%dm:(e Co#8, pa#64para corresponder).

informação relacionada