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 /*.


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▮  
                          */                                 
}

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.