リージョン内の行数と文字数をモードラインに表示する(範囲指定している時だけ)

  • 「○○文字以内のきりのいい長さで文字列をコピーして別のところにペーストしたい」みたいなことがよくある
  • 文字数・行数をカウントするコマンド count-lines-region はあるが、カーソルを移動させて M-=、カーソルを移動させて M-=、 ... の繰り返しになってしまい、めんどくさい
  • カーソル移動に合わせて自動的に表示が更新されるようになってると楽でいい
  • リージョン選択していない時は表示しなくていい
(defun count-lines-and-chars ()
  (if mark-active
      (format "%d lines,%d chars "
              (count-lines (region-beginning) (region-end))
              (- (region-end) (region-beginning)))
      ;;(count-lines-region (region-beginning) (region-end)) ;; これだとエコーエリアがチラつく
    ""))

(add-to-list 'default-mode-line-format
             '(:eval (count-lines-and-chars)))

こんな風に表示されます:
2011-02-24 23:19:04

備考

  • 改行も 1文字としてカウントされる
  • mode-line-format はバッファローカル変数なのですべてのバッファで有効にするために set-default を……と思ったが、調べてたら default-mode-line-format というのが見つかって、せっかくなのでそっちを使った