fix bug when text is blank string

This commit is contained in:
Kinneyzhang 2025-09-26 00:18:37 +08:00
parent 820e73920a
commit ca9349e99f
2 changed files with 49 additions and 47 deletions

View File

@ -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)

View File

@ -1,4 +1,4 @@
作为神之编辑器Editor of the GodslEmacs 早已超越了普通文本编辑器的范畴。它是由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 GodsEmacs 早已超越了普通文本编辑器的范畴。它是由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代码崩溃的深夜呢