Wie kann ich terminfo-Einträge unter FreeBSD verwenden?

7

Auf meinem lokalen Linux-Computer verwende ich Termite (VTE-basiert) . Es wird mit einer eigenen terminfo- Datei ( xterm-termite) geliefert , die standardmäßig nicht mit ncurses verteilt wird.

Ich versuche, eine Verbindung zu einem Remote-FreeBSD-Server herzustellen. Leider verwendet FreeBSD standardmäßig nur das ältere Termcap-Format. Ich habe keine Möglichkeit gefunden, terminfo in termcap umzuwandeln. Während ich also eine Version von ncurses kompilieren kann, die Terminfo-Unterstützung von den Ports ( devel/ncurses) enthält, werden ncurses-Anwendungen standardmäßig mit der vom System bereitgestellten Bibliothek verknüpft. Dies führt dazu, dass Apps nicht gestartet werden können:

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

( toelistet terminfo Einträge auf)

Wie kann ich FreeBSD dazu bringen, terminfo standardmäßig zu verwenden, oder Anwendungen dazu zwingen, die vom Port bereitgestellte ncurses lib zu verwenden, oder terminfo zumindest in termcap-Daten konvertieren?

(Ich bin mir der Problemumgehungen bewusst, wie das Festlegen TERMeines sicheren Werts wie xterm-256color, aber ich denke, dass dies den Zweck von terminfo zunichte macht.)

Wilhelm Schuster
quelle
1
Versuchen Sie infocmp -C, einen Termcap-Eintrag zu erstellen.
Mark Plotnick
@ MarkPlotnick Vielen Dank, das funktioniert! Ich rannte infocmp -C xterm-termite >> /usr/share/misc/termcap; cap_mkdb /usr/share/misc/termcap. Fühlen Sie sich frei, es als Antwort hinzuzufügen, damit ich es genehmigen kann.
Wilhelm Schuster

Antworten:

7

Die herkömmliche Methode zum Konvertieren von terminfo in termcap ist mit

infocmp -Cr

Die Option infocmp-C weist infocmpan, Termcap- Namen zu verwenden, und die -rOption weist an, Terminfo- Funktionen in das Termcap-Format zu übersetzen . Einige (wie die in verwendeten Ausdrücke sgr) werden nicht übersetzt und infocmpkönnen auskommentierte Funktionen hinterlassen, wenn genügend Speicherplatz vorhanden ist.

Mit "genügend Speicherplatz" wird die Tatsache bezeichnet, dass echte Termcap-Anwendungen in einer Beschreibung nur 1023 Byte zulassen. FreeBSD verwendet darunter ncurses, aber einige Anwendungen gehen von der Eintragslänge aus.

FreeBSD hat jedoch eine Termcap-Datei, die unabhängig von ncurses ist. Es gibt auch einen "Port" für Flüche, den einige nützlich finden.

Übrigens können Sie sich darauf beziehen: termite / termite.terminfo . Wenn Sie es übersetzt haben, sehen Sie möglicherweise so etwas

# 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:

Der terminfo-Eintrag enthält einige Fehler (VTE unterstützt beispielsweise keinen Metamodus). Im Termcap-Format stellen Sie möglicherweise fest, dass die meisten Funktionstasten nicht mehr vorhanden sind (maximal 1023 Byte).

Weiterführende Literatur:

Thomas Dickey
quelle
Vielen Dank für die ausführliche Erklärung! Ich frage mich, warum sie nicht zu terminfo übergegangen sind ... Diese Größenbeschränkung zum Beispiel scheint geheimnisvoll.
Wilhelm Schuster
Meist Trägheit.
Thomas Dickey
Wie oben erwähnt, werden einige Dinge aufgrund der Größenbeschränkung weggeworfen. Farben fehlen leider, aber zumindest funktioniert Backspace jetzt.
Wilhelm Schuster
Die -TOption von funktioniert infocmp möglicherweise für Sie, aber einige Anwendungen können nicht funktionieren.
Thomas Dickey
4

Manchmal müssen Sie einige manuelle Änderungen vornehmen, um die Dinge richtig zu übersetzen.

