ステータスバーの表示についてNo.24211
むら さん 07/12/22 12:11
 
はじめまして、以前より秀丸エディタを愛用しているものです。
とても使いやすいエディタで重宝しています。

「ステータスバーの表示」について、幾つか要望があります。

1.「全体の文字数(おおよそ)」の表示で全角1文字を基準にカウントして欲しい
です(半角なら0.5文字、UNICODEの特殊文字なら2文字という風に)。現状のカウン
ト方法と、このカウント方法で選べるようになっていればより良いかと思います。欲
を言えば、全角○文字、半角×文字というふうに個別に文字数が出てくれば最高です。

2.「全体の文字数(おおよそ)」のカウントで、改行も1文字に数えられるので除
外するようにはできないでしょうか? 文字数のカウント対象から除外する文字(空
白、タブなど)を選べれば良いと思います。

3.「全体のページ数」「範囲選択のページ数」をステータスバーの表示に追加でき
ないでしょうか? できれば「ファイルタイプ別の設定」とは別個にページカウント
の値を持てればなお良いです(何をしたいかと言うと、普段はウィンドウ幅一杯の設
定で文章を書きつつ、ステータスバーで原稿用紙何枚分を書いたかを確認したいので
す)

上記について、マクロでなんとか数えられないかとかんばってみたのですが、文字数
が50000字くらいになると、処理時間的に耐えられないものになってしまいました…。

複数の質問ですが、ステータスバーの表示関連という事で一つの記事に纏めました。
益体のなさそうな要望で恐縮ですが、ご検討いただければ幸いです。

質問の不明点、不適切な点等ありましたらご指摘ください。

[ ]
RE:24211 ステータスバーの表示についてNo.24212
izza さん 07/12/22 12:35
 
>上記について、マクロでなんとか数えられないかとかんばってみたのですが、文字
>数が50000字くらいになると、処理時間的に耐えられないものになってしまいました
>…。

1ユーザーです。マクロライブラリーにdllを使った文字数カウントマクロがありま
す。とても早いので、試してみてはどうでしょうか。

[ ]
RE:24211 ステータスバーの表示についてNo.24213
IKKI さん 07/12/22 13:41
 
ユーザーの IKKI です。こんにちは。

> 上記について、マクロでなんとか数えられないかとかんばってみたのですが、文字数
> が50000字くらいになると、処理時間的に耐えられないものになってしまいました…。

この部分にだけ反応します。
末尾のマクロで約10万字/845行を0.5秒でカウントできました。
ご参考までに。

[仕様]
 ・文書全体をカウントする
 ・半角/全角/Unicode特殊文字は区別しない
 ・改行コードはカウントしない
 ・行頭から続くタブ/半角空白/全角空白はカウントしない

[測定条件]
 ・Celeron 2.4GHz
 ・Windows XP
 ・秀丸エディタ v7.07
 ・対象文書 http://www.aozora.gr.jp/cards/000006/card3310.html

