#サクラエディタのキーマクロ実行が遅い
サクラエディタで複数回の「カーソル移動」「挿入」「置換」などを繰り返すマクロを実行すると、びよーんと編集画面が更新されて、作業内容が見れるような感じでかなり遅いときがあります。
見れるので安心という一方、さっさと終わってほしい場合のほうが多数派だと思います。
そういう多くの場合に応用できる、ちょいテクニックを紹介します。
いざゆかん、スピードアップじゃ。
##遅いマクロ例
まずマクロはJScript(*.js)で紹介します。
キーマクロ(*.mac)だった場合は「S_
」を削除して、js用に修正してください。
「Editor.
」は現バージョンではあってもなくても問題ないです。これはJavaScriptでwindowを省略できるのと同じです。
実用的ではないですがサンプルとして「1」から「1000」まで1行ずつ挿入するマクロを書いてみます。
var i;
for (i = 1; i <= 1000; ++i) {
Editor.InsText(i + '\r\n');
}
マクロとして実行すると、びよーんと数字が並んだドキュメントができると思います。
また、副作用として「Redo/Undo」バッファが1回ごとの挿入毎に行われるため、1ステップで元に戻せないというのも不便です。
実行してみたら、5秒ぐらい掛かりました。
##解決策その1:一度に挿入する
基本的にサクラエディタは、画面描画処理があまり速くありません。また挿入などの処理も複数回行うと、あまり速くないです。一度にしたほうが高速に動作します。
これはバージョンとか関係なく、jsが実行できるバージョンならほぼ使えます。
var i;
var ins_data = '';
for (i = 1; i <= 1000; ++i) {
ins_data += i + '\r\n';
}
Editor.InsText(ins_data);
実行してみると、ほぼ一瞬で動作します。
TraceOut
マクロも使うことがありますが、同様に1行ずつ表示するより、面倒ですが自前でバッファリングして、一度に出力すると、びっくりするほど高速化します。
##解決策その2:画面更新処理を省略する
一度に更新できればいいですが、一カ所ではなく離れている場所の修正だったり、カーソル移動や各種機能を呼び出したり、エディタの複数回置換では、一度にデータ更新というわけにはいきません。
そういう場合のテクニックとして、画面描画処理を「さぼる」ことを指示できるようになっています。
このSetDrawSwitch
マクロはサクラエディタ ver2.1.0.0 以上で使えます。
https://sakura-editor.github.io/help/HLP000268.html#SetDrawSwitch
最小限のサンプルは下記です。
SetDrawSwitch(0);
var i;
for (i = 1; i <= 1000; ++i) {
InsText(i + '\r\n');
}
SetDrawSwitch(1);
Redraw(0);
SetDrawWsitch
で非表示にした場合、何か画面内容を変更したら、現在のバージョンでは自前でRedraw
(再描画)をする必要があります。
マクロ開発中などで更新されなかったときはF5
キーで再描画させることもできます。
もう少し細かいことも考慮したいと思います。
次のコードでは、draw_old
で元の値を取得してRedraw
するか決めています。
これは、このマクロ実行の再描画だけでなく、マクロ自体が100回繰り返しとかで他のマクロなどから呼ばれていて、元から非表示だった場合に、100回再描画して遅くなるのを防ぐことができます。
var i;
var draw_old = Editor.SetDrawSwitch(0);
for (i = 1; i <= 1000; ++i) {
Editor.InsText(i + '\r\n');
}
Editor.SetDrawSwitch(draw_old);
if (draw_old) {
Editor.Redraw(0);
}
どうでしょうか。こちらも、一瞬または1秒程度で実行できました。
##SetDrawSwitchの問題点
SetDrawSwitch
による処理の省略は、カーソル移動などで一部のバージョン機能にバグがあるときがあります。
その問題を回避できない場合は、SetDrawSwitch
による改善はうまくいかないかもしれません。
ご注意ください。
##Grepのリアルタイム表示
マクロではありませんが、Grep出力の結果を表示する際にも「リアルタイム表示」という機能があります。
デフォルトではOFFですが、ONにしていて遅いというときは、大量にGrepする場合にはOFFにすると、ONのときよりは素早く表示することができます。
逆に、大量のテキストの中から検索するものの「1つ見つけたらそれでいい」場合には、ONにすると、中断などを併用して素早くGrep検索からタグジャンプなどをすることもできます。
共通設定
>検索
タブ>リアルタイムで表示する
、でデフォルト値を変更することができます。
サクラエディタのマクロの実行が遅くてかなわない、という人、ぜひお試しください。
よきサクラエディタライフを!