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-简化版本。
- sc, rc: 保存当前光标位置,
- civis, cvvis, cnorm: 隐藏光标,突出光标(very visible!), 恢复正常光标
- blink: 闪烁模式
- clear: 清屏
- dl: 删$1行。
获得按键说明
这个其实是给各种库用的。比如你拿到一堆转义序列,你不知道是哪个键。这时候,看terminfo就能知道。
例如,你看infocmp结果里,有khome=xxx。那就是说,拿到xxx这个序列,就是按了home键。
所以有时候你登录到远端主机,发现home/end不好用,就是这个的关系。一般是因为,远端的主机没有你的terminal的terminfo数据。这样,他就不知道home/end对应的序列是啥了。这样,你按了home/end他也不懂。
解决方法也很简单,只要把你登录过去看见的$TERM对应的terminfo文件复制到远端的正确位置,就行了。对面有了terminfo数据,也就能理解这个序列代表哪个键了。