3

在我的 .emacs 配置中,我有以下内容:

(defun fold-long-comment-lines ()
"This functions allows us to fold long comment lines
 automatically in programming modes. Quite handy."
 (auto-fill-mode 1)
 (set (make-local-variable 'fill-no-break-predicate)
     (lambda ()
         (not (eq (get-text-property (point) 'face)
                'font-lock-comment-face)))))

以上内容作为“c-mode-common-hook”的一部分被调用,并自动正确地提供折叠长注释行。

然而,上面的事情是不分青红皂白的,无论我是使用单行注释,例如描述结构字段,还是使用多行注释描述一些复杂的代码。

所以,基本问题是,只有当它是多行注释时,我怎样才能自动折叠长注释行?

谢谢阿努帕姆

编辑1:多行评论解释当我说“多行评论”时,它基本上意味着这样的评论:

/*
 * this following piece of code does something totally funky with client
 * state, but it is ok.
*/
code follows

相应地,单行注释将是这样的

struct foo {
   char buf_state : 3; // client protocol state 
   char buf_value : 5; // some value
}

上面的 elisp 代码,尽职尽责地折叠了这两个注释行。我只想折叠前者,而不是后者。

4

1 回答 1

1

如果您只希望它影响auto-fill-mode而不是一般填充(例如,当您点击时不M-q),那么您的代码可以通过设置替换comment-auto-fill-only-comments。至于让它仅适用于“多行注释”,我认为您首先必须解释它们之间的区别。你是说你只想在评论已经跨越多行时自动填充,还是评论的其他一些特征可以让 Emacs 弄清楚当前只跨越单行的评论可以传播多行。

您可以尝试以下方法:

(set (make-local-variable 'fill-no-break-predicate)
     (lambda ()
       (let ((ppss (syntax-ppss)))
         (or (null (nth 4 ppss)) ;; Not inside a comment.
             (save-excursion
               (goto-char (nth 8 ppss))
               (skip-chars-backward " \t")
               (not (bolp))))))) ;; Comment doesn't start at indentation.
于 2012-05-06T13:48:08.313 回答