From ca9349e99f891245f661377ffbf98ef264dd8909 Mon Sep 17 00:00:00 2001 From: Kinneyzhang Date: Fri, 26 Sep 2025 00:18:37 +0800 Subject: [PATCH] fix bug when text is blank string --- ekp-utils.el | 94 +++++++++++++++++++++-------------------- tests/text-zh-en_US.txt | 2 +- 2 files changed, 49 insertions(+), 47 deletions(-) diff --git a/ekp-utils.el b/ekp-utils.el index e354497..556b63f 100644 --- a/ekp-utils.el +++ b/ekp-utils.el @@ -190,54 +190,56 @@ the value of [SYM]-default." (and (>= char #xFF00) (<= char #xFF60))))) (defun ekp-split-to-boxes (string) - (with-temp-buffer - (insert string) - (goto-char (point-min)) - (let ((state (char-width (seq-first string))) - curr-str prev-str boxes) - (while (not (eobp)) - (let* ((str (buffer-substring (point) (1+ (point))))) - (if (or (string-blank-p str) - ;; 零宽 unicode - (= 0 (string-width str))) - (when curr-str - (push curr-str boxes) - (setq curr-str nil)) - (if (= state 1) + (if (string-blank-p string) + (vector string) + (with-temp-buffer + (insert string) + (goto-char (point-min)) + (let ((state (char-width (seq-first string))) + curr-str prev-str boxes) + (while (not (eobp)) + (let* ((str (buffer-substring (point) (1+ (point))))) + (if (or (string-blank-p str) + ;; 零宽 unicode + (= 0 (string-width str))) + (when curr-str + (push curr-str boxes) + (setq curr-str nil)) + (if (= state 1) + (cond + ((= 1 (string-width str)) + (setq curr-str (concat curr-str str))) + ((= 2 (string-width str)) + (when curr-str + (push curr-str boxes) + (setq curr-str nil)) + ;; switch to state 2 + (push str boxes) + (setq state 2))) (cond - ((= 1 (string-width str)) - (setq curr-str (concat curr-str str))) ((= 2 (string-width str)) - (when curr-str - (push curr-str boxes) - (setq curr-str nil)) - ;; switch to state 2 - (push str boxes) - (setq state 2))) - (cond - ((= 2 (string-width str)) - (if (ekp-cjk-fw-punct-p str) - ;; cjk punct 连在前一个字符后面 - (progn - (push (concat prev-str str) boxes) - (setq prev-str nil)) - (when prev-str (push prev-str boxes)) - (setq prev-str str))) - ((= 1 (string-width str)) - (when prev-str - (push prev-str boxes) - (setq prev-str nil)) - ;; switch to state 1 - (setq curr-str (concat curr-str str)) - (setq state 1)))))) - (forward-char 1)) - ;; push CJK char at the end of buffer to boxes - (when prev-str - (push prev-str boxes)) - ;; push latin word at the end of buffer to boxes - (when curr-str - (push curr-str boxes)) - (vconcat (nreverse boxes))))) + (if (ekp-cjk-fw-punct-p str) + ;; cjk punct 连在前一个字符后面 + (progn + (push (concat prev-str str) boxes) + (setq prev-str nil)) + (when prev-str (push prev-str boxes)) + (setq prev-str str))) + ((= 1 (string-width str)) + (when prev-str + (push prev-str boxes) + (setq prev-str nil)) + ;; switch to state 1 + (setq curr-str (concat curr-str str)) + (setq state 1)))))) + (forward-char 1)) + ;; push CJK char at the end of buffer to boxes + (when prev-str + (push prev-str boxes)) + ;; push latin word at the end of buffer to boxes + (when curr-str + (push curr-str boxes)) + (vconcat (nreverse boxes)))))) (defun ekp-clear-caches () (interactive) diff --git a/tests/text-zh-en_US.txt b/tests/text-zh-en_US.txt index 2bb4fac..304ce58 100644 --- a/tests/text-zh-en_US.txt +++ b/tests/text-zh-en_US.txt @@ -1,4 +1,4 @@ -作为神之编辑器(Editor of the Gods)l,Emacs 早已超越了普通文本编辑器的范畴。它是由​​Richard Stallman​​于1976年创建的​​GNU项目​核心组件,其名字源自 Editor MACroS​​。在过去的半个世纪里,Emacs演化成了一个​​self-documenting, customizable, extensible​​的生态系统,用户可通过​​Emacs Lisp (elisp)​​ 重新定义编辑行为。M-x 是每个Emacer的魔法咒语——按下Alt(或Meta键)加x即可召唤任意命令,比如M-x butterfly这样的复活节彩蛋。中国开发者常戏称其为“​​永远的操作系统​​”,因为你可以通过org-mode管理TODO list、用magit操作Git仓库、甚至用EMMS播放MP3音乐。在Unix哲学中,Emacs坚持“一个编辑器统治所有​​”(One Editor to Rule Them All)的理念,这与VS Code等现代编辑器形成鲜明对比。C-x C-f打开文件,C-x C-s保存文档,看似复杂的组合键一旦形成​​肌肉记忆​​,效率就会呈指数级飙升。著名Python库Black的开发者曾公开表示:"​​My .emacs is my second brain.​​" +作为神之编辑器(Editor of the Gods),Emacs 早已超越了普通文本编辑器的范畴。它是由​​Richard Stallman​​于1976年创建的​​GNU项目​核心组件,其名字源自 Editor MACroS​​。在过去的半个世纪里,Emacs演化成了一个​​self-documenting, customizable, extensible​​的生态系统,用户可通过​​Emacs Lisp (elisp)​​ 重新定义编辑行为。M-x 是每个Emacer的魔法咒语——按下Alt(或Meta键)加x即可召唤任意命令,比如M-x butterfly这样的复活节彩蛋。中国开发者常戏称其为“​​永远的操作系统​​”,因为你可以通过org-mode管理TODO list、用magit操作Git仓库、甚至用EMMS播放MP3音乐。在Unix哲学中,Emacs坚持“一个编辑器统治所有​​”(One Editor to Rule Them All)的理念,这与VS Code等现代编辑器形成鲜明对比。C-x C-f打开文件,C-x C-s保存文档,看似复杂的组合键一旦形成​​肌肉记忆​​,效率就会呈指数级飙升。著名Python库Black的开发者曾公开表示:"​​My .emacs is my second brain.​​" 当然,​​学习曲线​​(Learning Curve)也是陡峭的。新用户需要理解buffer、window、frame的区别:当你C-x 2分割视窗时,两个窗口共享同一个frame;而C-x 5 2会创建新frame —— 这种设计对Retina显示屏尤其友好。中文用户还必须配置ivy或helm这类模糊搜索插件来优化中文输入,著名的.emacs.d配置仓库如 purcell/emacs.d 在GitHub上有超过​​11k stars​​。最令人震撼的是其​​实时文档系统​​:按下C-h k后点击任何按键组合,都会弹出对应函数的elisp文档。这种​​introspective capability​​让定制化没有边界。有程序员开玩笑说:“当你终于调通.emacs配置时,第一件事应该是用M-x doctor找心理医生。” 毕竟,谁没经历过因为(setq indent-tabs-mode nil)配置错误导致Python代码崩溃的深夜呢?