像 Vim 这样的命令行应用程序如何工作?具体来说,他们如何以他们的方式控制终端?另外,为了将来参考,对于像 Vim 那样控制终端的应用程序是否有一个特定的术语?
答案1
vim 和其他半图形(能够显示半图形字符,例如角、全十字……)应用程序通过发送专用转义序列来控制终端(管理光标位置、可显示字符的位置、颜色设置……) ,控制代码,终端将其转换为将执行的某些专用操作。
因为对于任何程序员来说,将转义序列回显到标准输出都是一场噩梦,更不用说意味着不可移植的代码,因为总是有许多不同的终端具有不同的功能和不同的转义序列,
创建了一个抽象所有工作的库:咒骂。现命名为恩诅咒它还提供了更高级别的功能,例如窗口管理。
ncurses 依赖于术语信息用于获取适当的终端能力描述的数据库。
正是由于这个函数库vim、iptraf-ng、alsa amixer、less、gdb、主要内核配置实用程序和许多其他控制终端的实用程序。
请注意,这些应用程序通常不称为“命令行“ 实用程序通常使用基本的光标管理和编辑功能来处理单行输入,这要归功于阅读线图书馆。
相反,正如您可以在ncurses
上面链接的手册页中阅读的那样,可以调用这些程序:互动、屏幕导向。 vim
通常被命名为面向屏幕的ed
编辑对比面向行的编辑。
请注意评论中的以下建议:
启动时,应用程序将从启动它的 shell 继承 tty 驱动程序设置,这些设置可能与原始 Agetty 最初设置的设置非常相似。
这包括缓冲输入直到捕获换行符、在即时光标位置回显输入键……所有面向屏幕的应用程序都不太可能需要的功能
初始化时,程序将保存当前的 tty 驱动程序设置并根据程序员的意愿强制执行这些设置。
在退出之前……强烈建议程序员恢复初始设置……除非面临在相当不可预测但肯定混乱的情况下返回调用 shell 的风险……
答案2
一次一个字符进入缓冲区。
当输入回车符时,一次检查(“解析”)缓冲区一个字符,查找以给定语法排列的标记。
然后,如果可能的话,相应地执行一些命令。如果无法解析输入,则会给出一条错误消息,显示命令解释器无法弄清楚如何处理。
冲洗并重复,直到命令行解释器停止和/或计算机关闭。
基本上,它就像任何其他计算机程序一样。输入、IF 和 ELSE 语句、数据操作(进行计算并在内存中移动数据)和输出。