终端文本编辑器的UI是如何实现的

How is the UI of terminal texteditors implemented?

本文关键字:何实现 实现 文本 文本编辑 编辑器 UI 终端      更新时间:2023-10-16

emacsvimjoe甚至nano这样的终端文本编辑器能够在命令行内显示任意UI元素,而无需每次完全重写整个UI,而是覆盖当前的UI。

对于常规输出流,您只能使用返回字符'r'跳到当前输出行的开头并对其进行重写,但根据我的发现,您不能跳上多行,cout << "rrrrrr";cout << 'r'具有相同的效果,因此后面跟着换行的所有内容显然都是铁板一块。

其他应用程序也有类似的功能,例如Ubuntu上的$dpkg-reconfigure ca-certificatesaptitude图形包管理器。他们还为UI元素绘制轮廓,这些元素可能只是特殊字符。但是,他们仍然必须覆盖控制台输出的多行内容。

他们是怎么做到的?行为是否可移植到Windows平台

您会发现这些程序依赖于一个名为ncurses:的库

http://en.wikipedia.org/wiki/Ncurses

几乎所有操作系统都有可用的内部版本。

curses是一个unix库,允许您在任意位置操作终端的内容。ncurses是一个免费的、独立于供应商的curses版本,也是linux上使用的curses库。

dpkg-reconfigure使用基于curses之上构建的对话框,并提供用户界面窗口小部件,而不是原始终端访问。

ncurses包括扩展"menu"、"forms"answers"panel",您可以使用这些扩展来自己实现用户界面小部件,尽管如果您采用这种方法,它会很快变得非常复杂。

关于windows,有pdcurses在"dos box"终端中本地运行。如果您仅限于公共子集,那么您可以编写在windows上使用pdcurses和在linux上使用ncurses的可移植程序。或者,您可以使用cygwin在windows上使用ncurses。

windows的另一个替代方案可能是Borlands TVision——如果你能找到Borland的turbo pascal或c++编译器的旧版本,它们包括一个完整的文本用户界面应用程序框架,称为TVision。不过,不确定这些生成的代码是否仍能在现代windows版本上运行。

控制台遵循一个规范:https://www.xfree86.org/current/ctlseqs.html

这类似于客户端/服务器。如果您的应用程序(客户端)遵循相同的规范,它可以通过标准输入/输出与控制台通信,以绘制它想要的任何内容。

规范中有很多内容:

  • 清除特定行
  • 移动光标
  • 设置背景/前景色
  • 设置样式:粗体、暗淡、带下划线、闪烁、
  • 请求发送鼠标事件,接收鼠标事件
  • 将控制台配置为换行/换行
  • 配置控制台以使用";交替的";屏幕
  • 等等