1

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

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

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

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

谢谢!

4

1 回答 1

1

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

$ tput cup 10 3 # move cursor to row/column 10/3

,查询 terminfo 数据库以找到适合您终端的正确字符串,然后将其简单地写入标准输出。要查找可用命令(例如cup),请查看 中的cap-nameterminfo(5)。通过查看环境变量tput来确定您正在使用的终端。TERM

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

如果您使用tput(或底层tputs(3)),您的程序将自动移植到不同的终端。顺便说一句,这就是 Vim 使用的。

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

除了已经提到的术语框,还有S-Lang,它包括一个终端处理组件。我相信这是两个最受欢迎的“ncurses 替代品”。不过,我会先给 ncurses 一些时间。

于 2015-03-08T01:04:10.313 回答