我目前正在计划一个类似自定义Vim的编辑器。它将用C语言编写,我希望它尽可能在尽可能多的系统之间移植。
我知道curses(ncurses,我猜),tput命令,以及终端如何使用控制序列(Esc- [和CSI字符)来改变背景,移动光标等等。
在上面的选项中,似乎ncurses是编辑器最推荐的打印方式。但是ncurses还有很多我宁愿不使用的东西,如果它合理可行,我宁愿制作自己的系统。我并不反对使用它,但是..无论如何。
所以,我的问题是:有没有办法在绝大多数终端中使用控制序列而不使用库?是通过tput还是其他方法?
谢谢!
答案 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一些时间。