![Как использовать записи terminfo во FreeBSD?](https://rvso.com/image/89181/%D0%9A%D0%B0%D0%BA%20%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D0%B8%20terminfo%20%D0%B2%D0%BE%20FreeBSD%3F.png)
На моей локальной машине Linux я используютермит (на основе ВТЭ). Он поставляется с собственнымтерминфофайл ( xterm-termite
), который по умолчанию не распространяется вместе с ncurses.
Я пытаюсь подключиться к удаленному серверу FreeBSD. К сожалению, FreeBSD по умолчанию использует только старый формат termcap. Я не смог найти способ преобразовать terminfo в termcap. Поэтому, хотя я могу скомпилировать версию ncurses, которая включает поддержку terminfo из портов ( devel/ncurses
), приложения ncurses по умолчанию будут ссылаться на системную библиотеку lib. Это приводит к тому, что приложения не запускаются:
$ 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
Theинфокмпопция -C
говорит infocmp
использоватьtermcapимена, а -r
опция указывает ему переводить terminfoвозможностив формат termcap. Некоторые (например, выражения, используемые в sgr
) не будут переведены и infocmp
могут оставить закомментированные возможности, если есть достаточно места.
Под "достаточным пространством" подразумевается тот факт, что реальные приложения termcap допускают только 1023 байта в описании. FreeBSD использует ncurses ниже, но некоторые приложения делают предположения о длине записи.
Однако у FreeBSD есть файл termcap, который независим от ncurses. Также есть "порт" для ncurses, который некоторые считают полезным.
Кстати, возможно, вы имеете в виду это:термит/термит.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), также Томас Дики упомянул, что он на самом деле не работает.
- Печать (mc5i/mc0/mc4/mc5)
- Мигающий курсор (cvvis, также изменен cnorm)
- Расширения HP curses (meml/memu)
- Динамическое изменение позиций табуляции (hts/tbc)
- Редко используемые атрибуты (dim/invis)
- Удалены возможности, которые редко используются и слишком длительны
- Смещенные функциональные/курсорные клавиши (kf13+, kLFT/и т. д. [имена в верхнем регистре], kind, kri [используются для shift-up/down])
- Длинные последовательности инициализации и сброса (is2/rs2)
- Идентификация терминала и ответ (u8/u9)
- Переписал некоторые вещи, чтобы лучше соответствовать/быть совместимыми с termcap
- Изменены setab/setaf на менее эффективную версию, совместимую с termcap
- Изменено smkx/rmkx/clear на более короткое.
Это позволило сократить его до 1001 символа, не жертвуя ничем «важным» (в частности, он по-прежнему поддерживает 256 цветов и настройку текста заголовка).
xtermite|терминал на базе 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
для соответствия).