一个给法律条款文本前加两个全角空格的 Emacs 函数

From 清冽之泉
Jump to navigation Jump to search
;;; insert-quan: 从当前行(行首)到 buffer 末尾,在需处理的行前插入两个全角空格(U+3000)。
(defun insert-quan ()
  "从当前行(行首)到 buffer 末尾的每一行前插入两个全角空格(U+3000)。
跳过空白行、以 '='(在可选前导空白之后)开头的行,以及已以全角空格开头的行。"
  (interactive)
  (let* ((beg (line-beginning-position))
         (end (point-max))
         (end-marker (copy-marker end))
         (ideograph-space (char-to-string #x3000))
         (count 0))
    (save-excursion
      (goto-char beg)
      (while (< (point) end-marker)
        (let* ((line-beg (line-beginning-position))
               (line-end (line-end-position))
               (line (buffer-substring-no-properties line-beg line-end)))
          (unless (or
                   ;; 空白行(只含空白字符)
                   (string-match-p "\\`[[:space:]]*\\'" line)
                   ;; 第一非空字符是 '=' (允许行首有空格/tabs)
                   (string-match-p "\\`[[:space:]]*=" line)
                   ;; 已经以全角空格开头(避免重复插入)
                   (string-prefix-p ideograph-space line))
            (goto-char line-beg)
            (insert-char #x3000 2)
            (setq count (1+ count))))
        (forward-line 1)))
    (message "insert-quan: 已处理并插入 %d 行(从当前行到 buffer 末尾)。" count)))