emacs-在nano-modeline右下角添加当前buffer中英文字数统计
1. 加载第三方包
(require 'advance-words-count)
https://github.com/LdBeth/advance-words-count.el
这个包提供了CJK字符、英文单词及其他字符的统计功能。
2. 覆盖右下角数据(旧)
(defun nano-modeline-cursor-position (&optional format)
  "Cursor position using given FORMAT."
  (let ((format (or format "%l:%c ")))
    (propertize (format-mode-line '( (:eval (format "%s字" (+ (words-count (point-min) (point-max) words-count-rule-ansci) (words-count (point-min) (point-max) words-count-rule-CJK)))) "   "))
                'face (nano-modeline-face 'secondary))
    ))
其中 words-count-rule-ansci 统计英文字符; words-count-rule-CJK 统计CJK字符。
3. 覆盖右下角数据(新)
:观察到在大中文字符的情况下(6w+)存在滚动时的明显性能损失,采取以下方式迂回:
(defvar my/buffer-words 0
  "The number of characters in the current buffer.")
;;变成buffer-local变量,确保另一个buffer的modeline不会受到影响
(make-variable-buffer-local 'my/buffer-words)
(defun my/buffer-words-count ()
  "Return the number of characters in the current buffer."
  (setq my/buffer-words
        (+ (words-count (point-min) (point-max) words-count-rule-CJK)
           (words-count (point-min) (point-max) words-count-rule-ansci )))
  (force-mode-line-update))
;;窗口切换后
(add-hook 'window-configuration-change-hook 'my/buffer-words-count)
;; buffer调整后
(add-hook 'buffer-list-update-hook 'my/buffer-words-count)
;; 空闲时(针对scratch)
(run-with-idle-timer 2 t 'my/buffer-words-count)
(defun nano-modeline-cursor-position (&optional format)
  "Cursor position using given FORMAT."
  (let ((format (or format "%l:%c ")))
    ;; (propertize (format-mode-line '("  "))
    ;;             'face (nano-modeline-face 'secondary))
    (propertize (format-mode-line '((:eval (format "%s字" my/buffer-words
                                                   )) "   "))
                'face (nano-modeline-face 'secondary))
    ))
通过buffer-local的变量异步更新当前buffer数值。