VSCodeでファイル選択ダイアログからファイルを比較(DIFF)するマクロ

この記事は公開から3年以上経過しています。

過去のエントリで紹介したVSCode Macros拡張を使い、ファイル選択ダイアログで選択した2つのファイルの差分(DIFF)表示を行うマクロを作成してみましたので、紹介します。


動作イメージ

ファイル選択ダイアログで比較したいファイルを直接選択してDIFFを行います。通常のDIFFコマンドと違い、比較ファイルを予めエディタで開いている必要はありません。

image

仕様:

  • 最後に開いたパスとして一時的に左のファイルのパスを保持します。
  • エラー処理などは殆ど行っていません。


マクロのサンプルソースコード

※マクロコンフィギュレーション部分のマクロ名と順番は、現在お使い頂いているマクロファイルに合わせてご利用ください。

const vscode = require('vscode');
const fs = require('fs');

/**
 * マクロコンフィギュレーション(環境に合わせてお好みで設定)
 */
module.exports.macroCommands = {
  ファイル比較: {
    no: 1,
    func: diffFiles,
  },
};

async function diffFiles() {
  // 最後に開いたファイルのパスがグローバル変数領域に存在しない場合は作成
  if (!global.bahW6wau) {
    global.bahW6wau = { last_opened_uri: undefined };
  }

  // 選択ファイルを取得するローカル関数
  const checkFile = (uris) => {
    if (!uris) {
      vscode.window.showInformationMessage('Cancelled');
      return;
    }
    return uris[0];
  };

  // グローバル変数領域から最後に開いたパスを取得
  let lastUri;
  if (global.bahW6wau.last_opened_uri && fs.existsSync(global.bahW6wau.last_opened_uri.fsPath)) {
    lastUri = global.bahW6wau.last_opened_uri;
  }

  // 左右のファイルをファイル選択ダイアログで選択
  const leftFiles = await vscode.window.showOpenDialog({ canSelectFiles: true, canSelectFolders: false, canSelectMany: false, defaultUri: lastUri, title: 'Select a left file for compare' });
  const leftFile = checkFile(leftFiles);
  if (!leftFile) return;
  lastUri = leftFile;
  // 最後に開いたパスをグローバル変数領域に保存
  global.bahW6wau.last_opened_uri = lastUri;
  const rightFiles = await vscode.window.showOpenDialog({ canSelectFiles: true, canSelectFolders: false, canSelectMany: false, defaultUri: lastUri, title: 'Select a right file for compare' });
  const rightFile = checkFile(rightFiles);
  if (!rightFile) return;

  // VSCodeのDIFFビルトインコマンドでファイル差分を表示
  await vscode.commands.executeCommand('vscode.diff', leftFile, rightFile, `Compare(${leftFile.fsPath} ↔ ${rightFile.fsPath})`);
}

GitHub Gist

ちなみに、ソース中の最後に開いたパスを保存するグローバル変数名bahW6wauは、単にNodeのグローバル変数名が他の機能などと重複しないようにランダムな名称にしているだけですので、特別な意味はありません。


以上です。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする