如果是在终端上运行的程序,如何实现 Vim 的 GUI?

Pla*_*mer 5 linux terminal

我无法弄清楚在终端内执行并具有 GUI 的 Vim(或例如 top)等程序是如何实现的。假设终端只能显示字符,而 Vim 不仅可以显示多个窗口,还可以处理光标向各个方向移动。

另一个例子是 linux top实用程序,它实时显示更新的信息,这个程序怎么可能更新信息而不是向下滚动并显示新的打印字符?

Tho*_*key 5

vim并且gvim可能是单独的可执行文件,与不同的库链接。可以让一个可执行文件执行任一接口(例如,elvis 和 emacs 执行此操作)。1996 年的 vim 4.0 添加了一个-g选项,告诉它使用 GUI 版本(在这种情况下,它将是同一可执行文件的一部分)。

我没有找到 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>.
Run Code Online (Sandbox Code Playgroud)

我的回忆是,相当长一段时间,有两个可执行文件时(改变将需要相当多的研究,实际使用的包)。但这种能力是从 1996 年开始的。

给定任一类型的界面,都有更新显示的方法。对于 gvim,它使用 X 库,而诸如top(或vim) 之类的终端应用程序使用转义序列。根据系统,这两个都是termcap应用程序,使用 ncurses 的 termcap 接口获取它们的转义序列库等(某些版本top实际上使用ncurses 进行显示,例如,htop)。vim 使用内置表(通常是多余的)来扩充该曲目。

有趣的procpstop,Debian 中的版本是(相对稀有的)terminfo应用程序,通过检查其源代码可以看出。

  • *ncurses* 就是答案!直到现在我还不知道有特定的库可以在终端内创建 GUI。我现在正在从这里创建一个非常简单的窗口示例:[链接](http://tldp.org/HOWTO/NCURSES-Programming-HOWTO/windows.html#LETBEWINDOW) 谢谢!我没有足够的声誉来投票。 (2认同)

Gil*_*il' 5

在终端中运行的应用程序可以有一个文本用户界面,因为大多数终端不仅仅是只能打印字符和移动到下一行的哑终端,而是支持控制字符转义序列的“智能”终端,含义是“擦除”。当前行并向上滚动后续行”、“移动到位置 (53,7)”、“从现在开始以鲜红色打印”等。

大多数终端仿真器实现了 xterm 的大部分转义序列,其本身主要与VT100硬件终端及其后续产品兼容。应用程序知道发送什么转义序列以通过termcapterminfo数据库执行各种操作。请参阅键盘输入和文本输出如何工作?(“文本模式应用程序,在终端中运行”部分)和$TERM 如何以及在哪里解释?更多细节。

除了具有文本用户界面外,Vim 还有一个称为 GVim 的图形用户界面。该界面在实现X11 协议的图形终端上运行,而不是在文本终端上运行(当然,您可以从文本终端内启动应用程序,只是不会在该终端中显示)。