在 VSCode 中,如何以编程方式选择单词?

Yog*_*sia 1 visual-studio-code vscode-extensions

我正在开发 VSCode 的扩展,我希望将光标/插入符号扩展为仅限于一个单词的选择。

将选择范围扩大到整个单词(例如foo_bar)(包括下划线)但没有其他符号的最佳方法是什么?

在文本编辑器中双击单词的工作方式与我试图通过代码实现的效果完全相同(它选择下划线之外的内容),但据我所知,没有命令可以产生相同的行为。

我知道的最接近的是“扩展选择”命令(AKA editor.action.smartSelect.expand)。

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

也许最好的选择是使用一次“扩展选择”命令,并以某种方式检查代码中当前选择旁边是否有下划线?

aam*_*rks 6

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

您可以使用executeCommand() 来完成此操作,但这可能只是实现您想要的目的的一种技巧和迂回方式。(这是我第一次编写扩展时所做的,因为我不理解或不知道在API中查找)。如果您的最终目标是为用户选择单词,那么黑客可能没问题(但可能会产生副作用,例如弄乱用户的查找项目),但如果这只是获取单词在代码中使用的一种方法,那么这是错误的做法。由于您已经知道用户可以使用 smartSelect,我假设您想要后者。

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

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);
}

Run Code Online (Sandbox Code Playgroud)

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