|
「秀丸エディタ 8.9x を維持しなければ」、ならないのであれば、
hmJS.dllというファイルを1つ「秀丸エディタ本来exeと同じフォルダ」に導入でき
るのであれば、
以下のマクロでも動作します。
(hmV8が導入できるのであれば、先に投稿していたものがほとんどそのまま動作しま
すが、外部dllを導入するならファイル数が1つとかの方が気楽でしょう。)
hmJS.dll
└ https://xn--pckzexbx21r8q9b.net/?page=nobu_tool_hm_javascript
これでも 3万行程度なら、1〜3秒程度だと思います(マシンパワーによる)
----- test.mac -----
#JS = loaddll( hidemarudir + @"\hmJS.dll" );
if ( !#JS ) { message "hmJS.dllが読み込めない"; }
#r = dllfuncw( #JS, "DoString", R"JS(
function customFunc(text, count) {
// はじめての登場なら
if (count == 1) {
// そのまま返す
return text;
// 重複以降は
}
else {
// 登場した回数を添える。
return text + " " + count + "番";
}
}
// 通常の「範囲選択」のテキスト内容が対象。範囲選択していない場合、「テキス
ト全体」を対象とする
function getTargetText() {
return hidemaru.getSelectedText() || hidemaru.getTotalText();
}
// 警告用の関数。
function outputAlert(e) {
// エラーがあればアウトプット枠へ
hm.OutputPane.Output(e + "\r\n");
}
try {
var targetText = getTargetText();
if (!targetText) {
throw "対象のテキストが無効です";
}
// ワード内容と出現回数のハッシュ
var countHash = {};
// 各行を改行を除去した状態で配列として格納
var textArray = targetText.split("\r\n");
// 各行を処理していく
for (var i = 0; i < targetText.length; i++) {
// 対象の行のテキスト
var text = textArray[i];
// 有効文字がないなら次へ
if (!text) {
continue;
}
if (countHash[text]) {
// 1つカウントアップ
countHash[text]++;
} else {
countHash[text] = 1;
}
// カスタム関数を使って、加工する
textArray[i] = customFunc(text, countHash[text]);
}
newText = ""; // 後でマクロ側から取得するため、グローバル変数にしておく。
newText = textArray.join("\r\n");
// 元々のテキストと新たなテキストに変更があれば、エディタ上での差し替え
行為が必要となる。
var mustReplace = targetText != newText;
// 秀丸マクロに伝達。
setVar("#mustReplace", mustReplace);
// 修正が必要なようだ
if (!mustReplace) {
outputAlert("重複はありません");
} else {
outputAlert("重複を発見しました");
}
}
// エラーや警告の類が出たらここ
catch (e) {
outputAlert(e);
}
)JS"
);
// 修正が必要なようだ
if (#mustReplace) {
begingroupundo;
if (!selecting) {
selectall;
}
// 30000行あるならば、秀丸マクロの変数で受け取るのは危険。
// メモリ消費を避けるため、マクロの一時変数で受け取らず、JS変数内容をか
らそのままエディタペインへと挿入
insert dllfuncstrw(#JS, "GetStrVar", "newText");
endgroupundo;
}
freedll( #JS );
|
|