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

VS Code扩展开发中如何获取用户选中的diagnostic诊断项?

解决方案

你不需要寻找类似getSelectedDiagnostic的独立API,VS Code的CodeActionProvider机制本身已经把用户触发Quick Fix时选中的单个diagnostic作为参数传入了回调逻辑,直接按如下方式实现即可:

步骤1:在CodeActionProvider中获取当前触发的diagnostic

注册Quick Fix对应的CodeActionProvider时,回调方法的context.diagnostics字段就是用户当前hover选中、触发本次Quick Fix面板的diagnostic(同一位置可能有多个,大多场景下只有1个你需要的目标诊断),你可以把它作为参数绑定到你的命令上:

import * as vscode from 'vscode';

class DeleteDiagnosticFixProvider implements vscode.CodeActionProvider {
    public static readonly providedCodeActionKinds = [vscode.CodeActionKind.QuickFix];

    provideCodeActions(
        document: vscode.TextDocument,
        range: vscode.Range,
        context: vscode.CodeActionContext,
        token: vscode.CancellationToken
    ): vscode.CodeAction[] {
        if (context.diagnostics.length === 0) return [];

        return context.diagnostics.map(targetDiag => {
            const fixAction = new vscode.CodeAction(
                '删除该诊断对应的代码片段',
                vscode.CodeActionKind.QuickFix
            );
            // 将当前选中的diagnostic和文档URI作为参数传给删除命令
            fixAction.command = {
                command: '你的扩展唯一标识.deleteDiagnosticCode',
                title: '删除对应代码',
                arguments: [targetDiag, document.uri]
            };
            fixAction.diagnostics = [targetDiag];
            return fixAction;
        });
    }
}

步骤2:实现删除命令,直接使用传入的单个diagnostic

注册命令时直接接收前面传入的目标diagnostic,基于它的range删除对应代码即可,只会删除当前选中的diagnostic对应片段,不会影响其他位置的同类诊断:

export function activate(context: vscode.ExtensionContext) {
    // 注册删除代码的命令
    const deleteDiagCodeCmd = vscode.commands.registerCommand(
        '你的扩展唯一标识.deleteDiagnosticCode',
        async (targetDiagnostic: vscode.Diagnostic, docUri: vscode.Uri) => {
            const activeEditor = vscode.window.activeTextEditor;
            if (!activeEditor || activeEditor.document.uri.toString() !== docUri.toString()) {
                return;
            }
            // 仅删除当前选中diagnostic对应范围的代码
            await activeEditor.edit(editBuilder => {
                editBuilder.delete(targetDiagnostic.range);
            });
        }
    );

    // 注册CodeActionProvider,*代表适配所有语言,也可指定特定语言ID比如javascript、python
    context.subscriptions.push(
        deleteDiagCodeCmd,
        vscode.languages.registerCodeActionsProvider(
            '*',
            new DeleteDiagnosticFixProvider(),
            {
                providedCodeActionKinds: DeleteDiagnosticFixProvider.providedCodeActionKinds
            }
        )
    );
}

其他场景补充

如果你需要在非Quick Fix触发的逻辑中获取当前光标所在位置的diagnostic,也可以自行遍历全局诊断结果匹配光标位置:

function getCursorPositionDiagnostic(): vscode.Diagnostic | undefined {
    const activeEditor = vscode.window.activeTextEditor;
    if (!activeEditor) return undefined;
    const cursorPos = activeEditor.selection.active;
    const docDiagnostics = vscode.languages.getDiagnostics(activeEditor.document.uri);
    // 返回包含当前光标位置的diagnostic
    return docDiagnostics.find(diag => diag.range.contains(cursorPos));
}

内容的提问来源于stack exchange,提问作者notexactly

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 16:36:03