2012-05-06 7 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))))) 

выше вызываются, как часть «С-режим-здравого крючок» и правильно обеспечивает складного длинные строки комментариев.

Однако вышеуказанная вещь работает без разбора, независимо от того, использую ли я один комментарий линии, например. описание полей структуры или многострочные комментарии, описывающие сложный фрагмент кода.

так что основной вопрос: как я могу получить автоматическое складывание длинных строк комментариев, только если это многострочный комментарий?

благодаря Anupam

редактировать-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.