如何修正VS Code LSP补全代码,使@开头关键词触发自动补全?
解决VS Code扩展中@触发自动补全的问题
问题分析
你遇到的核心问题是VS Code默认不会将@识别为补全触发字符,且补全项的插入逻辑未适配已输入的@,导致重复添加符号。
修正后的代码
import * as vscode from 'vscode'; export function activate(context: vscode.ExtensionContext) { const provider = vscode.languages.registerCompletionItemProvider( 'exa', { provideCompletionItems(document: vscode.TextDocument, position: vscode.Position) { const completions: vscode.CompletionItem[] = []; const linePrefix = document.lineAt(position).text.slice(0, position.character); // 仅当光标前刚输入@时触发补全 if (linePrefix.endsWith('@')) { const endCompletion = new vscode.CompletionItem('@END'); // 插入文本为END,配合已输入的@形成@END endCompletion.insertText = 'END'; completions.push(endCompletion); return completions; } } }, '@' // 设置触发字符,输入@时立即唤起补全 ); context.subscriptions.push(provider); }
关键修改点
- 添加触发字符:在注册补全提供者时,第三个参数传入
'@',让VS Code将@识别为补全触发词,输入@时立刻弹出补全列表。 - 调整插入文本:将补全项的
insertText设为'END',用户选择补全项时,会在已输入的@后直接添加END,最终得到@END,避免重复插入@。 - 精准触发条件:用
linePrefix.endsWith('@')替代includes('@'),确保只有当光标前最后一个字符是@时才触发补全,避免行内其他位置存在@时误触发。
可选实现方式(替换范围逻辑)
也可以通过调整补全项的替换范围实现相同效果:
// 替换上述endCompletion的代码 const endCompletion = new vscode.CompletionItem('@END'); // 定义替换范围:覆盖刚输入的@字符 const range = new vscode.Range( position.translate(0, -1), position ); endCompletion.range = range; endCompletion.insertText = '@END';
这种方式会直接将已输入的@替换成@END,效果与之前一致,可根据习惯选择。
内容的提问来源于stack exchange,提问作者Chris Redford
相关产品推荐
相关产品推荐

