终端文本编辑器的UI是如何实现的
How is the UI of terminal texteditors implemented?
像emacs
、vim
、joe
甚至nano
这样的终端文本编辑器能够在命令行内显示任意UI元素,而无需每次完全重写整个UI,而是覆盖当前的UI。
对于常规输出流,您只能使用返回字符'r'
跳到当前输出行的开头并对其进行重写,但根据我的发现,您不能跳上多行,cout << "rrrrrr";
与cout << 'r'
具有相同的效果,因此后面跟着换行的所有内容显然都是铁板一块。
其他应用程序也有类似的功能,例如Ubuntu上的$dpkg-reconfigure ca-certificates
或aptitude
图形包管理器。他们还为UI元素绘制轮廓,这些元素可能只是特殊字符。但是,他们仍然必须覆盖控制台输出的多行内容。
他们是怎么做到的?行为是否可移植到Windows平台
您会发现这些程序依赖于一个名为ncurses:的库
http://en.wikipedia.org/wiki/Ncurses
几乎所有操作系统都有可用的内部版本。
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
这类似于客户端/服务器。如果您的应用程序(客户端)遵循相同的规范,它可以通过标准输入/输出与控制台通信,以绘制它想要的任何内容。
规范中有很多内容:
- 清除特定行
- 移动光标
- 设置背景/前景色
- 设置样式:粗体、暗淡、带下划线、闪烁、
- 请求发送鼠标事件,接收鼠标事件
- 将控制台配置为换行/换行
- 配置控制台以使用";交替的";屏幕
- 等等
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 如何正确实现和访问运算符的各种自定义枚举器
- C++Union/Struct位域的实现和可移植性
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 在c++中实现LinkedList时,应出现未处理的错误
- 为左值和右值的包装器实现C++范围
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 使用GSoap实现ONVIF
- 在用于格式4的arm模拟器中实现功能时的一个问题
- C++ 多重继承:使用基类 A 的实现实现基类 B 的抽象方法
- 如何自己为我自己的shared_ptr实现实现别名构造函数
- 这个UTF-8实现实现是定义的还是定义良好的
- 我的 PRNG 实现与我尝试复制的实现有何不同?