开发VSCode扩展:如何不打开编辑器格式化文件?
无需打开编辑器格式化VSCode文件的解决方案
我正在开发一款VSCode扩展,目标是通过上下文菜单实现文件格式化,核心需求是无需在文本编辑器中打开文件就能完成操作。
我尝试了以下代码,但调用vscode.workspace.openTextDocument会导致文件留在编辑器中处于打开状态:
async function formatDocument(uri: vscode.Uri) { if (uri && uri.fsPath) { const filePath = uri.fsPath; try { let content = await fs.readFile(filePath, 'utf8'); const document = await vscode.workspace.openTextDocument({ content, language: getLanguageFromPath(filePath) }); const edits: any[] = await vscode.commands.executeCommand('vscode.executeFormatDocumentProvider', document.uri, getLanguageFromPath(filePath)); if (edits && edits.length > 0) { const edit = new vscode.WorkspaceEdit(); edits.forEach(e => edit.replace(document.uri, e.range, e.newText)); await vscode.workspace.applyEdit(edit); const formattedContent = document.getText(); await fs.writeFile(filePath, formattedContent, 'utf8'); vscode.window.showInformationMessage("File formatted successfully!"); } } catch (error: any) { vscode.window.showErrorMessage(`Error formatting file: ${error.message}`); } } }
你不需要创建临时文档并打开它,直接利用文件的真实URI调用VSCode的格式化命令,再通过WorkspaceEdit将修改应用到磁盘文件即可,完全无需打开编辑器。
修改后的代码如下:
import * as vscode from 'vscode'; import * as fs from 'fs'; async function formatDocument(uri: vscode.Uri) { if (!uri?.fsPath) { return; } const languageId = getLanguageFromPath(uri.fsPath); if (!languageId) { vscode.window.showErrorMessage("无法识别文件对应的语言类型"); return; } try { // 获取当前文件对应的格式化配置 const formattingOptions = await vscode.workspace.getConfiguration('editor', uri).get('formattingOptions'); // 直接调用格式化命令,传入文件的真实URI const edits: vscode.TextEdit[] = await vscode.commands.executeCommand( 'vscode.executeFormatDocumentProvider', uri, formattingOptions ); if (edits?.length) { const workspaceEdit = new vscode.WorkspaceEdit(); // 将格式化编辑直接应用到目标文件URI workspaceEdit.set(uri, edits); const applySuccess = await vscode.workspace.applyEdit(workspaceEdit); if (applySuccess) { // 确保修改写入磁盘 await vscode.workspace.save(); vscode.window.showInformationMessage("文件格式化成功!"); } else { vscode.window.showErrorMessage("应用格式化修改失败"); } } else { vscode.window.showInformationMessage("文件已处于格式化状态,无需修改"); } } catch (error: any) { vscode.window.showErrorMessage(`格式化文件出错:${error.message}`); } } // 辅助函数:从文件路径获取语言ID function getLanguageFromPath(filePath: string): string | undefined { const ext = filePath.split('.').pop(); return ext ? vscode.languages.getLanguages().then(langs => { return vscode.languageExtensions.getLanguageIdForExtension(`.${ext}`); }) : undefined; }
关键改进点:
- 不再创建临时文档,直接使用文件的真实URI调用
vscode.executeFormatDocumentProvider命令 - 通过
WorkspaceEdit直接将格式化编辑应用到目标文件,无需手动读取/写入文件内容 - 利用VSCode内置配置获取格式化选项,保证格式化行为和编辑器内操作一致
- 彻底避免了
openTextDocument带来的文件自动打开问题
内容的提问来源于stack exchange,提问作者Vinícius Iancovski
相关产品推荐
相关产品推荐