#page = 400; // 1ページあたりの文字数
#orgx = x;
#orgy = y;
#st = tickcount;
#bytes = 0;
disabledraw;
gofiletop;
while (true) {
 while (code == '\t' || code == ' ' || code == ' ') right;
 #bytes = #bytes + linelen - x;
 golinetop;
 down;
 if (!result) break;
}
moveto #orgx, #orgy;
enabledraw;
$msg = "全角 " + str(#bytes / 2) + " 字";
$msg = $msg + "\n" + str(#bytes / #page / 2 + 1) + " ページ";
$msg = $msg + "\n" + str(tickcount - #st) + " ミリ秒";
message $msg;







[ ]
RE:24212 ステータスバーの表示についてNo.24214
むら さん 07/12/22 19:13
 
>izzaさん
>1ユーザーです。マクロライブラリーにdllを使った文字数カウントマクロがありま
>す。とても早いので、試してみてはどうでしょうか。

ご回答ありがとうございます。
探してみて試してみたいと思います。

[ ]
RE:24213 ステータスバーの表示についてNo.24215
むら さん 07/12/22 19:14
 
>IKKIさん
>> 上記について、マクロでなんとか数えられないかとかんばってみたのですが、文字数
>> が50000字くらいになると、処理時間的に耐えられないものになってしまいました
>…。
>
>この部分にだけ反応します。
>末尾のマクロで約10万字/845行を0.5秒でカウントできました。
>ご参考までに。

コードまで提示して頂き、ありがとうございます。
確かにこのコードだと、私の環境でも1秒も掛からずにカウントできました。

ご提示いただいたコードでは、ページのカウント方法が私のイメージしている内容と
は少し異なる(私のイメージでは、原稿用紙換算とすると、改行20回で1ページと
なる)ため、その点を少し考えてみたいと思います。

ちなみに、私が使っていたマクロは次のような感じです(ミキミッキー様の「選択文
字数カウントマクロ Ver.1.04」を参考にしています)。


#line_chars_max[0] = 38;
#lines_per_page[0] = 16;
#line_chars[0] = 0;
#line_nums[0] = 0;

#line_chars_max[1] = 20;
#lines_per_page[1] = 20;
#line_chars[1] = 0;
#line_nums[1] = 0;

#count = 0;  // 文字数
#bytes = 0;  // バイト数
#lines = 0;  // 改行数

#st = tickcount;

if (rectselecting) {
 // 矩形選択
 message "矩形選択時に文字数カウントは行なえません。";
 endmacro;
} else if (selecting) {
 // 選択範囲
 $count_type = "【選択範囲】";
 #x = seltopx;
 #y = seltopy;
 #endy = selendy;
} else {
 // 文書全体
 $count_type = "【文書全体】";
 #x = 0;
 #y = 0;
 #endy = linecount;
}

// 文書全体
while (true) {
 ##a = ascii(gettext(#x, #y, #x + 1, #y, 1));

 if (##a > 0xFF) {
  // 全角
  #x = #x + 2;
  #count = #count + 1;
  #bytes = #bytes + 2;

  #line_chars[0] = #line_chars[0] + 1;
  #line_chars[1] = #line_chars[1] + 1;

 } else if (##a == 0) {
  // 改行?
  if (#x != width) {
   // 折り返しでない本当の改行のみカウント
   #lines = #lines + 1;
   #line_nums[0] = #line_nums[0] + 1;
   #line_nums[1] = #line_nums[1] + 1;
   #line_chars[0] = 0;
   #line_chars[1] = 0;
  }
  #x = 0;
  #y = #y + 1;
 } else if (##a == 0x09) {
  // タブ
  #x = #x + tabcount - (#x % tabcount);
 } else {
  // 半角
  #x = #x + 1;
 }

 // 指定文字数に達したら改行+1
 if (#line_chars[0] > #line_chars_max[0]) {
  #line_nums[0] = #line_nums[0] + 1;
  #line_chars[0] = 0;
 }

 if (#line_chars[1] > #line_chars_max[1]) {
  #line_nums[1] = #line_nums[1] + 1;
  #line_chars[1] = 0;
 }

 if(#y >= #endy) {
  if (#y >= linecount) {
   // EOF をカウントしてしまうためデクリメント
   #lines = #lines - 1;
   #line_nums[0] = #line_nums[0] - 1;
   #line_nums[1] = #line_nums[1] - 1;
  }
  break;
 }

}

message $count_type + "\n" +
 "文字数:" + str(#count) + "文字  " +
 "Byte数:" + str(#bytes) + "Byte  " +
 "改行数:" + str(#lines) + "行\n" +
 "\n" +
 str(#line_chars_max[0]) + "文字 × " + str(#lines_per_page[0]) + "行 換算で
 " +
 str(#line_nums[0] / #lines_per_page[0] + 1) + "ページ(" + str(#line_nums
[0]) + "行)" +
 "空白率:" + str(100 - (100 * #count / #line_chars_max[0] / #line_nums[0]))
 + "%\n" +

 str(#line_chars_max[1]) + "文字 × " + str(#lines_per_page[1]) + "行 換算で
 " +
 str(#line_nums[1] / #lines_per_page[1] + 1) + "ページ(" + str(#line_nums
[1]) + "行)" +
 "空白率:" + str(100 - (100 * #count / #line_chars_max[1] / #line_nums[1]))
 + "%\n" +
 "時間:"str(tickcount - #st) + " ミリ秒";
endmacro;

[ ]
RE:24215 ステータスバーの表示についてNo.24219
IKKI さん 07/12/23 01:28
 
IKKI です。
ステータスバーの話題だったはずが長々と脱線してすみません。

> ちなみに、私が使っていたマクロは次のような感じです(ミキミッキー様の「選択文
> 字数カウントマクロ Ver.1.04」を参考にしています)。

仕様は下記のような感じでしょうか?
文書の大部分が全角文字の連続であると仮定して、マクロを直してみました。
サンプルはさっきと同じ↓です。
http://www.aozora.gr.jp/cards/000006/files/3310_ruby_8278.zip

[仕様]
 ・範囲選択時は範囲頭のカーソル位置から範囲末の行末までカウントする
 ・非選択時は文書全体をカウントする
 ・全角文字のみカウントする(全角空白もカウントする)
 ・半角文字はカウントしない(タブ、改行もカウントしない)

[実行結果]
 文字数:101946文字  Byte数:203892Byte  改行数:845行
 38文字 × 16行 換算で191ページ(3044行)空白率:12%
 20文字 × 20行 換算で273ページ(5443行)空白率:7%
 時間:1219 ミリ秒

#line_chars_max[0] = 38;
#lines_per_page[0] = 16;
#line_chars_max[1] = 20;
#lines_per_page[1] = 20;
#lines = 0;
#count = 0;
#line_nums[0] = 0;
#line_nums[1] = 0;
#st = tickcount;
disabledraw;
if (rectselecting) {
 message "矩形選択時に文字数カウントは行なえません。";
 endmacro;
} else if (!selecting) {
 selectall;
}
setcompatiblemode 0x0200;
#endy = selendy - (selendcolumn == 0);
moveto seltopx, seltopy;
escape;
searchdown2 "[ -K]+|$", regular;
while (result && y <= #endy) {
 if (code != '\r') {
  #line_chars = #line_chars + (selendcolumn - seltopcolumn) / 2;
  moveto selendx, selendy;
 } else {
  #lines = #lines + 1;
  #count = #count + #line_chars;
  #line_nums[0] = #line_nums[0] + (#line_chars + #line_chars_max[0] - 1) / #
line_chars_max[0];
  #line_nums[1] = #line_nums[1] + (#line_chars + #line_chars_max[1] - 1) / #
line_chars_max[1];
  #line_chars = 0;
  movetolineno 1, lineno + 1;
 }
 finddown2;
}
escape;
#bytes = #count * 2;
setcompatiblemode 0x0000;
enabledraw;
message $count_type + "\n" +
 "文字数:" + str(#count) + "文字  " +
 "Byte数:" + str(#bytes) + "Byte  " +
 "改行数:" + str(#lines) + "行\n" +
 "\n" +
 str(#line_chars_max[0]) + "文字 × " + str(#lines_per_page[0]) + "行 換算で" +
 str(#line_nums[0] / #lines_per_page[0] + 1) + "ページ(" + str(#line_nums
[0]) + "行)" +
 "空白率:" + str(100 - (100 * #count / #line_chars_max[0] / #line_nums[0]))
 + "%\n" +
 str(#line_chars_max[1]) + "文字 × " + str(#lines_per_page[1]) + "行 換算で" +
 str(#line_nums[1] / #lines_per_page[1] + 1) + "ページ(" + str(#line_nums
[1]) + "行)" +
 "空白率:" + str(100 - (100 * #count / #line_chars_max[1] / #line_nums[1]))
 + "%\n" +
 "時間:" + str(tickcount - #st) + " ミリ秒";

[ ]
RE:24219 ステータスバーの表示についてNo.24220
IKKI さん 07/12/23 01:55
 
IKKI です。たびたびすみません。

もし本当に半角文字がほとんど含まれないなら、さらに速い方法があります。
# 半角文字がアンドゥバッファの量を超えると戻せなくなりますが。

[仕様]
 ・範囲選択時は範囲頭の論理行頭から範囲末の論理行末までカウントする
 ・非選択時は文書全体をカウントする
 ・全角文字のみカウントする(全角空白もカウントする)
 ・半角文字はカウントしない(タブ、改行もカウントしない)

[実行結果]
 文字数:101946文字  Byte数:203892Byte  改行数:845行
 38文字 × 16行 換算で191ページ(3044行)空白率:12%
 20文字 × 20行 換算で273ページ(5443行)空白率:7%
 時間:422 ミリ秒

#line_chars_max[0] = 38;
#lines_per_page[0] = 16;
#line_chars_max[1] = 20;
#lines_per_page[1] = 20;
#lines = 0;
#count = 0;
#line_nums[0] = 0;
#line_nums[1] = 0;
#st = tickcount;
disabledraw;
if (rectselecting) {
 message "矩形選択時に文字数カウントは行なえません。";
 endmacro;
} else if (!selecting) {
 selectall;
}
#endl = selendlineno - (selendcolumn == 0);
begingroupundo;
replaceallfast "[\t -~]+", "", regular, inselect;
endgroupundo;
movetolineno 1, seltoplineno;
escape;
while (lineno <= #endl) {
 #lines = #lines + 1;
 #count = #count + linelen2 / 2;
 #line_nums[0] = #line_nums[0] + (linelen2 / 2 + #line_chars_max[0] - 1) / #
line_chars_max[0];
 #line_nums[1] = #line_nums[1] + (linelen2 / 2 + #line_chars_max[1] - 1) / #
line_chars_max[1];
 movetolineno 1, lineno + 1;
}
#bytes = #count * 2;
undo;
escapeinselect;
enabledraw;
message $count_type + "\n" +
 "文字数:" + str(#count) + "文字  " +
 "Byte数:" + str(#bytes) + "Byte  " +
 "改行数:" + str(#lines) + "行\n" +
 "\n" +
 str(#line_chars_max[0]) + "文字 × " + str(#lines_per_page[0]) + "行 換算で" +
 str(#line_nums[0] / #lines_per_page[0] + 1) + "ページ(" + str(#line_nums
[0]) + "行)" +
 "空白率:" + str(100 - (100 * #count / #line_chars_max[0] / #line_nums[0]))
 + "%\n" +
 str(#line_chars_max[1]) + "文字 × " + str(#lines_per_page[1]) + "行 換算で" +
 str(#line_nums[1] / #lines_per_page[1] + 1) + "ページ(" + str(#line_nums
[1]) + "行)" +
 "空白率:" + str(100 - (100 * #count / #line_chars_max[1] / #line_nums[1]))
 + "%\n" +
 "時間:" + str(tickcount - #st) + " ミリ秒";

[ ]
RE:24211 ステータスバーの表示についてNo.24222
秀丸担当 さん 07/12/25 10:01
 

>1.「全体の文字数(おおよそ)」の表示で全角1文字を基準にカウントして欲しい
>です(半角なら0.5文字、UNICODEの特殊文字なら2文字という風に)。現状のカウン
>ト方法と、このカウント方法で選べるようになっていればより良いかと思います。欲
>を言えば、全角○文字、半角×文字というふうに個別に文字数が出てくれば最高です。
>
>2.「全体の文字数(おおよそ)」のカウントで、改行も1文字に数えられるので除
>外するようにはできないでしょうか? 文字数のカウント対象から除外する文字(空
>白、タブなど)を選べれば良いと思います。

文字数は、正確なものができたほうがいいと思います。
今の表示は簡易的なものになっています。
正確なものということになると、現時点ではマクロを使ったほうがいいと思いま
す。

今は簡易的なものだから高速になっていますが、正確なものにするとサイズによ
って時間がかかるので、裏で計算するような非同期的な処理が必要になってきま
す。
アウトライン解析とか、折りたたみの+/-マークとか、単語補完とか、裏でやっ
ていますが、それと同じように裏でやるものが増えてややこしいことになります。
そういうネタということで参考にしたいと思います。


>3.「全体のページ数」「範囲選択のページ数」をステータスバーの表示に追加でき
>ないでしょうか? できれば「ファイルタイプ別の設定」とは別個にページカウント
>の値を持てればなお良いです(何をしたいかと言うと、普段はウィンドウ幅一杯の設
>定で文章を書きつつ、ステータスバーで原稿用紙何枚分を書いたかを確認したいので
>す)

[その他]→[ファイルタイプ別の設定]→[デザイン]→[表示]→[行番号表示]に
ページ番号表示というのがあって、これをONにしておくと行番号にページ番号が
付きます。
一定行数ごとに数えるだけなので役に立つかどうかはわかりませんが。

数え方は、[その他]→[ファイルタイプ別の設定]→[体裁]→[詳細]→[行番号の
計算方法]によって行番号の計算が違うので、ページ番号の数え方も変わります。
改行だけを数えるようにしておくと、折り返し文字数によってページ番号が変化
してしまうことはありません。

改行や折り返しは関係なくて文字数だけをカウントしたものを割ったようなペー
ジ数を数えることはできません。

実際にプリンタに出すときのページ数は、秀丸パブリッシャーをインストールし
て、プレビューを出して最終ページを表示させるとわかります。時間がかかりま
すが。

[ ]