terminfo

termcap顾名思义,是一个terminal capability database的库,编写text界面程序的时候,使用它便可以回避各种不同的terminal之间的差异;terminfo是termcap的升级版。

 

在arch linux这里,terminfo相关的工具和数据库都是随着ncurses这个软件包附带的,安好了这个软件包之后,就有了/usr/share/terminfo/?/*这些各种各样的terminal的数据库,另外/usr/lib/terminfo/?/*是跟它完全重复的一套,不晓得为什么。

用户自己的数据库文件一般放在~/.terminfo下面。

 

这些文件都是编译好了的数据库,但是你可以用infocmp来重新生成某个terminal数据库的源文件。相反的,从源文件编译成数据库,使用tic工具。

 

打开man terminfo,有个长长的表格,分别有variable、capname和termcap code三列。

作为text界面程序开发人员,使用variable来指明自己要是用的capability;

作为terminal数据库源文件维护者,使用capname来指明要定义的capability;

而termcap code则是老的termcap的对应的capability的名称。

 

举例说明,以前为了实现man的彩色显示,我在.bashrc中有如下export:

export LESS_TERMCAP_mb=$'\E[1;31m'       # begin blinking
export LESS_TERMCAP_md=$'\E[1;38;5;74m'  # begin bold
export LESS_TERMCAP_me=$'\E[0m'          # end mode
export LESS_TERMCAP_so=$'\E[38;5;246m'   # begin standout-mode(search results and bottom status)
export LESS_TERMCAP_se=$'\E[0m'          # end standout-mode
export LESS_TERMCAP_us=$'\E[4;38;5;146m' # begin underline
export LESS_TERMCAP_ue=$'\E[0m'          # end underline

 参考man 5 termcap中可以看到,XXXX_TERMCAP_yy这种环境变量定义方法的意思是,当使用命令XXXX的时候(前提是XXXX使用了termcap),会根据yy的定义来设置一些capability。

上文代码中给less命令设置的capability(mb md等)都是跟文本渲染相关的,我定义成了一些ANSI Escape Sequence,用来控制字体和颜色等信息,相关信息可以看wikipedia的ANSI_escape_code条目。

因为man默认用的pager是less工具,而less使用了terminfo(或termcap),因而以上定义就实现了给man page上色。

 

但是这样一来我的less在所有的时候都会使用这些设定,而不仅仅在man page使用这些,所以转而使用terminfo的方法。

 

首先mkdir ~/.terminfo,然后在其中进行infocmp > xterm-manpage.txt来生成一个当前terminal(我当时用的是xterm)的数据库的源文件。

编辑这个文件,一开始的xterm|blablabla就必须得改成xterm-manpage|blablabla,这个是给这个数据库起一个唯一的名字;在man terminfo的大表中依次找到上文中的mb md等termcap code所对应的capname,把文件中的相应capname的值修改成上文的值,保存。

下面这个片段就是对应的七个设置(注意不可以只使用这七个来编译,一定要在现有的源文件基础上修改这七处再编译):

  blink=\E[1;31m,
  bold=\E[1;38;5;74m,
  sgr0=\E[0m,
  smso=\E[38;5;246m,
  rmso=\E[0m,
  smul=\E[4;38;5;146m,
  rmul=\E[0m,

 

使用tic xterm-manpage.txt编译(普通用户编译,会在~/.terminfo生成数据库;root编译则会在/usr/share/terminfo这样系统级的地方生成),大功告成。

 

之后在调用man的时候,前缀一个环境变量指明使用的数据库就好了,例如TERM=xterm-manpage man infocmp。

 

显然,在.bashrc中给man alias一下会很方便。

你可能感兴趣的:(info)