【问题标题】:How does Vim "take control" of the terminal and allow it to be used as a modifiable buffer?Vim 如何“控制”终端并允许将其用作可修改的缓冲区?
【发布时间】:2018-06-26 23:28:55
【问题描述】:

Vim 如何“控制”终端并允许将其用作可修改的缓冲区?

使用像 c++(在 linux 中)这样的语言来创建我自己的可以任意修改终端使用的字符缓冲区的程序有多难?

【问题讨论】:

  • 你可以试试ncurses:tldp.org/HOWTO/NCURSES-Programming-HOWTO
  • Vim 实际上使用ncurses 库来提供终端操作。可修改缓冲区本身只是内存中许多不同数据结构中包含的内容的终端表示,这些数据结构跟踪自上次保存以来的原始、新和修改的文本(以及自编辑会话开始以来的许多撤消步骤) .没有一个简单的可修改缓冲区(除了首先从磁盘加载或保存到磁盘的缓冲区)。我不知道 ncurses 或 Vim 源代码是否这样做,但一些目标搜索应该揭示这种方法。
  • Vim 是免费的开源软件;看代码。

标签: c++ linux vim terminal


【解决方案1】:

基本上输出缓冲区只是一堆字符。

像 VIM 一样使用终端的最基本方法是发出退格键。 终端中的退格键是非破坏性的,因此它们只是将光标向左移动。

因此,您可以发出退格键,直到找到正确的位置。

如果您的终端支持 ANSI 转义序列(特殊文本序列),您可以使用 \033[number;numberH 跳转,例如\033[3;3H 将跳转到第 3 行和第 3 高度,然后您可以打印一些东西。

C中即:

int row = 3;
int col = 3;

printf("\033[%d;%dH", row, col);
printf("Hello world");

当然不是所有终端都支持 ANSI 转义序列。

这就是你拥有ncurses 库和move(row,col) 函数的原因。

您也可以尝试执行本机函数。
我不知道 linux 头文件中的内容,但在 Windows 中,winapi.h 提供了使用缓冲区的有效方法:SetConsoleCursorPosition

【讨论】:

    猜你喜欢
    • 2019-01-09
    • 1970-01-01
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多