FreeBSD で terminfo エントリを使用するにはどうすればよいですか?

FreeBSD で terminfo エントリを使用するにはどうすればよいですか?

私のローカルLinuxマシンでは、シロアリ(VTEベース)独自の用語情報ファイル ( xterm-termite) は、デフォルトでは ncurses と一緒に配布されません。

リモート FreeBSD サーバーに接続しようとしています。残念ながら、FreeBSD はデフォルトで古い termcap 形式のみを使用します。terminfo を termcap に変換する方法を見つけることができませんでした。そのため、ports ( devel/ncurses) から terminfo サポートを含む ncurses のバージョンをコンパイルすることはできますが、ncurses アプリケーションはデフォルトでシステム提供のライブラリにリンクします。その結果、アプリは起動に失敗します。

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

( toeterminfo エントリを一覧表示)

FreeBSD でデフォルトで terminfo を使用するようにするには、またはアプリケーションにポート提供の ncurses ライブラリの使用を強制するには、または少なくとも terminfo を termcap データに変換するには、どうすればよいでしょうか。

(私は回避策TERMのような安全な値に設定するのが好きですxterm-256colorが、それはterminfoの目的に反すると思います)

答え1

terminfoをtermcapに変換する従来の方法は、

infocmp -Cr

情報cmpオプションは使用するよう-C指示しますinfocmpタームキャップ名前を指定し、-rオプションはterminfoを翻訳するように指示します機能termcap 形式に変換されます。 で使用される式など、一部はsgr変換されず、infocmp十分なスペースがある場合はコメントアウトされた機能が残ることがあります。

「十分なスペース」とは、実際の termcap アプリケーションでは記述に 1023 バイトしか許可されないという事実を指します。FreeBSD は ncurses を基盤として使用しますが、一部のアプリケーションではエントリの長さについて想定しています。

ただし、FreeBSD には ncurses から独立した termcap ファイルがあります。また、ncurses 用の「ポート」もあり、一部の人にとっては便利です。

ちなみに、これは次のことを指しているかもしれません:シロアリ/termite.terminfo翻訳すると、次のようになるでしょう。

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

terminfo エントリにはいくつかのエラーがあります (たとえば、VTE はメタ モードをサポートしていません)。また、termcap 形式では、ほとんどのファンクション キーが消えていることに気付くかもしれません (1023 バイトの制限)。

参考文献:

答え2

適切に翻訳するために手動で変更を加える必要がある場合もあります。

説明の「重要な」部分を翻訳するために、次の変更を加えました。

  • termcap 形式で表現できない機能が削除されました:
    • ダイナミックカラーチェンジ(ccc/initc)
    • 複数属性設定シーケンス (sgr)
    • ビジュアルベル (フラッシュ、termcap では動作しない中間遅延が必要)
  • 役に立たない機能を削除しました:
    • VT100 ボックス描画文字 (smacs/rmacs/acsc、sgr0 も変更)
    • 8 ビット メタ キー (km/smm/rmm)。Thomas Dickey 氏も、実際には機能しないと述べています。
    • 印刷 (mc5i/mc0/mc4/mc5)
    • 点滅カーソル (cvvis、cnorm も変更)
    • HP curses 拡張 (meml/memu)
    • タブストップの動的変更 (hts/tbc)
    • あまり使用されない属性 (dim/invis)
  • あまり使われず、長すぎる機能を削除しました
    • シフト機能/カーソルキー (kf13+、kLFT/etc [大文字の名前]、kind、kri [シフトアップ/ダウンに使用])
    • 長い形式の初期化およびリセットシーケンス (is2/rs2)
    • 端末識別と応答(u8/u9)
  • いくつかの部分を書き直して、termcap との互換性を高めました。
    • setab/setaf を、効率の低い termcap 互換バージョンに変更しました。
    • smkx/rmkx/clear を短く変更しました

これにより、「重要な」ものを犠牲にすることなく、文字数を 1001 文字に減らすことができました (特に、256 色をサポートし、タイトル バーのテキストを設定しています)。

xterm-termite|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:

すべてのインデントされた行ではインデントにタブを使用する必要があることに注意してください。

カラー サポートにとって重要なのは、AB 機能と AF 機能です。setab/setaf は 256 色端末なので、これらを自動変換することはできません。termcap の関連部分は です。256:AB=\E[48;5;%dm:AF=\E[38;5;%dm:色以外のモードでは になります:AB=\E[4%dm:AF=\E[3%dm:(一致するようにCo#8pa#64)。

関連情報