Gobble up pudding

プログラミングの記事がメインのブログです。

MENU

サクラエディタで特定のフォルダにYYYYMMDD_番号.txtで保存するマクロを作成

スポンサードリンク

f:id:fa11enprince:20200117021408j:plain 最近の趣味はサクラエディタのPull Requestを眺めることです。 昔から愛用してきたサクラエディタですがマクロを使ったことはありませんでした。
ということで毎日よく簡易的にメモをテキストエディタに書いてYYYYMMDD.txtみたいな形式で保存するのですが、
日付を間違えたり、名前を変更するのをめんどくさがったり、保存先がデスクトップに散ったりなどがありがちなので
デスクトップのmemoというフォルダを用意してそこにフォルダ新規作成時orマクロ実行時にmemo配下に YYYYMMDD_[無題の後の番号].txtというので自動保存するマクロを作成しました。 古のWSH(JScript)が使えるんですね。

マクロの準備

次のコードをsaveByDate.jsという名前で%APPDATA%\sakuraフォルダに保存します。

// saveByDate.js
// see: https://gist.github.com/RYLSnmm/432a35eb3f885722a4f95e8f0ef9df6b
// デフォルトの設置場所:ユーザーごとにインストールなら
//   %APPDATA%sakuraに本ファイルを設置する
// 共通設定よりマクロを設定 文法はWSHに準拠(JScript)
// 新規/開ファイル後にチェックを入れて設定したほうが捗るかも
(function() {
    if (Editor.GetFilename() != "") { return; }
    
    var wsh_shell = new ActiveXObject("WScript.Shell");
    var DEFAULT = {
        savedir: wsh_shell.ExpandEnvironmentStrings("%USERPROFILE%") + "\\Desktop\\memo",
        filename_template: "{{YYYY}}{{MM}}{{DD}}_{{number}}.txt",
        charset: "UTF-8",
        linebreak: "CRLF"
    };
    var savedir = DEFAULT.savedir;
    var filename_template = DEFAULT.filename_template;
    var charset = DEFAULT.charset;
    var linebreak = DEFAULT.linebreak;
    
    var number = Editor.ExpandParameter("$n");
    var filename = createFromTemplate(filename_template, getNowForTemplate(), {number: number});
    var path = savedir + "\\" + filename;

    var fso = new ActiveXObject("Scripting.FileSystemObject");
    if (!fso.FolderExists(savedir)) {
        fso.CreateFolder(savedir);
    }
    
    Editor.FileSaveAs(path, charset, linebreak);
    
    function createFromTemplate(tstr /*, ...args*/) {
        var obj = mergeObjects(Array.prototype.slice.call(arguments, 1));
        return tstr.replace(/\{\{(.*?)\}\}/g, function(_, name) {
            return obj[name] || "";
        });
    }

    function mergeObjects(objects) {
        var result = {};
        for (var i = 0; i < objects.length; i++) {
            var obj = objects[i];
            for (var k in obj) {
                if (obj.hasOwnProperty(k)) {
                    result[k] = obj[k];
                }
            }
        }
        return result;
    }

    function getNowForTemplate() {
        var d = new Date();
        return {
            YYYY: padLeft(d.getFullYear(), 4),
            MM: padLeft(d.getMonth() + 1, 2),
            DD: padLeft(d.getDate(), 2)
        };
    }

    function padLeft(value, len, char) {
        char = char || "0";
        var padding = Array.apply(null, Array(len + 1)).join(char);
        return (padding + value).slice(-len);
    }
})();

設定

サクラエディタを立ち上げて、設定 > 共通設定 > マクロ タブを選択し、

名前:saveByDate
Id: 0
File: saveByDate.js
自動実行: 新規/開ファイル後にチェック

で右下の設定ボタンを押します。
f:id:fa11enprince:20200117023153p:plain

すると次回から新規作成時にmemoフォルダ配下にYYYYMMDD_[無題の後の番号].txtという名前で
ファイルを保存するようになります。

おまけ

この方法だと、サクラエディタを開いてすぐ閉じてしまうなど
0kBのファイルがそこそこできることがありますので、 次のようなバッチファイルを%USERPROFILE%\Desktop\memoにおいて実行すると消えます。

@echo off
cd %~dp0
for %%F in (*) do if %%~zF equ 0 del "%%F"
pause