如果在轮廓标题“**”之前没有空行,则插入一个空行

时间:2013-07-03 15:27:39

标签: emacs lisp elisp

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

轮廓可能是几层深,没有办法准确预测轮廓截面的结尾,所以我们需要只关注标题开头的模式来定义函数 - 例如,如果仅\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))))

2 个答案:

答案 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)))

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