vim 如何捕获鼠标滚动事件?

vim 如何捕获鼠标滚动事件?

我正在写一个文本编辑器。

具有1049(交替屏幕)模式+1000启用(鼠标跟踪)模式后,终端能够捕获鼠标滚动事件和单击事件。我不需要点击事件。

这还有一个缺点,即不允许使用鼠标进行其他有用的动作(例如:通过在终端屏幕上突出显示文本来进行外部复制粘贴)。

我说vim,因为它具有理想的鼠标行为,在滚动事件中,光标位置会发生变化以反映它,而单击事件似乎不会影响它。此外,它这样做的方式不会导致闪烁。

告诉我它不使用 1049 + 1007 的事情是,像外部复制粘贴(通过突出显示文本)之类的东西在vim.

我的问题:vim这是怎么做的?

我搜遍了源代码,但找不到它。我还尝试跟踪它写入屏幕的转义序列。这在我尝试过的两个终端模拟器上都是如此。

答案1

它被硬编码在 libvterm 的副本中,vim 已经使用了几年,例如,状态.c:

  case 1000:
  case 1002:
  case 1003:
    settermprop_int(state, VTERM_PROP_MOUSE,
        !val          ? VTERM_PROP_MOUSE_NONE  :
        (num == 1000) ? VTERM_PROP_MOUSE_CLICK :
        (num == 1002) ? VTERM_PROP_MOUSE_DRAG  :
                        VTERM_PROP_MOUSE_MOVE);
    break;

假设任何冒充 xterm 的东西都实现了任何事件任意按钮控制。很多vim的术语.c尝试确定可以使用哪个 xterm-wannabe,因为他们都没有完全正确,但 libvterm 忽略已完成的检查。

(如果你想知道一个程序是如何做某事的,从阅读它的源代码开始是最有效的途径)。

相关内容