我不明白如何实现诸如 Vim(或 top 等)之类的程序,这些程序在终端内执行并具有 GUI。假设终端只能显示字符,而Vim不仅可以显示多个窗口,还可以处理光标在各个方向上的移动。
另一个例子是linux顶部显示信息的实用程序即时的已更新,该程序如何可能更新信息而不是制作向下滚动并显示新的印刷字符?
答案1
在终端中运行的应用程序可以有一个文本用户界面,因为大多数终端不仅仅是哑终端只能打印字符并移至下一行,但“智能”终端支持控制字符和转义序列其含义包括“擦除当前行并向上滚动后续行”、“移动到位置(53,7)”、“从现在开始以亮红色打印”等。
大多数终端仿真器实现了大部分xterm 的转义序列,本身大部分兼容VT100硬件终端及其后继者。应用程序知道要发送什么转义序列来通过术语帽或者术语信息数据库。看键盘输入和文本输出如何工作?(“文本模式应用程序,在终端中运行”部分)和$TERM 如何以及在哪里解释?更多细节。
除了具有文本用户界面之外,Vim 还具有称为 GVim 的图形用户界面。该界面运行在图形终端上,该终端实现了X11协议,不在文本终端上(但当然你可以发射从文本终端内运行应用程序,它只是不会在该终端中显示)。
答案2
vim
并且gvim
可能是单独的可执行文件,与不同的库链接。可以让一个可执行文件执行任一接口(例如 elvis 和 emacs 即可执行此操作)。 1996 年的 vim 4.0 添加了一个-g
选项,告诉它使用 GUI 版本(在这种情况下,它是同一可执行文件的一部分)。
- elvis - ex/vi 文本编辑器的克隆,使用
-G
桂选项 - emacs通常使用 X 显示,但将使用该选项在终端中启动
-nw
。 - Ubuntu 中可用的不同 vim 软件包之间有什么区别?
我没有找到 4.0 的公告副本(这可能提供了一些关于该选项动机的线索-g
(vim 的公告邮件列表始于1997年),但请参阅 Laurent Duperval 在旧常见问题解答中提到的内容:
7.3 How can I make Vim faster on a Unix station?
The GUI support in Vim 4.0 can slow down the startup time noticeably.
Until Vim supports dynamic loading, you can speed up the startup time
by compiling two different versions of Vim: one with the GUI and one
without the GUI and install both. Make sure you remove the link from
$bindir/gvim to $bindir/vim when installing the GUI version, though.
If screen updating is your problem, you can run Vim in screen. screen
is an ascii terminal multiplexer. The latest version can be found at
<URL:ftp://ftp.uni-erlangen.de:/pub/utilities/screen>.
我的记忆是,在很长一段时间里,有两个可执行文件(当那更改需要对实际使用的包进行大量研究)。但这种能力从 1996 年就已经存在了。
对于任一类型的界面,都有多种方法可以更新显示。对于 gvim,它使用 X 库,而终端应用程序例如top
(或vim
) 使用转义序列。根据系统的不同,这两者都是术语帽应用,使用 ncurses 的 termcap 接口等获取它们的转义序列(某些版本top
实际上使用ncurses 用于显示,例如htop
)。 vim 使用内置表(通常是多余的)来增强该功能。
有趣的是, Debian 中procps
的版本top
是(相对罕见)术语信息通过检查其应用程序可以看出源代码。
答案3
继最初的 TTY 之后,终端已经可用,用 VDU 取代了打印机。
VDU 的特性与纸质文件略有不同。显示屏上的字符可以被擦除和替换,而不仅仅是过度打印。
ASCII 为基本行式打印机提供了足够的控制字符,但没有预见到 VDU。其他特定于终端的控件使用“转义符”以 ASCII 进行编码。转义序列以 ASCII 转义字符开始。序列中的以下字符被解释为特定于终端的控件。
可视化编辑器vi
是使用这项新技术的应用程序的一个很好的例子。
转义码集正在标准化。如果您有足够多的最新文档,“ANSI escape”可能是在指数。