如何在我的 VS 代码扩展中获取自定义单词的范围?

Posted

技术标签:

【中文标题】如何在我的 VS 代码扩展中获取自定义单词的范围?【英文标题】:How to get range of custom word in my VS Code Extension? 【发布时间】:2021-12-19 14:35:20 【问题描述】:

我想在我的 VS Code 扩展中获取自定义单词的范围,如果我将鼠标悬停在它上面,并且文本行是否与模式匹配。这是我到目前为止所写的:

vscode.languages.registerHoverProvider('.mylanguage', 
    provideHover(document, position, token) 
        // define `hoverRange` somewhere here
        const hoverLineText = document.lineAt(position.line).text;
        const pattern = new RegExp("\\w+\\s0,\\(.0,\\s0,\\)");
        if(pattern.test(hoverLineText))
            hoverRange = document.getWordRangeAtPosition(position, pattern);
        
        console.log(hoverRange);
        //etc. ...

我希望,如果您在编辑器中编写 myFunction ( ) 之类的内容,并且将鼠标悬停在该字符串的任何位置(例如,甚至在空白处),控制台将输出 hoverRange,这将考虑到右括号)的位置也是如此。

但是,如果我将鼠标悬停在空白处,则不会向控制台输出任何内容。相反,我需要将鼠标悬停在myFunction 上,这样我才能得到字符串的整个范围。

如何让我的 VS Code 扩展将 myFunction ( ) 视为一个单词?

【问题讨论】:

0,*,而不是getWordRangeAtPosition 计算字符串myFunction ( ) 开始和结束的偏移量并将其转换为范围,为什么需要复制正则表达式,为什么你有没有在provideHover 函数之外定义hoverRange @rioV8 糟糕,我只是将hoverRange 更改为在provideHover 中定义。我可以计算字符串的偏移量,并转换为该范围,但这会导致与上面相同的结果。我仍然需要将鼠标悬停在 myFunction 上才能获得新的范围。 是在你想要的所有场合调用的悬停提供程序 @rioV8 是的,在我想要的所有场合都会调用提供程序。唯一的问题是我不知道如何让 VS Code 识别自定义单词。 如果正则表达式匹配行中的某处,找到匹配的开始和结束并为此创建一个范围 【参考方案1】:

这对我有用:

let disposable3 = vscode.languages.registerHoverProvider('plaintext', 
    provideHover(document, position) 

        let hoverRange;
        const hoverLineText = document.lineAt(position.line).text;
        const pattern = new RegExp("\\w+\\s*\\(.*\\s*\\)");

        if (pattern.test(hoverLineText))
            hoverRange = document.getWordRangeAtPosition(position, pattern);
            if (hoverRange) return new vscode.Hover(document.getText(hoverRange), new vscode.Range(position, position));
            else return null;
        
        else return null;
    
);
context.subscriptions.push(disposable3);

如您所见,悬停在空格上有效。但是正则表达式太宽松了,所以它确实会接受诸如

之类的东西

if (asdasdasd)while(adasd)

因为这些看起来也像函数调用。

【讨论】:

嗨,马克,谢谢您的回答。奇怪的是,即使按照您的示例,我的代码仍然可以继续工作。如果我将鼠标悬停在myFunction 上,我只会得到悬停文本——如果我悬停在空白处则不会。我将等待另一个答案,如果没有其他答案可以直接解决我的问题,我会将您的答案标记为正确,因为它仍然很有帮助。 是的,我不明白——你可以看到它对我有用。为了进行测试,我确实将其更改为 plaintext .txt 文件。我的代码在 .txt 文件中是否适合您? 是的,您的代码在 .txt 文件中完美运行。我正在登录控制台以调试我的代码,如果我将鼠标悬停在空格或与带有空格字符的字母分开的其他字符(非字母)上,position 似乎不会被记录。例如,如果我将鼠标悬停在myFunction( 的括号上,position 将被记录,但如果我将鼠标悬停在myFunction ( 的括号上则不会。您知道为什么会发生这种情况吗? 我看到你的代码中有'.mylanguage'。该参数是一个语言ID。如果你去 vscode 右下角的语言并单击它,它将是你的语言括号中的内容。它不是文件扩展名。

以上是关于如何在我的 VS 代码扩展中获取自定义单词的范围?的主要内容,如果未能解决你的问题,请参考以下文章

如何从自定义弹出菜单扩展中的选择事件中获取所选对象值?

如何在我的 HTML 自定义元素中接收焦点和选择事件

如何使用自定义元素点击事件更新范围值?

如何在我的代码中使用自定义 CSV 而不是 Yahoo Finance 数据?

如何在我的 Uppy 自定义设置中获取 Blob 图像预览

为啥具有“用户”范围级别的自定义维度未显示在我的报告中?