3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

サクラエディタの遅いマクロを高速に実行する

Last updated at Posted at 2019-09-02

#サクラエディタのキーマクロ実行が遅い
サクラエディタで複数回の「カーソル移動」「挿入」「置換」などを繰り返すマクロを実行すると、びよーんと編集画面が更新されて、作業内容が見れるような感じでかなり遅いときがあります。
見れるので安心という一方、さっさと終わってほしい場合のほうが多数派だと思います。

そういう多くの場合に応用できる、ちょいテクニックを紹介します。

いざゆかん、スピードアップじゃ。

##遅いマクロ例
まずマクロはJScript(*.js)で紹介します。
キーマクロ(*.mac)だった場合は「S_」を削除して、js用に修正してください。
Editor.」は現バージョンではあってもなくても問題ないです。これはJavaScriptでwindowを省略できるのと同じです。

実用的ではないですがサンプルとして「1」から「1000」まで1行ずつ挿入するマクロを書いてみます。

sample_macro.js
var i;
for (i = 1; i <= 1000; ++i) {
    Editor.InsText(i + '\r\n');
}

マクロとして実行すると、びよーんと数字が並んだドキュメントができると思います。
また、副作用として「Redo/Undo」バッファが1回ごとの挿入毎に行われるため、1ステップで元に戻せないというのも不便です。
実行してみたら、5秒ぐらい掛かりました。

##解決策その1:一度に挿入する
基本的にサクラエディタは、画面描画処理があまり速くありません。また挿入などの処理も複数回行うと、あまり速くないです。一度にしたほうが高速に動作します。
これはバージョンとか関係なく、jsが実行できるバージョンならほぼ使えます。

sample_macro_onece.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
最小限のサンプルは下記です。

sample_macro_draw_switch1.js
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回再描画して遅くなるのを防ぐことができます。

sample_macro_draw_switch2.js
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検索からタグジャンプなどをすることもできます。
共通設定検索タブ>リアルタイムで表示する、でデフォルト値を変更することができます。

サクラエディタのマクロの実行が遅くてかなわない、という人、ぜひお試しください。
よきサクラエディタライフを!

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?