愛用しているメモ帳アプリ「Mery」。
こちらに入れてある「自動箇条書き」のマクロが正常に作動しなくなってしまいました。
今まではShift+Enterで「・」を自動入力できていました。
しかしある時から「undefinedundefined・」という謎文字が表示されるようになったのです。
原因や改善策を調べてみましたが、
「マクロ上部に以下のコードを追加してみてください。」
#language = "JScript"
という情報しか見つけられませんでした。
そしてこれを入れても、というか何故か既にマクロ最上部に記入してあったのですが、問題は解決しませんでした。
目次
Meryを諦めきれない
Meryはかれこれ10年以上愛用しているソフトです。
今更他のメモ帳ソフトに移行する気はありません。
どうにか自動箇条書きを復活させられないかと、知恵を絞って修正コードを作成しました。
きっと私と同じ問題にぶつかっている人が他にもいると思います。
そのコードをこちらで共有しますので、良ければお試しください。
3点注意です。
- 何が起きても自己責任です。
- 少々私の好みに合わせた編集がしてあります。
- 上手くいかなくても相談に乗ったりはしません。
では、以下にコードを示します。
#language = "JScript"
#title = "箇条書き(記号対応版)"
var firstitem = "・";
var reg = /^([\t ]*)(?:([((]*)([a-zA-Z]+|[0-9]+|[0-9]+)([))\.. ]+)|([--・・**■□>>]))/;
var ty = Editor.ActiveDocument.Selection.GetActivePointY(mePosLogical);
var trymax = 5;
var tyend = (ty - trymax > 0) ? ty - trymax : 1;
var line = "";
var result;
var resultary = [];
var thisline = Editor.ActiveDocument.GetLine(ty, 0);
var indent = thisline.replace(/^([ \t]*).*/, "$1");
for (var i = ty; i >= tyend; i--) {
line = Editor.ActiveDocument.GetLine(i, 0);
var linechk = line.replace(/^([ \t]*).*/, "$1");
if (i < ty && linechk.length < indent.length) {
break;
}
result = reg.exec(line);
if (result != null) {
if (result[1] == indent) {
resultary.unshift(result.slice(0));
} else if (result[1] < indent) {
break;
}
} else if (resultary.length > 0) {
break;
}
}
Editor.ActiveDocument.Write(bulletSucc(resultary, thisline));
function bulletSucc(resultary, thisline) {
if (resultary.length == 0) {
return firstitem;
}
var chklast = resultary.pop();
var chklastlast = resultary.pop();
var i = (chklastlast == null || isNaN(chklast[3]) || isNaN(chklastlast[3])) ? 1 : chklast[3] - chklastlast[3];
var s = "", r3 = (chklast == null) ? 0 : chklast[3];
// undefined対策
var indent = chklast[1] || "";
var prefix = chklast[2] || "";
var suffix = chklast[4] || "";
var symbol = chklast[5] || "";
// 数字・アルファベット箇条書きなら連番に
if (r3) {
if (isNaN(r3)) {
if (r3 == "9") {
s = 10;
} else {
i = (r3 == "z" || r3 == "Z") ? -25 : 1;
s = String.fromCharCode(r3.charCodeAt(r3.length - 1) + i);
}
} else {
s = Number(r3) + i;
s = (s > 0) ? s : 0;
if (r3.charAt(0) == "0") {
s = ("0000" + s).slice(-r3.length);
}
}
}
// 記号だけなら、そのまま使う
if (!r3 && symbol) {
if (thisline.replace(/^[ \t]+/, "").length == 0) {
return symbol;
} else {
return "\n" + indent + symbol;
}
}
// 通常の箇条書き(数字・英字)
if (thisline.replace(/^[ \t]+/, "").length == 0) {
return prefix + s + suffix + symbol;
} else {
return "\n" + indent + prefix + s + suffix + symbol;
}
}
上手くいったらコメントください。
元気がもらえます^^
コメント