【问题标题】:In VSCode, how do I select a word programmatically?在 VSCode 中,如何以编程方式选择单词?
【发布时间】:2019-06-18 15:05:00
【问题描述】:

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

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

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

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

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

也许最好的选择是使用此扩展选择命令一次,然后在代码中检查当前选择旁边是否有下划线?

【问题讨论】:

  • 经过进一步检查,我发现了另一种在光标处获取单词的方法,在这种情况下无需修改选择,这也很有用:let word = editor.document.getWordRangeAtPosition(editor.selection.active);

标签: visual-studio-code vscode-extensions


【解决方案1】:

在看到你已经回答了你的问题之前我写了这个,但因为它可能对初学者有帮助,所以我还是会发布它。

您可以使用 executeCommand() 来执行此操作,但这可能只是一种 hack 和迂回的方式来完成您想要的。 (这是我第一次编写扩展时所做的,因为我不明白或不知道在哪里查看 API)。如果您的最终目标是为用户选择单词,那么 hack 可能会很好(但可能会产生副作用,例如弄乱用户的查找项目),但如果它只是一种在代码中使用单词的方法,那么这是错误的做法。既然您已经知道用户可以使用 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);
}

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

【讨论】:

【解决方案2】:
vscode.commands.executeCommand('editor.action.addSelectionToNextFindMatch');

【讨论】:

  • 我从来没有注意到 .addSelectionToNextFindMatch 可以在没有初始选择的情况下使用,并且以这种方式使用它的结果正是我想要的,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-15
  • 1970-01-01
  • 1970-01-01
  • 2013-04-19
  • 1970-01-01
  • 2010-09-24
  • 1970-01-01
相关资源
最近更新 更多