UP | HOME

emacs-在nano-modeline右下角添加当前buffer中英文字数统计

[2024-10-15 周二 14:41]

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. 覆盖右下角数据(新)

[2024-10-17 周四 17:40]:观察到在大中文字符的情况下(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数值。

▲ 编辑于 [2024-10-28 周一 16:28] | © Published by Emacs 31.0.50 (Org mode 9.7.16) on [2024-11-21 周四 00:22] | RSS