You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修正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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 10:43:31