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

Any way to make terminal control sequences portable?

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

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

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

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

谢谢!

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

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

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

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

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

然而 -- 在现代世界中,几乎所有终端(或终端仿真器)都使用 ANSI escape codes, along with some extensions (see XTerm Control Sequences). I believe the escapes supported by xterm and their behavior have become something of a de facto standard at this point, with other terminal emulators simply copying xterm's behavior. Some text-based UI libraries like termbox 似乎完全取消了对非 ANSI 终端的支持,并且输出 ANSI 直接转义。

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