3

我正在使用语言服务器协议开发 Visual Studio 代码的扩展,并且包括对“转到工作区中的符号”的支持。我的问题是我不知道如何选择匹配项...实际上我使用的是我写的这个函数:

function IsInside(word1, word2)
{
    var ret = "";
    var i1 = 0;
    var lenMatch =0, maxLenMatch = 0, minLenMatch = word1.length;
    for(var i2=0;i2<word2.length;i2++)
    {
        if(word1[i1]==word2[i2])
        {
            lenMatch++;
            if(lenMatch>maxLenMatch) maxLenMatch = lenMatch;
            ret+=word1[i1];
            i1++;
            if(i1==word1.length)
            {
                if(lenMatch<minLenMatch) minLenMatch = lenMatch;
                // Trying to filter like VSCode does.
                return maxLenMatch>=word1.length/2 && minLenMatch>=2?  ret : undefined;
            }
        } else
        {
            ret+="Z";
            if(lenMatch>0 && lenMatch<minLenMatch)
                minLenMatch = lenMatch;
            lenMatch=0;
        }
    }
    return undefined;
}

如果 word1 在 word2 内,则返回 sortText,否则返回未定义。我的问题是这样的情况:

**强文本**

我的算法看到 'aller' 在 C all S er ver 中,但界面并没有像预期的那样标记它。

有一个图书馆或我必须为此使用的东西吗?VSCode 的代码又大又复杂,我不知道从哪里开始寻找这些信息......

4

1 回答 1

1

VSCode 的 API 文档provideWorkspaceSymbols()提供以下指导(我认为您的示例没有违反):

-query参数应该以轻松的方式解释,因为编辑器将对结果应用自己的突出显示和评分。一个好的经验法则是匹配不区分大小写并简单地检查查询字符在候选符号中的顺序是否出现。不要使用前缀、子字符串或类似的严格匹配。

这些文档是为了回应这个讨论而添加的,其中有人和你有非常相似的问题。

简要查看 VSCode 源代码,内部似乎filters.matchFuzzy2()用于突出显示(请参阅此处此处)。我认为它没有在 API 中公开,因此如果您希望行为完全匹配,您可能必须复制它。

于 2019-01-31T10:36:40.873 回答