わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

リージョン内の行数・単語数・文字数をモードラインに表示する

2012年になりました.今年もよろしくお願いいたします.4月からうえの子が幼稚園に入り,ほどなく第四子*1が家族の一員になる予定です.仕事面では,研究会の世話役,国際会議(JCKBSE 2012)のプログラム委員があります.お金も時間もとられることになりますが,教育も研究もブログも,レベルを落とさずやっていきたいと思います.
【Emacs】 リージョン内の行数と文字数をモードラインに表示する: 日々此精進と,かつて書いたcount-lines-regionに語数カウント機能をつけるを組み合わせて,リージョン選択をしているときに限り,「[?L?w?c]」のフォーマットで,行数・単語数・文字数をモードラインに表示させることにしました.

(defun count-lines-and-chars ()
  (if mark-active
      (format "[%dL%dw%dc]"
              (count-lines (region-beginning) (region-end))
              (how-many "[^ 	
]+" (region-beginning) (region-end))
;              (how-many "\\w+" (region-beginning) (region-end))
              (- (region-end) (region-beginning)))
    ""))
(add-to-list 'default-mode-line-format
             '(:eval (count-lines-and-chars)))

注意することがあります.「[^」の直後に,半角空白と,Tabのコードが入っています.TabはC-q C-iで入力できる文字で,これによって,領域内で/[^ \t\n]+/とマッチする文字列の数を単語数とします.もしうまく動かなければ,コメントなしの「(how-many」から始まる2行の先頭にセミコロンを入れ,直後の行のセミコロンを取り除いてください*2
NTEmacsで動作を確認しました.上記コードを選択したときの表示は,次のようになります.

これはもう,過去に書いたtm-count-lines-regionがいらなくなったように思います*3

*1:男女どちらか分からず,まだ名前も決めていませんが,当雑記では「すえの子」と書く予定なことだけは決めています.

*2:この場合,「()」など,前後に空白文字があるけれども\w+でマッチしないものは単語扱いとしません.まあ実用としては,英文の単語数を知りたいときに使うので,「()」は無視していいのですけど.

*3:wcコマンドとの使い分けは,必要でしょう.「文字数」ではなく「バイト数」が必要なときもありますから.