VSCodeで選択範囲の重複行を削除するマクロ

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

過去のエントリで紹介したVSCode Macros拡張を使って選択範囲のテキストが重複する行の削除を行うシンプルなマクロ関数サンプルを作ってみましたので、紹介します。


動作イメージ

重複行を削除したい行を選択した状態でこのマクロを実行すると、選択行の重複行だけを削除します。

仕様:

  • 空行は重複と見做さず残しています。
  • マルチセレクションには非対応です。
  • 行の並べ替えは行いません(標準コマンドがあるので)。
  • 同期実行です(検証環境では全角20文字で4000行程度では遅延なし)。
  • エラー処理などは殆ど行っていません。

※例では動作がわかりやすいように同じテキストの行に色をつけています。


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

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

const vscode = require('vscode');

/**
 * マクロコンフィギュレーション(環境に合わせてお好みで設定)
 */
module.exports.macroCommands = {
  重複行の削除: {
    no: 1,
    func: removeDupLines
  },
};

/**
 * 重複行の削除マクロ
 */
function removeDupLines() {
  const editor = vscode.window.activeTextEditor;
  if (!editor) {
    return 'Editor is not opening.';
  }
  // 選択範囲のテキストを取得
  const document = editor.document;
  const selection = editor.selection;
  const text = document.getText(selection);
  if (text.length > 0) {
    // ドキュメントのEOL記号
    const documentEOL = {
      1: '\n',
      2: '\r\n'
    } [document.eol];
    // 行で配列化
    const selectedLines = text.split(documentEOL);
    // 重複行のマーク
    const appeared = new Set();
    const uniqueLines = selectedLines.map((lineText, rowIndex) => {
      if (lineText.length > 0 && appeared.has(lineText)) {
        return {
          text: lineText,
          row: -1
        };
      }
      appeared.add(lineText);
      return {
        text: lineText,
        row: rowIndex
      };
    });

    editor.edit(editBuilder => {
      // 重複行を除いたテキストを選択範囲に書き戻す
      const replaced = uniqueLines
        .filter((value) => value.row > -1)
        .map((value) => value.text)
        .join(documentEOL);
      editBuilder.replace(selection, replaced);
    });
  }
}

GitHub Gist

ちなみに、マクロ関数をasync定義にして処理をPromiseで実行すれば、非同期化も可能です。


以上です。

シェアする

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

フォローする