我正在写一个文本编辑器。
具有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 忽略已完成的检查。
(如果你想知道一个程序是如何做某事的,从阅读它的源代码开始是最有效的途径)。