Ich habe die folgenden Änderungen vorgenommen, damit die "wichtigen" Teile der Beschreibung übersetzt werden.

  • Entfernte Funktionen, die nicht im Termcap-Format dargestellt werden können:
    • Dynamischer Farbwechsel (ccc / initc)
    • Einstellsequenz für mehrere Attribute (sgr)
    • Visual Bell (Flash, erfordert eine Zwischenverzögerung, die in Termcap nicht funktioniert)
  • Nicht nützliche Funktionen entfernt:
    • Zeichen für das Zeichnen von VT100-Boxen (smacs / rmacs / acsc, auch sgr0 geändert)
    • 8-Bit-Metaschlüssel (km / smm / rmm), auch Thomas Dickey erwähnte, dass es nicht wirklich funktioniert.
    • Drucken (mc5i / mc0 / mc4 / mc5)
    • Blinkender Cursor (cvvis, auch cnorm geändert)
    • HP verflucht Erweiterungen (meml / memu)
    • Dynamisches Ändern von Tabulatoren (hts / tbc)
    • Selten verwendete Attribute (dim / invis)
  • Entfernte Funktionen, die selten verwendet werden und zu lang sind
    • Verschobene Funktions- / Cursortasten (kf13 +, kLFT / etc [Großbuchstaben], Art, kri [zum Verschieben nach oben / unten])
    • Langform-Init- und Reset-Sequenzen (is2 / rs2)
    • Terminalidentifikation und -antwort (u8 / u9)
  • Einige Dinge wurden neu geschrieben, um besser zu passen / mit termcap kompatibel zu sein
    • Setab / setaf wurde in eine weniger effiziente termcap-kompatible Version geändert
    • Smkx / rmkx / clear wurde geändert, um kürzer zu sein

Dadurch wurden 1001 Zeichen erreicht, ohne dass etwas "Wichtiges" geopfert wurde (insbesondere werden weiterhin 256 Farben unterstützt und der Text in der Titelleiste festgelegt).

xterm-termite | VTE-basiertes 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 [23 m: 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 [7 m: nd = \ E [C: op = \ E [39; 49 m: 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:

Beachten Sie, dass alle eingerückten Zeilen Registerkarten zum Einrücken verwenden sollten.

Das Wichtigste für die Farbunterstützung sind die AB- und AF-Funktionen - sie konnten nicht automatisch von setab / setaf übersetzt werden, da es sich um ein 256-Farben-Terminal handelt. Der relevante Teil der Termkappe ist :AB=\E[48;5;%dm:AF=\E[38;5;%dm:; für den Nicht-256-Farben-Modus wäre es :AB=\E[4%dm:AF=\E[3%dm:(und Co#8, pa#64um übereinzustimmen).

Random832
quelle
Vielen Dank für die Antwort und die unermüdliche Erklärung, wie Sie zur Lösung gekommen sind. Ich würde sagen, dass die Antwort von @ thomas-dickey immer noch zu meiner Frage passt, die breiter und nicht unbedingt nur für VTE-basierte Terminals besser war. Ich hoffe du kannst das verstehen.
Wilhelm Schuster
@WilhelmSchuster Meine Antwort sollte einigermaßen allgemein sein, um Techniken zum Reduzieren eines Terminfo-Eintrags in etwas zu erklären, das ohne Auslassungen übersetzt werden kann. Wie auch immer, das Wichtigste für Farbe, da das Problem, über das Sie sich beschwert haben, ein Mangel an Farbe war, ist :AB=\E[48;5;%dm:AF=\E[38;5;%dm:(oder :AB=\E[4%dm:AF=\E[3%dm:für Terminals ohne 256 Farben) in der Termkappe, die für die meisten Terminals gleich ist und manuell hinzugefügt werden könnte, vorausgesetzt, es gibt genug Platz dafür. Aber ich mache mir auf keinen Fall Sorgen darüber, wer die akzeptierte Flagge bekommt, nur froh, dass ich bei Ihrem Problem helfen konnte.
Random832