首页 > 解决方案 > 如何添加作为终端命令的语言格式化程序?

问题描述

我们有一个语言格式命令mint format src/main.mint,可以就地编辑文件。是否有适当的方法将此操作注册为文档格式化程序,以便在有人按下 Shift+Option+F 时触发它?

标签: visual-studio-codevscode-extensions

解决方案


您可以将文件复制到临时目录,使用命令行工具对其进行修改,然后将其读取并提供给 VSCode

格式化程序.ts

import vscode = require("vscode");
import cp = require("child_process");
import fs = require("fs");

import { getDirtyFile } from "./utils";

export class MintFormattingProvider
  implements vscode.DocumentFormattingEditProvider {
  public provideDocumentFormattingEdits(
    document: vscode.TextDocument,
    options: vscode.FormattingOptions,
    token: vscode.CancellationToken
  ): vscode.TextEdit[] | Thenable<vscode.TextEdit[]> {
    return new Promise((resolve, reject) => {
      let file = getDirtyFile(document);

      let res = cp.spawnSync("mint", ["format", file], {
        cwd: vscode.workspace.rootPath,
      });

      if (res.status !== 0) {
        reject(res.error);
      } else {
        if (!fs.existsSync(file)) {
          reject(file + " file not found");
        } else {
          let content = fs.readFileSync(file, "utf-8");
          let range = document.validateRange(
            new vscode.Range(
              new vscode.Position(0, 0),
              new vscode.Position(1000000, 1000000)
            )
          );
          resolve([vscode.TextEdit.replace(range, content)]);
        }
      }
    });
  }
}

实用程序.ts

import fs = require("fs");
import path = require("path");
import os = require("os");
import vscode = require("vscode");

/**
 * Returns temporary file path of edited document.
 */
export function getDirtyFile(document: vscode.TextDocument): string {
  var dirtyFilePath = path.normalize(
    path.join(os.tmpdir(), "vscodemintdirty.mint")
  );
  fs.writeFileSync(dirtyFilePath, document.getText());
  return dirtyFilePath;
}

export function createAndShowOutputWindow(): vscode.OutputChannel {
  var channel = vscode.window.createOutputChannel("mint");
  channel.show();
  return channel;
}

推荐阅读