![如何在 FreeBSD 上使用 terminfo 條目?](https://rvso.com/image/89181/%E5%A6%82%E4%BD%95%E5%9C%A8%20FreeBSD%20%E4%B8%8A%E4%BD%BF%E7%94%A8%20terminfo%20%E6%A2%9D%E7%9B%AE%EF%BC%9F.png)
在我的本機 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
來匹配)。