🧏‍♀️

サクラエディタを開いた瞬間、ファイルに保存しよう

2022/09/29に公開

この記事の概要

intro

サクラエディタを使っていてイラつく場面といえば
ちょっとメモのために開いただけで出現するこのダイアログではないでしょうか。
ダイアログ
windowsであれば、こいつらがPCシャットダウンの妨げをしてきます。
また、保存しておきたい内容だったのに保存せず終了してしまう事故も起きるかもしれないです。

そこで、サクラエディタを開いた瞬間に yyyy/mm/yyyymmdd_HHMMSS.txtとして保存することで
これらのストレスから解放されましょう。

参考にしたコード

https://gist.github.com/RYLSnmm/432a35eb3f885722a4f95e8f0ef9df6b

やり方

1. スクリプトファイル作成

%USERPROFILE%\AppData\Roaming\sakura\ に以下のコードを任意の名前で保存
※今回はSaveByDate.jsとして説明する。

ソースコード(クリックで展開)
SaveByDate.js
// saveByDate.js
// https://gist.github.com/RYLSnmm/432a35eb3f885722a4f95e8f0ef9df6b
// ↑を参考
(function() {
    if (Editor.GetFilename() != "") { return; }

    var wsh_shell = new ActiveXObject("WScript.Shell");
    var DEFAULT = {
        savedir: wsh_shell.ExpandEnvironmentStrings("%USERPROFILE%") + "\\Documents\\sakura\\{{YYYY}}\\{{MM}}",
        filename_template: "{{YYYY}}{{MM}}{{DD}}_{{HH}}{{mm}}{{ss}}.txt",
        charset: "UTF-8",
        linebreak: "CRLF"
    };

    var savedir = createFromTemplate(DEFAULT.savedir, getNowForTemplate());
    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");

    //保存先がなかったら作る
    createFolder(savedir)
    Editor.FileSaveAs(path, charset, linebreak);

    function createFolder(folderpath) {
    // フォルダ存在チェック
        if (!fso.FolderExists(folderpath)) {
            if (fso.GetParentFolderName(folderpath)) {
                // フォルダが存在しなかったので親フォルダを作成
                createFolder(fso.GetParentFolderName(folderpath));
                // フォルダ生成
                fso.CreateFolder(folderpath);
            }
        }
    }


    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),
            HH: padLeft(d.getHours(), 2),
            mm: padLeft(d.getMinutes(), 2),
            ss: padLeft(d.getSeconds(), 2)
        };
    }
    function padLeft(value, len, char) {
        char = char || "0";
        var padding = Array.apply(null, Array(len + 1)).join(char);
        return (padding + value).slice(-len);
    }
})();


↑こうなる

2. マクロの有効化

サクラエディタ > 設定 > 共通 > マクロ から先程のマクロを指定した後
自動実行にチェックを入れ[設定]ボタンを押下して設定を反映する。

マクロが列に反映されたら、OKを押してエディタ画面に戻る。

3. 動作確認
Ctrl + N を押下すると、新しいファイルに名前がついているはずです。
デフォルトでは
C:\Users\ユーザー名\Documents\sakura\年\月に保存されますが
1で貼ったコードを改変することで、任意の場所に変更できます。

SaveByDate.js@line9
        savedir: wsh_shell.ExpandEnvironmentStrings("%USERPROFILE%") + "\\Documents\\sakura\\{{YYYY}}\\{{MM}}",

ファイルの自動保存もある

これはサクラエディタの標準機能ですが
サクラエディタ > 設定 > 共通 > ファイルから
数分おきに自動保存を行う設定もあります。

併用することで更に利便性を上げられそうです。

GoogleDriveとの併用

パソコン版GoogleDriveを使うことで
GドライブとしてGoogleDriveを自身のPCにマウントできます。

そこで、GoogleDriveを宛先としたCドライブのシンボリックリンクを張ることで
サクラエディタを開いた瞬間GoogleDriveに保存する というムーブが可能になります。

シンボリックリンクの作成コマンド例を貼っておきます。

powershell@管理者
New-Item -Value 'G:\マイドライブ\sakura\' -Path 'C:\Users\ユーザー名\Documents\' -Name 'sakura' -ItemType SymbolicLink

※ユーザー名は適宜読み替え
https://www.google.com/intl/ja_jp/drive/download/

outro

参考にしたコードとあまり出来映えは変わらないですが
一応存在しないディレクトリを補うように作成する などの工夫がしてあります。
PCを交換した際は速やかに設定したいですね。

Discussion