如何在 FreeBSD 上使用 terminfo 条目?

Wil*_*ter 8 freebsd ncurses terminfo

在我的本地 Linux 机器上,我使用的是termite (VTE-based)。它带有自己的terminfo文件(xterm-termite ),默认情况下不随 ncurses 一起分发。

我尝试连接到远程 FreeBSD 服务器。不幸的是,FreeBSD 默认只使用旧的 termcap 格式。我一直无法找到将 terminfo 转换为 termcap 的方法。因此,虽然我可以编译包含来自端口 ( 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.
Run Code Online (Sandbox Code Playgroud)

toe列出 terminfo 条目)

如何让 FreeBSD 默认使用 terminfo,或者强制应用程序使用端口提供的 ncurses lib,或者至少将 terminfo 转换为 termcap 数据?

(我知道像设置为一个安全值之类的变通方法,但我认为这违背了 terminfo 的目的)TERMxterm-256color

Tho*_*key 7

将 terminfo 转换为 termcap 的常规方法是

infocmp -Cr
Run Code Online (Sandbox Code Playgroud)

infocmp选项-C告诉infocmp使用的termcap名称和-r选项告诉它翻译terminfo的能力来的termcap格式。某些(例如 中使用的表达式sgr)不会翻译,infocmp如果有足够的空间,可能会留下注释掉的功能。

“足够的空间”是指实际的 termcap 应用程序在描述中只允许 1023 个字节。FreeBSD 在底层使用 ncurses,但一些应用程序会假设条目长度。

然而,FreeBSD 确实有一个独立于 ncurses 的 termcap 文件。ncurses 还有一个“端口”,有些人觉得它很有用。

顺便说一下,您可能指的是这个:termite/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:
Run Code Online (Sandbox Code Playgroud)

terminfo 条目中有一些错误(例如,VTE 不支持元模式)。此外,在 termcap 格式中,您可能会注意到大多数功能键都消失了(1023 字节限制)。

进一步阅读: