任何使终端控制序列可移植的方法?

时间:2015-02-18 20:46:44

标签: terminal controls ncurses sequences tput

我目前正在计划一个类似自定义Vim的编辑器。它将用C语言编写,我希望它尽可能在尽可能多的系统之间移植。

我知道curses(ncurses,我猜),tput命令,以及终端如何使用控制序列(Esc- [和CSI字符)来改变背景,移动光标等等。

在上面的选项中,似乎ncurses是编辑器最推荐的打印方式。但是ncurses还有很多我宁愿不使用的东西,如果它合理可行,我宁愿制作自己的系统。我并不反对使用它,但是..无论如何。

所以,我的问题是:有没有办法在绝大多数终端中使用控制序列而不使用库?是通过tput还是其他方法?

谢谢!

1 个答案:

答案 0 :(得分:1)

tput(1)使用terminfo(5)(或更早的termcap(5))数据库,该数据库提供从抽象命令(例如将光标移动到x,y )的映射以进行转义不同终端的序列。运行

等命令时
$ tput cup 10 3 # move cursor to row/column 10/3

,查询terminfo数据库以找到终端的正确字符串,然后将其写入stdout。要查找可用命令(例如cup),请查看terminfo(5)中的 cap-name 列。 tput通过查看TERM环境变量确定您正在使用的终端。

(这意味着您可以通过简单地执行$ tput [command] > [file]并在某个可以显示控制字符的编辑器中打开[file]来检查生成的转义字符,这对于探索来说非常方便。{{ 1}}命令也可用于此。)

如果您使用infocmp(1)(或基础tput),您的程序将自动移植到不同的终端。这就是Vim顺便使用的方式。

然而 - 在现代世界中,几乎所有终端(或终端模拟器)都使用ANSI escape codes,以及一些扩展(请参阅XTerm Control Sequences)。我相信xterm支持的转义及其行为已成为事实上的标准,其他终端模拟器只是简单地复制xterm的行为。一些基于文本的UI库(如termbox)似乎完全取消了对非ANSI终端的支持,并直接输出ANSI转义。

除了已经提到的termbox之外,还有S-Lang,其中包括终端处理组件。我相信那些是最受欢迎的两个" ncurses替代品"。我首先给ncurses一些时间。