自動署名マクロ for EmEditor

職業柄 (!?),日々 多くのテキストファイルを書いている.TeX とか C とか JavaScript とか Perl とかその他諸々.こーいうファイルには常に,ファイルの概要・著作権表示・作成日・最終更新日 などといった情報を記しておきたい.「最終更新日 - 作成日」 が大きいと少し嬉しくなるのは俺だけ ?これまで手書きでやってきたわけだが,面倒だし,書き忘れてしまう場合が割とあった.

ということで,マクロを使って自動的に挿入・修正することにした.以下のコードをコピペして 拡張子 .jsee で保存して使う.WinXP + EmEditor v4.09 で正常動作を確認.


//
//  signature.jsee
//      自動署名マクロ
//      (C) 2005 Yoshinori IIHOSHI.
//      Created :       2005/02/08 (Tue)
//      Last Modified : 2005/02/08 (Tue)
//

// デフォルトのファイル作成者名
var g_strWriterName = "Yoshinori IIHOSHI";

/*
    getDateString()
        機能:  現在の日付を取得する
        引数:  なし
        戻り値:現在の日付を示す文字列 (書式:yyyy/mm/dd (Www) )
 */
function getDateString()
{
    var date = new Date();
    var year  = date.getFullYear();
    var month = date.getMonth() + 1;
    var day   = date.getDate();
    if (month < 10) {  month = "0" + month;  }
    if (day   < 10) {  day   = "0" + day;    }
    var wday = date.getDay();
    var aWeekday = new Array("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat");

    return year + "/" + month + "/" + day + " (" + aWeekday[wday] + ")";
}

/*
    insertSignature()
        機能:  署名をファイルの先頭に挿入する
                 (ファイル名・概要・著作権表示・作成日・最終更新日)
        引数:  strDate - 現在の日付を示す文字列
        戻り値:なし
 */
function insertSignature(strDate)
{
    var sel     = document.selection;

    sel.StartOfDocument();
    sel.NewLine(3);
    sel.LineUp(false, 2);

    // ファイル名
    sel.StartOfLine();
    sel.Text = "\t" + document.Name;
    sel.NewLine();

    // 概要
    var strDescription = prompt("このファイルの概要を入力してください。", "");
    if (strDescription != "") {
        sel.StartOfLine();
        sel.Text = "\t\t" + strDescription;
        sel.NewLine();
    }

    // 著作権表示
    var date          = new Date();
    var strYear       = date.getFullYear();
    var strWriterName = prompt("このファイルの作成者名を入力してください。",
                               g_strWriterName);
    sel.StartOfLine();
    sel.Text = "\t\t(C) " + strYear + " " + strWriterName + ".";
    sel.NewLine();

    // 作成日時
    sel.StartOfLine();
    sel.Text = "\t\tCreated :       " + strDate;
    sel.NewLine();

    // 最終更新日時
    sel.StartOfLine();
    sel.Text = "\t\tLast Modified : " + strDate;
    sel.NewLine();

    // 改行時のゴミ (インデント) を削除
    sel.StartOfLine();
    sel.NewLine();
    sel.SelectLine();
    sel.Delete();

    sel.StartOfDocument();
    sel.LineDown(true, 7);
    editor.ExecuteCommandByID(4371);    // コメントを挿入
    editor.ExecuteCommandByID(4253);    // タブを空白に変換
    sel.Collapse();

    document.HighlightFind = false;
}

{
    var strDate = getDateString();
    var sel     = document.selection;
    sel.StartOfDocument();
    if (sel.Find("Last Modified : ", eeFindNext | eeFindReplaceCase)) {
        // 最終更新日を現在の日付で置き換える
        sel.Replace("\\d{4}/\\d{2}/\\d{2} \\(\\u\\l{2}\\)", strDate,
                    eeFindReplaceCase | eeFindReplaceRegExp);
        sel.Collapse();
        document.HighlightFind = false;
    }
    else {
        // 署名を新規に挿入する
        insertSignature(strDate);
    }
}

EmEditor のマクロ,と言うよりテキストエディタのマクロを書いたのは恐らく今回が初.今後は積極的に使おうかな.