Comment créer automatiquement des blocs de commentaires C soignés lors de la frappe?

17

Certains éditeurs de code comme eclipse forment automatiquement des blocs nets lorsque vous commencez à taper un commentaire sur plusieurs lignes:

entrez la description de l'image ici

Existe-t-il un package ou une autre façon de le faire dans emacs?

Edit: Pour clarifier: je ne veux pas d'une combinaison de touches qui insère un bloc de commentaires. Je souhaite qu'un bloc de commentaires soit automatiquement créé lorsque j'appuie sur RETaprès /*.

Geier
la source
Avez-vous vérifié cette question similaire? stackoverflow.com/a/6578421/4780877
Utilisateur Emacs
@EmacsUser: Ouais. Mais ce n'est pas ce que je veux. Je ne veux pas qu'un extrait de code ou la fonctionnalité commente une région déjà écrite.
Geier
Voir le manuel pour plusieurs lignes de commentaires .
Dan
@Dan: C'est assez proche, mais il n'insère pas automatiquement la fermeture*/
Geier
2
@Name Les *panneaux ne sont pas strictement obligatoires, mais agréables à avoir.
Geier

Réponses:

7

Le code ci-dessous fonctionne très bien à partir de mes brefs tests dans un c-modetampon:

  • Après avoir tapé /*, appuyez sur M-j, la liaison par défaut pour indent-new-comment-line(et la liaison par défaut pour c-indent-new-comment-linedans c-mode). S'il s'agit de la première ligne de commentaire, les derniers caractères de fermeture */seront insérés automatiquement.
  • Frapper M-jplus de fois avec insérer plus de lignes de commentaires avec le *préfixe. Il s'agit du comportement intégré des fonctions c-indent-new-comment-line/ indent-new-comment-line. Consultez la documentation Plusieurs lignes de commentaires .
  • Un nugget supplémentaire dans le code ci-dessous garantit qu'il y a au moins un espace entre le *sur chaque ligne de commentaire et le commentaire.
(defun my-prettify-c-block-comment (orig-fun &rest args)
  (let* ((first-comment-line (looking-back "/\\*\\s-*.*"))
         (star-col-num (when first-comment-line
                         (save-excursion
                           (re-search-backward "/\\*")
                           (1+ (current-column))))))
    (apply orig-fun args)
    (when first-comment-line
      (save-excursion
        (newline)
        (dotimes (cnt star-col-num)
          (insert " "))
        (move-to-column star-col-num)
        (insert "*/"))
      (move-to-column star-col-num) ; comment this line if using bsd style
      (insert "*") ; comment this line if using bsd style
     ))
  ;; Ensure one space between the asterisk and the comment
  (when (not (looking-back " "))
    (insert " ")))
(advice-add 'c-indent-new-comment-line :around #'my-prettify-c-block-comment)
;; (advice-remove 'c-indent-new-comment-line #'my-prettify-c-block-comment)

Par exemple, après avoir évalué le code ci - dessus, je reçois le dessous sur la saisie: /* M-j First comment line M-j Second comment line. Le ▮ indique l'emplacement du curseur à la fin de la saisie.

/*
 * First comment line
 * Second comment line▮
 */ 

Test du bloc de commentaires de décalage ..

Avec le curseur après le point-virgule, taper: /* M-j Test offset commentdonne ce qui suit. Le ▮ indique l'emplacement du curseur à la fin de la saisie.

#include<stdio.h>
main() {
  printf("Hello World"); /*
                          * Test offset comment▮  
                          */                                 
}
Kaushal Modi
la source
Merci! Cela fonctionne, mais si j'ai (setq c-default-style "bsd" c-basic-offset 4)dans mon init.el, cela se produit: i.imgur.com/KMLx6Ll.gif Une idée?
Geier
1
La suppression (move-to-column star-col-num) (insert "*")de la solution ci-dessus résoudra cela pour vous. Je ne code pas en C, donc je n'ai pas étudié quelles variables sont définies par "bsd"style.
Kaushal Modi
En utilisant ce code avec le mode Dafny de github.com/boogie-org/boogie-friends , j'obtiens `/ *` pour chaque nouvelle ligne plutôt que `* '.
JAB