Visual Studio 代码扩展:如何在拖动鼠标时停止触发 onDidChangeTextEditorSelection 事件?
Visual Studio Code Extensions : How to stop firing onDidChangeTextEditorSelection events while dragging mouse?
我目前正在开发一个行解析扩展,它根据当前 selected 行执行任务,并在用户更改其 selection 时重新解析。
当用户 select 超过一行时更新没有意义,所以所有内容都在一个块内触发,如下所示:
if(editor.selection.isSingleLine){
// Line Handling Here
}
但是,当用户将鼠标拖动到 select 他们想要的文本时,事件会定期触发,因为从技术上讲,当用户在文本上拖动时,它们是 "selecting" 切片他们打算select在去那里的路上打算做什么,其中一些只包括他们开始拖延的路线。
它还会为双击解析两次,但这可能没问题,因为 selected 单词无论如何都在同一行上。
对于键盘和命令,它按预期运行,但我希望它仅在单击(重新定位光标)或用户完成拖动到 select.[=12 时触发=]
这可能不是问题,因为最后一个 selection 将最后执行,我可以一起破解一些东西来使用它,但这看起来不优雅并且可能导致性能极差,因为行检查将是反复执行。
编辑:如果它是多线 selection,我实际上想做些别的事情,所以我也希望能够获得最终的 selection。
该事件是全球性的,并在所有分机之间共享。因此,单个扩展无法配置它。要处理 'event avalanche' 应该使用去抖动。不要在事件处理程序 内部 执行工作,而是安排它尽快完成并取消可能已安排的操作。像这样
let handle;
function doWorkNow() {
// parse what is selected
}
onDidChangeTextEditorSelection(() => {
clearTimeout(handle);
handle = setTimeout(() => doWorkNow(), 10);
});
我目前正在开发一个行解析扩展,它根据当前 selected 行执行任务,并在用户更改其 selection 时重新解析。
当用户 select 超过一行时更新没有意义,所以所有内容都在一个块内触发,如下所示:
if(editor.selection.isSingleLine){
// Line Handling Here
}
但是,当用户将鼠标拖动到 select 他们想要的文本时,事件会定期触发,因为从技术上讲,当用户在文本上拖动时,它们是 "selecting" 切片他们打算select在去那里的路上打算做什么,其中一些只包括他们开始拖延的路线。
它还会为双击解析两次,但这可能没问题,因为 selected 单词无论如何都在同一行上。
对于键盘和命令,它按预期运行,但我希望它仅在单击(重新定位光标)或用户完成拖动到 select.[=12 时触发=]
这可能不是问题,因为最后一个 selection 将最后执行,我可以一起破解一些东西来使用它,但这看起来不优雅并且可能导致性能极差,因为行检查将是反复执行。
编辑:如果它是多线 selection,我实际上想做些别的事情,所以我也希望能够获得最终的 selection。
该事件是全球性的,并在所有分机之间共享。因此,单个扩展无法配置它。要处理 'event avalanche' 应该使用去抖动。不要在事件处理程序 内部 执行工作,而是安排它尽快完成并取消可能已安排的操作。像这样
let handle; function doWorkNow() { // parse what is selected } onDidChangeTextEditorSelection(() => { clearTimeout(handle); handle = setTimeout(() => doWorkNow(), 10); });