是否有用于代码注释的全自动填充段落模式?


18

我正在寻找一种次要模式,以便在键入时始终保持段落填充(类似于aggressive-indent-mode缩进)。它还需要足够聪明以仅填充注释(可能取决于语言,也可以填充字符串)。

我尝试过的一些事情是:

  • auto-fill-mode 在键入新段落时自动填充,但在编辑段落时不会自动填充。

  • refill-mode 确实会不断地重新填充段落,但是会尝试将代码包装到段落和注释中。

  • 我尝试添加fill-paragraphafter-change-functions钩子中,但是它会破坏撤消操作和其他很多事情(这可能都是可修复的,但需要一些努力)。

还有更好的主意吗?


6
另外:Glickstein的《编写GNU Emacs扩展》的第7章介绍了如何实现所追求的功能。可能是与elisp学习/练习的绝好机会。

我正在查看中的自动填充段落(启用了自动填充)org-mode,但您可以尝试rebox2
CodyChan 2015年

Answers:


4

我想出了一种实现此功能的最小方法:只需将空格键也绑定到call即可(fill-paragraph)

(defun fill-then-insert-space ()
  (interactive)
  (fill-paragraph)
  (insert " "))
(global-set-key (kbd "SPC") #'fill-then-insert-space)

到目前为止,我偶然发现了一些警告:

  1. elisp-mode(可能是其他人)在您调用时进行了一些精美的代码填充fill-paragraph,这可能是您想要的,也可能不是。可以通过测试point是否在注释或文档字符串中来解决问题,但是我不确定该怎么做。

  2. 有时您不能轻易输入多个空格(因为这会fill-paragraph杀死任何结尾的空格)。由于空格键现在的行为就像just-one-space可以用替换该绑定一样(insert " ")

我做了一个次要模式,其中包含此功能,可以在github或melpa包中找到aggressive-fill-paragraph


我发现具有讽刺意味的aggressive-fill-paragraphrefill-mode,它的攻击性远不及,甚至在> 没有重新填充模式重新排列内容的情况下甚至无法引用某人:即使您使用正则表达式进行替换,它也是如此
Hi-Angel

1

如果你喜欢怎么充值模式的行为(我不:P),但不能它的行为,它应该通过抑制它,只要你在正确的条件不是比较容易修复

例如

(defvar plop/refill-enabler-function nil)

(defun plop/region-in-comment (beg end)
  ;; should really be comment-only-p, but that seems really broken for me
  (not
   (loop for c from beg to end
      if (not (eq 'font-lock-comment-face (get-char-property c 'face)))
      return t)))

(defun plop/refill-after-change-function (beg end len)
  (unless undo-in-progress
    (when (and plop/refill-enabler-function
               (funcall plop/refill-enabler-function beg end))
      (setq refill-doit end))))

(defun plop/install-refill-hack ()
  (if refill-mode
      (progn
        (add-hook 'after-change-functions 'plop/refill-after-change-function nil t)
        (remove-hook 'after-change-functions 'refill-after-change-function t))
    (progn
      (remove-hook 'after-change-functions 'plop/refill-after-change-function t))))

(defun plop/refill-hook ()
  (set (make-local-variable 'plop/refill-enabler-function)
       #'plop/region-in-comment)
  (add-hook 'refill-mode-hook 'plop/install-refill-hack t t)
  (refill-mode))

(add-hook 'some-hook 'plop/refill-hook)

基本上,它会删除触发重新填充的功能,after-change-functions并将其替换为一个函数,该函数会在执行完全相同的操作之前另外检查我们是否在评论中。


看起来是一个不错的开始,但仍然不太正确:如果在编辑注释时触发重新填充,则会重新填充整个段落,包括周围的代码。这可能是周围模式无法正确定义段落限制的错误,但我对此表示怀疑:我尝试在Emacs Lisp模式下尝试,我认为本书会做这些事情。
吉尔(Gilles)'所以

好吧,这就是为什么我说我不喜欢refill-mode:)问题是refill-mode使用fill-region而不是fill-paragraph,从而失去了荣誉感fill-paragraph-function并使事情变得混乱的能力
Sigma
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.