交互式 CLI 如何工作?

Koz*_*Koz 16 vim ncurses tty console

像 Vim 这样的命令行应用程序如何工作?具体来说,他们如何以他们的方式控制终端?另外,为了将来参考,对于像 Vim 那样控制终端的应用程序是否有一个特定的术语?

MC6*_*020 21

vim 和其他半图形(能够显示半图形字符,例如角、全十字\xe2\x80\xa6)应用程序控制终端(管理光标位置、可显示字符的位置、颜色设置\xe2 \x80\xa6) 通过发送专用转义序列和控制代码,终端将其转换为将执行的某些专用操作。

\n

因为对于任何程序员来说,将转义序列回显到标准输出都是一场噩梦,更不用说意味着不可移植的代码,因为总是有许多不同的终端具有不同的功能和不同的转义序列,

\n

创建了一个抽象所有这些工作的库:curses。现在命名为ncurses,它还提供更高级别的功能,例如窗口管理。

\n

ncurses 依赖terminfo数据库来获取适当的终端功能描述。

\n

正是由于这个函数库,vim、iptraf-ng、alsa amixer、less、gdb、主要内核配置实用程序和许多其他工具才能控制终端。

\n
\n

请注意,这些应用程序通常不称为“命令行”实用程序,它们通常通过基本的光标管理和编辑工具处理单行输入,这要归功于readline库。
\n相比之下,正如您在ncurses上面链接的手册页中所读到的那样,这些程序可以称为:交互式、面向屏幕。 与面向行的编辑器相比,vim通常称为面向屏幕编辑器。ed

\n
\n

请注意评论中的以下建议:

\n

启动时,应用程序将从启动它的 shell 继承 tty 驱动程序设置,这些设置可能与原始 Agetty 最初设置的设置非常相似。
\n这包括缓冲输入直到捕获换行符、在即时光标位置回显输入键\xe2\x80\xa6 以及面向屏幕的应用程序不太可能需要的所有功能

\n

初始化时,程序将保存当前的 tty 驱动程序设置并根据程序员的意愿强制执行这些设置。
\n在退出\xe2\x80\xa6之前,强烈建议程序员恢复初始设置\xe2\x80\xa6,除非面临在相当不可预测但肯定混乱的情况下返回调用shell的风险\xe2\x80\xa6

\n

  • 或者在 shell 级别,`stty raw`、`stty Cooked` 以及类似的操作 (2认同)