
为VSCode设置自定义的自动补全提供程序,最直接且功能强大的方式就是开发一个VSCode扩展(Extension)。这听起来可能有点复杂,但说白了,就是利用VSCode提供的Extension API,告诉它在特定场景下应该给出哪些补全建议。它不像你想象的那么遥不可及,更多的是一个结构化的编程任务,用TypeScript或JavaScript就能搞定。核心思想是注册一个“补全项提供者”,让VSCode在用户输入时调用你的逻辑,然后返回你预设好的补全列表。
如果你想让VSCode理解一些它本身不认识的特定语法,或者为某个内部项目提供超个性化的代码提示,那么自己动手写一个扩展是必经之路。这过程其实挺有意思的,就像是给VSCode“训练”一个新的语言模型。
首先,你需要一个脚手架来创建扩展项目。VSCode官方推荐使用
yo code
安装Yeoman和VSCode Extension Generator:
npm install -g yo generator-code
创建新的扩展项目:
yo code
按照提示选择“New Extension (TypeScript)”或“New Extension (JavaScript)”。我个人更倾向于TypeScript,类型检查能省不少心。
核心逻辑编写 (src/extension.ts
extension.js
extension.ts
.js
import * as vscode from 'vscode';
export function activate(context: vscode.ExtensionContext) {
console.log('你的自定义补全扩展已激活!');
// 注册一个补全项提供者
// 这里我们以纯文本文件为例,你可以根据需要修改selector
const provider = vscode.languages.registerCompletionItemProvider(
{ scheme: 'file', language: 'plaintext' }, // 语言选择器:匹配所有scheme为'file'且语言为'plaintext'的文件
{
provideCompletionItems(document: vscode.TextDocument, position: vscode.Position, token: vscode.CancellationToken, context: vscode.CompletionContext) {
const linePrefix = document.lineAt(position).text.substr(0, position.character);
// 假设我们想在输入 'my-' 后提供自定义补全
if (!linePrefix.endsWith('my-')) {
return undefined; // 如果不匹配,则不提供补全
}
// 创建补全项
const item1 = new vscode.CompletionItem('my-custom-value', vscode.CompletionItemKind.Value);
item1.detail = '这是一个自定义的值';
item1.documentation = new vscode.MarkdownString('这个值可以用于配置某些特定参数。');
const item2 = new vscode.CompletionItem('my-function-call', vscode.CompletionItemKind.Function);
item2.insertText = new vscode.SnippetString('myFunction(${1:arg})'); // 支持代码片段
item2.detail = '调用我的自定义函数';
item2.documentation = '这是一个用于执行特定操作的函数。';
return [item1, item2];
},
// 这是一个可选的方法,用于在用户选中补全项后,延迟加载更详细的信息
// 对于性能优化很有用,尤其是当补全项的详细信息需要耗时计算或网络请求时
resolveCompletionItem(item: vscode.CompletionItem, token: vscode.CancellationToken) {
// 可以在这里异步获取更多信息并更新item
// 例如:item.documentation = '加载了更多详细说明...';
return item;
}
},
'-' // triggerCharacters: 当用户输入'-'时,会触发补全
);
// 将提供者添加到扩展的订阅中,以便在扩展停用时自动清理
context.subscriptions.push(provider);
}
export function deactivate() {} // 扩展停用时执行的逻辑package.json
package.json
activationEvents
plaintext
"activationEvents": [
"onLanguage:plaintext"
],
"contributes": {
// 这里可以定义一些其他贡献点,比如命令、配置等
}onLanguage:plaintext
plaintext
测试: 按下
F5
plaintext
my-
要开发一个VSCode自定义补全扩展,核心在于理解和运用VSCode的Extension API。最关键的API就是
vscode.languages.registerCompletionItemProvider
步骤上,我们通常会经历以下几个环节:
yo code
package.json
package.json
activationEvents
onLanguage:yourLanguageId
extension.ts/.js
vscode.languages.registerCompletionItemProvider(selector, provider, ...triggerCharacters)
selector
DocumentSelector
language
pattern
scheme
provider
CompletionItemProvider
provideCompletionItems
CompletionItem
triggerCharacters
provideCompletionItems
.
:
-
provideCompletionItems
document
position
token
context
vscode.CompletionItem
vscode.CompletionItem
CompletionItem
label
kind
Method
Property
Value
insertText
string
SnippetString
detail
documentation
resolveCompletionItem
provideCompletionItems
activate
registerCompletionItemProvider
Disposable
context.subscriptions
坦白讲,理解这些API的参数和返回值,以及如何根据不同的输入场景构建
CompletionItem
处理不同文件类型或特定上下文的自动补全逻辑,是让你的扩展变得智能和实用的关键。这主要通过两个层面来实现:语言选择器(selector
provideCompletionItems
利用selector
vscode.languages.registerCompletionItemProvider
selector
{ language: 'typescript' }{ language: 'json' }scheme: 'file'
scheme: 'untitled'
pattern: '**/*.myconfig'
.myconfig
{ language: 'json', pattern: '**/package.json' }package.json
[ { language: 'json' }, { pattern: '**/*.mydata' } ].mydata
通过合理设置
selector
provideCompletionItems
selector
provideCompletionItems
document
position
const line = document.lineAt(position); const linePrefix = line.text.substring(0, position.character);
通过分析
linePrefix
const fullText = document.getText(); // 进一步解析fullText,例如使用正则表达式或自定义解析器
对于更复杂的补全,比如基于文档中已定义的变量或函数名提供补全,你可能需要解析整个文档。但要注意,频繁地解析整个文档可能会影响性能,需要考虑缓存机制。
config: {
"key1": "value1",
"key2": | // 光标在这里,我们知道应该建议键名
}这需要你根据
linePrefix
ShopWind网店系统是国内最专业的网店程序之一,采用ASP语言设计开发,速度快、性能好、安全性高。ShopWind网店购物系统提供性化的后台管理界面,标准的网上商店管理模式和强大的网店软件后台管理功能。ShopWind网店系统提供了灵活强大的模板机制,内置多套免费精美模板,同时可在后台任意更换,让您即刻快速建立不同的网店外观。同时您可以对网模板自定义设计,建立个性化网店形象。ShopWind网
0
通过这种组合拳,即外部的
selector
开发自定义补全提供者,性能优化和避开常见陷阱是保证用户体验的关键。一个卡顿的补全体验,会比没有补全更让人抓狂。
性能优化:
provideCompletionItems
provideCompletionItems
resolveCompletionItem
provideCompletionItems
CompletionItem
善用resolveCompletionItem
provideCompletionItems
label
kind
CompletionItem
detail
documentation
resolveCompletionItem
resolveCompletionItem
精确的triggerCharacters
triggerCharacters
provideCompletionItems
常见陷阱:
补全项insertText
insertText
SnippetString
range
CompletionItem.range
CompletionItemKind
CompletionItemKind
Function
Variable
Keyword
Class
kind
与其他扩展冲突: 如果多个扩展为同一种语言提供了补全,VSCode会尝试合并它们。但有时可能会出现意料之外的顺序或重复。这通常不是你的扩展能直接解决的问题,但了解这一点有助于排查问题。
调试困难: VSCode扩展的调试环境(Extension Development Host)与普通应用有所不同。
console.log
provideCompletionItems
resolveCompletionItem
资源未清理: 虽然VSCode通常会处理好扩展停用时的资源清理,但如果你手动创建了文件观察器、定时器等,记得在
deactivate
在我看来,自定义补全扩展的开发,就像是给VSCode的语言服务“打补丁”或“增强”。它需要你对目标语言的语法结构有一定的理解,同时也要熟悉VSCode的扩展机制。只要注意性能和细节,就能创造出非常实用的工具。
以上就是如何为VSCode设置一个自定义的自动补全提供程序?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号