有什么方法可以使终端控制序列可移植吗?

问题描述 投票:0回答:1

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

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

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

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

谢谢!

terminal ncurses ansi-escape terminfo tput
1个回答
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]
来检查正在生成哪些转义字符,这可以方便地进行探索。也可以使用
infocmp(1)
命令为此。)

如果您使用

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

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

除了已经提到的 termbox 之外,还有 S-Lang,其中包括终端处理组件。我相信这是两个最流行的“ncurses 替代品”。不过,我会先给 ncurses 一些时间。

© www.soinside.com 2019 - 2024. All rights reserved.