Last active
December 23, 2015 01:39
-
-
Save murachue/6561673 to your computer and use it in GitHub Desktop.
文字数かぞえる秀丸マクロ
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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