2012-05-06 1 views
3

dans ma configuration .emacs, j'ai les suivantes:pliage multi-ligne-commentaires dans emacs automatiquement

(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))))) 

l'obtient ci-dessus invoquée dans le cadre de "c-mode-hook commun" et correctement fournit pliage longues lignes de commentaires automatiquement. Cependant, la chose ci-dessus fonctionne sans discernement, que j'utilise un simple commentaire de ligne, par exemple. décrire des champs struct, ou des commentaires multilignes décrivant un morceau de code compliqué. Donc, la question fondamentale est, comment puis-je obtenir le pliage automatique de longues lignes de commentaires seulement s'il s'agit d'un commentaire multi-ligne?

grâce Anupam

modifier-1: explication multi-ligne commentaire quand je dis "multi-ligne commentaire", cela signifie essentiellement des commentaires comme celui-ci:

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

une conséquence, un commentaire d'une seule ligne serait quelque chose comme ça

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

le code elisp ci-dessus, les plis docilement ces deux lignes de commentaires. je voudrais plier seulement le premier, pas le dernier.

Répondre

1

Si vous souhaitez uniquement affecter auto-fill-mode et non le remplissage général (par exemple, pas lorsque vous cliquez sur M-q), vous pouvez remplacer votre code en définissant comment-auto-fill-only-comments. Pour ce qui est de ne l'appliquer qu'aux «commentaires multilignes», je pense que vous devrez d'abord expliquer quelle est la différence entre les deux. Voulez-vous dire que vous ne voulez que remplir automatiquement lorsque le commentaire couvre déjà plus d'une ligne, ou existe-t-il une autre caractéristique d'un commentaire qui peut permettre à Emacs de comprendre qu'un commentaire qui ne couvre actuellement qu'une seule ligne plusieurs lignes.

Vous pouvez essayer quelque chose comme:

(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. 
Questions connexes