2012-05-06 25 views
3

,我有以下:折叠在emacs的多线的评论在我的.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-模式共有钩”部分和正确地折叠提供长评论行自动。

然而,上述的东西无差别地工作,无论我是否使用单行注释描述结构字段,或描述一些复杂代码的多行注释。

所以,基本的问题是,如何才能自动折叠长评论行,只有当它是一个多行评论?

感谢 阿努邦

编辑-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代码,尽职尽责地折叠这两个注释行。我只想折叠前者,而不是后者。

回答

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.