コンピューターシステム株式会社

技術BLOG

サクラエディタ でJScript

言語 2019/09/13 東京担当

こんにちは。CSC東京本社のSODです。サクラエディタについての記事です。サクラエディタとは、アウトライン解析・補完入力・複数エンコードなど、エンジニアにはありがたい機能を多く持つ高機能のテキストエディタです。テキストエディタでありながらマクロが使用できるのは面白く、工夫次第でいろいろなことが可能です。
今回はJScriptを使用したマクロの登録方法とサンプルを紹介します。

マクロ登録手順

まずサクラエディタにマクロを登録する方法を説明します。
今回は「Hi」と出すだけのsample00.jsを登録します。

1.設定>共通設定を開く。
2.サクラエディタのホームディレクトリを確認する。
3.手順2で確認した場所にsample00.jsを配置する。

sample00.js

Editor.InsText("Hi\r\n");

4.再度設定>共通設定を開く。
5.名前、File、Idを入力し設定ボタンを押下。
6.OKを押下し共通設定を閉じる。

これで実行可能です。ツール>登録済みマクロから登録したマクロをクリックすれば実行可能です。

次はサンプルの紹介です。

サンプルその1 文章の変換・整形

文章の整形をしています。

sample01.js

Editor.GoFileEnd();
Editor.InsText("\r\n");
var count = GetLineCount(0);
var textLine;
var list;
var convertResult;
 
for(var i=0; i < count; i++){
    convertResult = "";
    textLine = GetLineStr(i+1);
    textLine = textLine.replace(/=.*/g, "");
     
    Editor.InsText("@aaa");
    Editor.InsText("\r\n");
    textLine = textLine.replace("\r\n", "");
    textLine = textLine.replace("\n", "");
    Editor.InsText("@bbb(ccc = \"" + textLine + "\")");
    Editor.InsText("\r\n");
    textLine = textLine.toLowerCase();
    list = textLine.split('_');
    for(var j=0; j < list.length; j++){
        if(0 < j){
            convertResult += list[j].charAt(0).toUpperCase() + list[j].slice(1);
        } else {
            convertResult += list[j];
        }
    }
    Editor.InsText("private String " + convertResult + ";");
    Editor.InsText("\r\n");
}

サンプルその2 動く何か

◎がエディタの中を好き勝手に移動するいもむしをイメージした何かです。

sample02.js

Editor.GoFileEnd();
Editor.InsText("\r\n");
var LINE_COUNT = GetLineCount(0);
var X_MAX = 10;
var X_MIN = 0;
var Y_MAX = 10;
var Y_MIN = 0;
var headX = 2;
var headY = 0;
var bodyX = 1;
var bodyY = 0;
var legX = 0;
var legY = 0;
var continueFlag = 1;
var loopCount = 1;

while (continueFlag) {
    drow();
    move();
    //forだと動作が安定しないのでwhile文を使用
    if (loopCount % 30 === 0) {
        continueFlag = imoimo();
        loopCount = 0;
    }
    loopCount += 1;
    sleep(200);
}

function sleep(waitMsec) {
    var startMsec = new Date();
    while (new Date() - startMsec < waitMsec);
}

function drow() {
    var lineText = "";
    for (j = 0; j < Y_MAX; j++) {
        for (i = 0; i < X_MAX; i++) {
            if (headX === i && headY === j) {
                lineText += "◎";
            } else if ((bodyX === i && bodyY === j)
                    || (legX === i && legY === j)) {
                lineText += "○";
            } else {
                lineText += " ";
            }
        }
        lineText += "\r\n";
    }
    Editor.MoveCursor(LINE_COUNT, 1, 1);
    Editor.InsText(lineText);
}

function move() {
    while (true) {
        var nextDir = random(0, 3);
        if (nextDir === 0 && movableImomushi(headX, headY - 1)) {
            moveLowerBody();
            headY -= 1;
            break;
        }
        if (nextDir === 1 && movableImomushi(headX + 1, headY)) {
            moveLowerBody();
            headX += 1;
            break;
        }
        if (nextDir === 2 && movableImomushi(headX, headY + 1)) {
            moveLowerBody();
            headY += 1;
            break;
        }
        if (nextDir === 3 && movableImomushi(headX - 1, headY)) {
            moveLowerBody();
            headX -= 1;
            break;
        }
    }
}

function random(min, max) {
    return min + Math.floor(Math.random() * (max - min + 1));
}

function movableImomushi(nextX, nextY) {
    return !(nextX === bodyX && nextY === bodyY)
            && !(nextX === legX && nextY === legY)
            && (nextX >= 0 && nextY >= 0)
            && (nextX < X_MAX && nextY < Y_MAX);
}

function moveLowerBody() {
    legX = bodyX;
    legY = bodyY;
    bodyX = headX;
    bodyY = headY;
}

function imoimo() {
    if (Editor.MessageBox("続けますか?", 4) === 6) {
        return 1;
    }
    return 0;
}

まとめ

いかがだったでしょうか。
面白い機能を掘り出して業務の効率化ができると楽しいものです。
使い慣れたツールでも是非一度機能を見直してみてください。何か新しい発見があるかもしれませんよ。