fix bug when text is blank string
This commit is contained in:
parent
820e73920a
commit
ca9349e99f
94
ekp-utils.el
94
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)
|
||||
|
||||
@ -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代码崩溃的深夜呢?
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user