Как выбрать символы на WorkspaceSymbol - PullRequest
0 голосов
/ 31 января 2019

Я разрабатываю расширение для кода 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, в противном случае не определено.Моя проблема в таких случаях:

**strong text**

Мой алгоритм видит, что «аллергия» находится внутри C all S er ver, но интерфейс не помечает его как ожидалось.

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

1 Ответ

0 голосов
/ 31 января 2019

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

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

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

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

...