Visual Studio代码扩展:如何在拖动鼠标时停止触发onDidChangeTextEditorSelection事件?

时间:2018-02-23 17:00:16

标签: javascript visual-studio-code vscode-extensions

我目前正在开发一个线路解析扩展程序,该扩展程序根据当前选定的行执行任务,并在用户更改其选择时进行重新分析。

当用户选择多行时更新是没有意义的,因此所有内容都会在看起来像以下内容的块内触发:

if(editor.selection.isSingleLine){
    // Line Handling Here
}

然而,当用户拖动鼠标以选择他们想要的文本时会发生什么事情是事件定期触发,因为技术上当用户拖动文本时,他们是"选择"他们打算在那里选择的切片,其中一些只包括他们开始拖动的线。

它还会解析两次doubleclick,但这可能很好,因为所选的单词无论如何都在同一行。

对于键盘和命令,它的行为符合预期,但我希望它只在单击(重新定位光标)或用户完成拖动以选择时触发。

这可能是一个非问题,因为最后一个选择将在最后执行,我可以一起破解使用它,但这似乎不优雅,并且可能导致极差的性能,因为线路检查将被重复执行。

编辑:如果它是多行选择,我实际上想要做其他事情,所以我也希望能够得到最终的选择。

1 个答案:

答案 0 :(得分:0)

该活动是全球性的,并在所有扩展程序之间共享。因此,单个扩展无法配置它。要处理'事件雪崩',应该使用去抖动。而不是在内部事件处理程序中进行工作,而是安排它尽快完成并取消可能的计划操作。像这样

let handle;
function doWorkNow() {
  // parse what is selected
}
onDidChangeTextEditorSelection(() => {
  clearTimeout(handle);
  handle = setTimeout(() => doWorkNow(), 10);
});