Как выбрать символы на WorkspaceSymbol

Я разрабатываю расширение для кода 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;
}

Это возвращает sortText, если слово1 находится внутри слова2, в противном случае не определено. Моя проблема в таких случаях:

Мой алгоритм видит, что "Aller" находится внутри всех версий, но интерфейс не помечает его так, как ожидалось.

Есть библиотека или что-то, что я должен использовать для этого? код VSCode большой и сложный, и я не знаю, где начать искать эту информацию...

1 ответ

Решение

Документы API VSCode для provideWorkspaceSymbols() предоставьте следующее руководство (которое я не думаю, что ваш пример нарушает):

query-параметр следует интерпретировать непринужденно, так как редактор будет применять собственную подсветку и оценку результатов. Хорошее практическое правило - сопоставлять без учета регистра и просто проверять, отображаются ли символы запроса в их порядке в символе-кандидате. Не используйте префикс, подстроку или подобное строгое соответствие.

Эти документы были добавлены в ответ на это обсуждение, где у кого-то была такая же проблема, как и у вас.

Если коротко взглянуть на источники VSCode, то, по-видимому, внутренне filters.matchFuzzy2() для выделения (см. здесь и здесь). Я не думаю, что это раскрывается в API, поэтому вам, вероятно, придется скопировать его, если вы хотите, чтобы поведение точно совпадало.

Другие вопросы по тегам