|
みなさん今日は。タナカと申します。
「行単位でソート」したくてマクロを探してみた所、秀丸サイトのマクロライブラ
リに塚本 牧生さんが作ったマクロがありました。でもソースを読んでみたら「バブ
ルソート」アルゴリズムでなかった為、自分でバブルソートするマクロを以下のよう
に作ってみました。
しかし、塚本 牧生さんのに比べて少し遅いようです。手元に180行で7.3kBのデー
タがあるのですが。
塚本 牧生さんの → 7秒ぐらい
私の → 10秒ぐらい
の差があります。何故でしょうか。
他にも秀丸マクロ独自の動作速度を速める工夫ってありますでしょうか。
//----------------------------------------------------------
//##1:開始行、##2:終了行、##3:降順フラグ(昇順→0、降順→1)
SortLines:
##StartLine = ##1;
##EndLine = ##2;
##AsReverse = ##3;
$$Line1 = "";
$$Line2 = "";
##i = ##StartLine;
##j = 0;
##k = 0;
##m = 0;
$$Title = "ソートしてます:";
$$DispTitle = "";
disabledraw;
disableinvert;
disablebreak;
while (##i < ##EndLine) {
##k = 5 * (##i * 3 / 2) / ##EndLine + 1;
##m = 0;
$$DispTitle = $$Title;
while (##m < ##k && ##m < 5) {
$$DispTitle = $$DispTitle + "■";
##m = ##m + 1;
}
while (##m < 5) {
$$DispTitle = $$DispTitle + "□";
##m = ##m + 1;
}
title $$DispTitle;
##j = ##EndLine;
movetolineno 1, ##j;
selectline;
$$Line1 = gettext(seltopx, seltopy, selendx, selendy);
while (##j > ##i) {
movetolineno 1, ##j - 1;
selectline;
$$Line2 = gettext(seltopx, seltopy, selendx, selendy);
//昇順で前の行が大きいとき
//降順で後ろの行が大きいとき
if ((##AsReverse == 0 && $$Line2 > $$Line1)
|| (##AsReverse == 1 && $$Line2 < $$Line1)) {
movetolineno 1, ##j;
beginsel;
golineend2;
right;
cut;
movetolineno 1, ##j - 1;
paste;
} else {
$$Line1 = $$Line2;
}
##j = ##j - 1;
}
##i = ##i + 1;
}
enabledraw;
enableinvert;
return;
//----------------------------------------------------------
|
|