Как выбрать символы на 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, поэтому вам, вероятно, придется скопировать его, если вы хотите, чтобы поведение точно совпадало.