有人可以帮助我进一步定义我的组织大纲清理功能。我希望在每个大纲标题之间有一个以**
开头的空白行,同时考虑到两种可能性 - 即,可能没有空白行(这意味着我们需要插入一行);并且,可能有太多空行(这意味着我们需要删除额外的空行)。没有空行的情况(我们需要插入一行)是函数中缺少的。
轮廓可能是几层深,没有办法准确预测轮廓截面的结尾,所以我们需要只关注标题开头的模式来定义函数 - 例如,如果仅\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))))
答案 0 :(得分: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))))
它会让我的眼睛受到一点伤害,它看起来更像是一个宏而不是一个功能,但我认为它能起到作用。
答案 1 :(得分:1)
我认为@juanleon回答并没有错,但这是另一种应该起作用的方法(只是为了展示正则表达式的强大功能:-D)。
(save-excursion
(replace-regexp "[
]+\\*\\* " "\n\n** " nil (point-min) (point-max)))
注意:这是方括号内的空格和换行符。