1

有人可以帮我进一步定义我的组织大纲清理功能。我希望在以 开头的每个大纲标题之间有一个空行**,同时考虑到这两种可能性——即,可能没有空行(这意味着我们需要插入一个);并且,可能有太多的空行(这意味着我们需要删除多余的行)。没有空行(我们需要插入一个)的情况是函数中缺少的。

大纲可能有好几级深,没有办法准确预测大纲部分的结尾会是什么,所以我们只需要关注标题开头的模式来定义功能——例如,如果只有\n[*][*], 但不是\n\n[*][*], 然后插入\n.

(defun lawlist-cleanup ()
  "If there are no blank lines preceding an outline heading `**`, then insert one
blank line.  If there are more than one blank line, then delete the extras."
  (interactive)
  (beginning-of-buffer)
  (save-excursion
    (while (re-search-forward "\n\n\n[*][*]" nil t)
      (left-char 3)
      (delete-blank-lines))))

编辑:这是基于 juanleon 和 Bruce Connor 提供的慷慨帮助的更新功能。它处理第一级和第二级标题的情况,第一级标题有一个额外的空白行。

(defun lawlist-cleanup-second-draft ()
  (interactive)
  (save-excursion 
    (replace-regexp "\n+\\*\\* " "\n\n** " nil (point-min) (point-max))
    (replace-regexp "\n+\\* " "\n\n\n* " nil (point-min) (point-max))))
4

2 回答 2

2

使用的问题delete-blank-lines在于它的行为取决于点周围的空白行数。这是解决问题的一种非常不优雅的方法:

(save-excursion
  (beginning-of-buffer)
  (while (re-search-forward "^[*][*]" nil t)
    (forward-line 0)
    (newline)
    (forward-line -1)
    (delete-blank-lines)
    (delete-blank-lines)
    (newline)
    (forward-line 1))))

它有点伤害我的眼睛,它看起来更像是一个宏而不是一个函数,但我认为它可以完成这项工作。

于 2013-07-03T15:59:20.200 回答
1

我认为@juanleon 的答案没有任何问题,但这是另一种应该有效的方法(只是为了展示正则表达式的力量:-D)。

(save-excursion 
 (replace-regexp "[ 
]+\\*\\* " "\n\n** " nil (point-min) (point-max)))

注意:这是方括号内的空格和换行符。

于 2013-07-03T20:01:57.427 回答