答案:通过设置CompletionItem的sortText属性可自定义VSCode自动补全排序,其值按字典序决定优先级,数字前缀如"0\_abc"可使项靠前;filterText用于匹配输入但不直接参与排序;默认排序依据匹配度、CompletionItemKind和label字典序;结合上下文(如导入模块、光标位置)动态调整sortText能优化体验。

VSCode扩展要贡献自定义的自动补全项排序规则,核心其实在于巧妙地利用
CompletionItem
sortText
filterText
要实现自定义的自动补全项排序,关键在于为每个
CompletionItem
sortText
sortText
例如,你可以使用数字前缀来控制优先级:
"0_exactMatch"
"1_commonItem"
"1_commonItem"
"2_lessUsed"
filterText
sortText
filterText
sortText
在没有明确指定
sortText
首先,它会优先考虑与用户当前输入字符串匹配度最高的项。这包括了前缀匹配、子串匹配,以及一些模糊匹配算法。如果一个补全项的
label
filterText
其次,
CompletionItemKind
Function
Variable
Class
Text
File
再者,如果多个项的匹配度和类型都相似,VSCode可能会回退到按
label
sortText
我个人觉得,理解这个默认逻辑非常重要,因为这能帮助我们判断什么时候需要介入自定义排序,以及如何最小化地进行干预,以达到最佳效果。有时候,默认行为已经足够好,我们就不必画蛇添足了。
sortText
要精确控制自动补全的显示顺序,
sortText
sortText
一个非常实用的策略是使用数字前缀结合语义标识。比如:
import * as vscode from 'vscode';
export class MyCompletionProvider implements vscode.CompletionItemProvider {
public provideCompletionItems(
document: vscode.TextDocument,
position: vscode.Position,
token: vscode.CancellationToken,
context: vscode.CompletionContext
): vscode.ProviderResult<vscode.CompletionItem[] | vscode.CompletionList> {
const items: vscode.CompletionItem[] = [];
// 最常用的函数,优先级最高
const createItem = new vscode.CompletionItem('createObject', vscode.CompletionItemKind.Function);
createItem.detail = '创建一个新的对象实例';
createItem.sortText = '0_createObject'; // 数字越小,排序越靠前
items.push(createItem);
// 常用变量,优先级次之
const configItem = new vscode.CompletionItem('config', vscode.CompletionItemKind.Variable);
configItem.detail = '全局配置对象';
configItem.sortText = '1_config';
items.push(configItem);
// 不太常用的辅助函数
const helperItem = new vscode.CompletionItem('formatData', vscode.CompletionItemKind.Function);
helperItem.detail = '格式化数据';
helperItem.sortText = '2_formatData';
items.push(helperItem);
// 甚至可以根据上下文动态生成sortText
// 比如,如果用户正在输入一个特定类型的属性,可以提升该类型相关项的优先级
if (document.lineAt(position.line).text.includes('user.')) {
const userNameItem = new vscode.CompletionItem('name', vscode.CompletionItemKind.Property);
userNameItem.detail = '用户姓名';
userNameItem.sortText = '0_userName'; // 在特定上下文中,这个属性可能比其他项更重要
items.push(userNameItem);
}
return items;
}
}这里,
"0_createObject"
"1_config"
"1_config"
"2_formatData"
sortText
"0_a_alpha"
"0_b_beta"
filterText
filterText
sortText
filterText
sortText
当用户输入字符时,VSCode会使用
filterText
label
label
"My Awesome Component"
"my-awesome-component"
filterText
"my-awesome-component"
"my-awesome"
"My Awesome Component"
label
filterText
label
一旦通过
filterText
sortText
filterText
sortText
优化自动补全排序,不仅仅是静态地设置
sortText
一个很直接的策略是基于使用频率的动态排序。我们可以记录用户在当前工作区或项目中对哪些补全项使用得更多。比如,一个函数
logInfo()
sortText
"0_logInfo"
上下文敏感的排序也是一个非常强大的方向。例如:
lodash
lodash
_.map
_.filter
user.
user
name
age
string
const users = []
users.
push
map
filter
实现这些策略,往往需要我们的扩展与VSCode的语言服务器协议(LSP)深度结合,或者在扩展内部进行更复杂的代码分析。这不仅仅是技术层面的挑战,更是对用户体验设计的一次深入思考。我的经验是,即便是最简单的上下文感知,比如根据当前文件中的
import
以上就是VSCode的扩展如何贡献自定义的自动补全项排序规则?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号