TERM变量,terminfo 与 termcap

TERM

一个环境变量,表示当前用那个terminfo/termcap

termcap

这东西已经过时了

terminfo

某人重写termcap之后的结果。

其实是一个数据库,用$TERM作为索引进去找。每个项目描述了某种terminal,例如rxvt-unicode,screen-256color之类。 在linux下,在/usr/share/terminfo/?/里面有所有的数据。文件名就是key。

不过这个东西是二进制的。幸好有东西可以编解码。

转成文本形式之后,这个的内容是一堆a=b形式的键-值对,或者就一个键名,或者a#b,逗号分隔。 其中,键名表示了某种功能/能力。如果只有一个键名,那就是有一种能力。如果有值,那就是输出那堆值之后,能够使用的某种能力,或者term拿到那堆值之后,说明你按了某个键。 如果是a#b,那就是某个属性和对应值。

能力列表参见terminfo manpage。Capname那列就是能力名字。

测试是否有能力

   tput <capname>

如果返回值是0,那就是有这个能力。返回1,就木有那个能力。返回4,说明你打错能力名了。

例如

   tput xenl

我这儿返回0,说明我的term在80行之后忽略换行(啥?)。类似的还有bce,bw,……一堆。

获得属性值

   tput <capname>

输出的就是属性值。

例如

   tput colors

就会得到当前term支持的颜色数量。例如在我这儿是256。 类似的有cols(列数), lines(行数),……

使用能力

   tput <capname> [<param1>, ...]

比如说:

   tput smul; echo xxxx; tput enul

就是使用了进入下划线模式(smul)和退出下划线模式(enul)。你可以看见xxxx是带下划线的。

类似的有bold(粗体), cud, cuf, ...

  • cub, cud, cuf, cuu: 左移$1列,下移$1行,右移$1列,上移$1行。
  • cub1, cud1, cuf1, cuu1: 以上命令的1-简化版本。
  • cup: 直接跳转到$1行$1列
  • sc, rc: 保存,恢复当前光标位置(这不是栈……)
  • civis, cvvis, cnorm: 隐藏光标,突出光标(very visible!), 恢复正常光标
  • blink: 闪烁模式
  • clear: 清屏
  • dl: 删$1行。
  • setab, setaf: 设置背景色,设置前景色。
  • rev: 反色。

获得按键说明

这个其实是给各种库用的。比如你拿到一堆转义序列,你不知道是哪个键。这时候,看terminfo就能知道。

例如,你看infocmp结果里,有khome=xxx。那就是说,拿到xxx这个序列,就是按了home键。

所以有时候你登录到远端主机,发现home/end不好用,就是这个的关系。一般是因为,远端的主机没有你的terminal的terminfo数据。这样,他就不知道home/end对应的序列是啥了。这样,你按了home/end他也不懂。

解决方法也很简单,只要把你登录过去看见的$TERM对应的terminfo文件复制到远端的正确位置,就行了。对面有了terminfo数据,也就能理解这个序列代表哪个键了。