Как добавить языковой форматер, который является терминальной командой? - PullRequest
1 голос
/ 03 мая 2020

У нас есть команда языкового формата mint format src/main.mint, которая редактирует файл на месте. Есть ли подходящий способ зарегистрировать это действие как средство форматирования документа, чтобы его можно было запускать, когда кто-то нажимал Shift + Option + F?

1 Ответ

0 голосов
/ 03 мая 2020

Вы можете скопировать файл во временный каталог, изменить его с помощью инструмента командной строки, затем прочитать и предоставить его в VSCode

formatter.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)]);
        }
      }
    });
  }
}

utils.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;
}
...