Skip to content

Instantly share code, notes, and snippets.

@murachue
Last active December 23, 2015 01:39
Show Gist options
  • Save murachue/6561673 to your computer and use it in GitHub Desktop.
Save murachue/6561673 to your computer and use it in GitHub Desktop.
文字数かぞえる秀丸マクロ
// charcount.mac
// 文字数を数えるマクロ(秀丸向け、8.32で動作確認)
// 実行すると、文書全体の文字数か、文を選択していればその部分の文字数をメッセージボックスで表示する。
// 文字数は、すべての文字の数、改行抜き、さらに空白抜き、さらに句読点抜きの4つを表示する。
// ただし/*……*/で囲まれた部分はカウントしない。
// 「-- 」だけの行を発見するとそこまでの文字数を表示する。
// なにかメモ書きしながら決められた文字数の文書を書く時には、
// "-- "の行より上に本文、下にメモを書いておくと、本文を選択せずとも簡単に本文の文字数が求められる。
// 参考:
// http://hide.maruo.co.jp/lib/macro/mm_charcount.html (選択文字数カウントマクロ V1.03)
// 秀丸エディタ8.21では、全角判定がうまくいかない("code"からはShift-JISにおける1バイトずつしか帰らない…)。
// http://www2u.biglobe.ne.jp/~yuichi/rest/strcount.html (文字数カウンタ)
// 改行・空白抜き文字数などはここと比較している。
// TODO:
// 矩形選択範囲モードも実装?
// 遅いカーソル移動+unicodeではなく、gettext+unicode()で計算
// (gettextがV8.21ではバイト単位でしか取れないっぽい…)
// 除外する文字を配列で定義して読みやすくする
#oc = column;
#ol = lineno;
// 句読点や空白系文字を含む(文字|おおよそのバイト)数
// (バイト数はエンコーディングによってズレる可能性あり)
#tchars = 0;
#tbytes = 0;
// 句読点を含む(文字|おおよそのバイト)数
#schars = 0;
#sbytes = 0;
// (文字|おおよそのバイト)数
#jchars = 0;
#jbytes = 0;
// 行数(選択時など)
#lines = 0;
// コメント文中か
#commenting = 0;
#breaked = 0; // "-- "による中断フラグ
disabledraw;
if(rectselecting) {
message "矩形選択は未実装です…。";
endmacro;
} else if(selecting) {
$modestr = "選択範囲 (L"+str(seltoplineno)+"C"+str(seltopcolumn)+"-L"+str(selendlineno)+"C"+str(selendcolumn)+")";
#startcol = seltopcolumn;
#startline = seltoplineno;
#endcol = selendcolumn;
#endline = selendlineno;
} else {
$modestr = "文書全体";
#startcol = 0;
#startline = 1;
#endcol = 0xffff;
#endline = linecount2;
}
moveto2 #startcol, #startline;
while(lineno <= #endline) {
if(gettext2(0, lineno, 3, lineno) == "-- " && linelen2 == 3) {
#breaked = 1;
break;
}
while(column < linelen2) {
if(#endline <= lineno && #endcol <= column) {
break;
}
#code = unicode;
if(#code <= 0x7F) {
// 半角文字
#byte = 1;
} else {
// 全角文字
#byte = 2;
}
if(#code == 0x0D) {
// 改行文字
// 改行手前で止まるはずなんだけど…
message "なにかおかしい@L" + str(lineno) + "C" + str(column);
endmacro;
}
// 「/*」コメント開始
if(#code == 0x2F) {
#plineno = lineno;
right;
if(unicode == 0x2A && lineno == #plineno) {
#commenting = 1;
right;
continue;
}
left;
}
// 「*/」コメント終了
if(#code == 0x2A) {
#plineno = lineno;
right;
if(unicode == 0x2F && lineno == #plineno) {
#commenting = 0;
right;
continue;
}
left;
}
if(#commenting) {
right;
continue;
}
#tchars = #tchars + 1;
#tbytes = #tbytes + #byte;
if(#code != 0x09 && #code != 0x20 && #code != 0x3000) {
// 水平タブ(0x09)、半角空白(0x20)、全角空白(0x3000)のいずれでもない
#schars = #schars + 1;
#sbytes = #sbytes + #byte;
if(#code != 0x3001 && #code != 0x3002) {
// 読点(0x3001)でも句点(0x3002)でもない
#jchars = #jchars + 1;
#jbytes = #jbytes + #byte;
}
}
right;
}
// if 選択範囲の最後じゃなくて行末だったら
if((!(#endline <= lineno && #endcol <= column)) && (column == linelen2)) {
#lines = #lines + 1;
}
#plineno = lineno;
moveto2 0, lineno + 1;
// もし文章の最終行だった(これ以上下に移動できなかった)場合は終了
if(lineno == #plineno) {
break;
}
}
moveto2 #oc, #ol;
enabledraw;
$msg = "【" + $modestr + "】\n";
if(0) {
$msg = $msg + "文字数: " + str(#jchars) + "\n";
$msg = $msg + "文字数(+句読点): " + str(#schars) + "\n";
$msg = $msg + "文字数(+空白): " + str(#tchars) + "\n";
$msg = $msg + "文字数(+改行): " + str(#tchars + #lines) + "\n";
$msg = $msg + "\n";
$msg = $msg + "全角換算文字数: " + str(#jbytes / 2) + "\n";
$msg = $msg + "全角換算文字数(+句読点): " + str(#sbytes / 2) + "\n";
$msg = $msg + "全角換算文字数(+空白): " + str(#tbytes / 2) + "\n";
$msg = $msg + "全角換算文字数(+改行): " + str(#tbytes / 2 + #lines) + "\n";
$msg = $msg + "\n";
$msg = $msg + "おおよそのバイト数: " + str(#jbytes) + "\n";
$msg = $msg + "おおよそのバイト数(+句読点): " + str(#sbytes) + "\n";
$msg = $msg + "おおよそのバイト数(+空白): " + str(#tbytes) + "\n";
$msg = $msg + "おおよそのバイト数(+改行): " + str(#tbytes + #lines * 2) + "\n"; // *2 = CRLF
} else {
$msg = $msg + "\t" + "文字\t" + "全角換算\t" + "おおよそのバイト数\n";
$msg = $msg + "文字数\t" + str(#jchars) + "\t" + str(#jbytes / 2) + "\t"+str(#jbytes) + "\n";
$msg = $msg + "+句読点\t" + str(#schars) + "\t" + str(#sbytes / 2) + "\t"+str(#sbytes) + "\n";
$msg = $msg + "+空白\t" + str(#tchars) + "\t" + str(#tbytes / 2) + "\t"+str(#tbytes) + "\n";
$msg = $msg + "+改行\t" + str(#tchars + #lines) + "\t" + str(#tbytes / 2 + #lines) + "\t"+str(#tbytes + #lines * 2 ) + "\n"; // *2 = CRLF
}
$msg = $msg + "\n";
$msg = $msg + "行数: " + str(#lines) + "\n";
if(#breaked) {
$msg = $msg + "\n";
$msg = $msg + "(文字数計算は中断目印により途中で中断されています。)\n";
}
message $msg;
endmacro;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment