如何在 FreeBSD 上使用 terminfo 条目?

如何在 FreeBSD 上使用 terminfo 条目?

在我的本地 Linux 机器上,我正在使用白蚁(基于 VTE)。它有自己的术语信息file ( xterm-termite),默认情况下不随 ncurses 一起分发。

我尝试连接到远程 FreeBSD 服务器。不幸的是,FreeBSD 默认情况下仅使用较旧的 termcap 格式。我一直无法找到将 terminfo 转换为 termcap 的方法。因此,虽然我可以编译包含端口 ( ) 的 terminfo 支持的 ncurses 版本devel/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.

toe列出 terminfo 条目)

如何让 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)
    • Visual Bell(闪光,需要中间延迟,在 termcap 中不起作用)
  • 删除了无用的功能:
    • VT100画框字符(smacs/rmacs/acsc,也改成sgr0)
    • 8 位元密钥 (km/smm/rmm),Thomas Dickey 也提到它实际上不起作用。
    • 打印(mc5i/mc0/mc4/mc5)
    • 闪烁光标(cvvis,也更改了 cnorm)
    • HP 诅咒扩展 (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 的相关部分是:AB=\E[48;5;%dm:AF=\E[38;5;%dm:;对于非 256 色模式,它是:AB=\E[4%dm:AF=\E[3%dm:(和Co#8,pa#64来匹配)。

相关内容