在 VSCode 中,如何以编程方式 select 一个词?

In VSCode, how do I select a word programmatically?

我正在为 VSCode 开发一个扩展,我想将 cursor/caret 扩展为一个 selection 限制为一个词。

将 selection 扩展到包括下划线但不包含其他符号的整个单词(例如 foo_bar)的最佳方法是什么?

在文本编辑器中双击单词的工作方式与我试图通过代码实现的完全相同(select超出了下划线),但据我所知,没有产生相同行为的命令。

我所知道的最接近的是 "Expand Selection" 命令(又名 editor.action.smartSelect.expand)。

Expand Selection,但是如果执行一次会停在下划线处,如果再次执行则会select整个单词。很好,但是...它可以执行任意次数,然后它会开始 select 空格、其他符号、行等

也许最好的选择是使用一次“展开选择”命令,并以某种方式检查代码中当前 selection?

旁边是否有下划线
vscode.commands.executeCommand('editor.action.addSelectionToNextFindMatch');

在看到您已经回答了您的问题之前,我写了这篇文章,但由于它可能对初学者有帮助,所以我仍然 post 它。

您可以使用 executeCommand() 执行此操作,但这可能只是完成您想要的任务的一种 hack 和迂回方式。 (这是我第一次编写扩展时所做的,因为我不理解或不知道在 API 中查找的位置)。如果您的最终目标是 select 用户的词,那么 hack 可能没问题(但可能有副作用,比如弄乱用户的查找项目),但如果这只是获取词的一种方式以供使用在您的代码中,这是错误的方法。由于您已经知道用户可以使用 smartSelect,我假设您想要后者。

您应该使用 getWordRangeAtPosition() 使用当前 selection 开始或结束,以及覆盖默认断字的正则表达式:

const range = document.getWordRangeAtPosition(
    vscode.window.activeTextEditor.selection.active,
    /\S+/
);

if (range) {
    // then you can get the word that's there:
    const word = document.getText(range); // get the word at the range

    // or modify the selection if that's really your goal:
    vscode.window.activeTextEditor.selection = new vscode.Selection(range.start, range.end);
}

这是一个过于简单的正则表达式,它将任何 运行 的非 space 字符视为一个词,适用于您的示例,但可能需要改进以消除标点符号。