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
相关产品推荐
相关产品推荐

