Come creare automaticamente blocchi di commenti C puliti durante la digitazione?


17

Alcuni editor di codice come eclipse formano automaticamente blocchi ordinati quando inizi a digitare un commento a più righe:

inserisci qui la descrizione dell'immagine

Esiste un pacchetto o un altro modo per farlo anche in emacs?

Modifica: per chiarire: non voglio una combinazione di tasti che inserisca un blocco di commenti. Voglio che un blocco di commenti venga creato automaticamente quando premo RETdopo /*.


Hai controllato questa domanda simile? stackoverflow.com/a/6578421/4780877
— Utente Emacs

@EmacsUser: Sì. Ma non è quello che voglio. Non voglio solo uno snippet o la funzione per commentare una regione già scritta.
— Geier,

Vedere il manuale per più righe di commenti .
— Dan

@ Dan: È abbastanza vicino, ma non inserisce automaticamente la chiusura*/
— Geier

2
@ Nome I *segni non sono strettamente richiesti, ma belli da avere.
— Geier,

Risposte:


7

Il codice seguente funziona bene dal mio breve test in un c-modebuffer:

  • Dopo aver digitato /*, premi M-j, l'associazione predefinita per indent-new-comment-line(e l'associazione predefinita per c-indent-new-comment-linein c-mode). Se è la prima riga di commento, i caratteri di chiusura finali */verranno inseriti automaticamente.
  • Colpire M-jpiù volte con inserire più righe di commento con il *prefisso. Questo è il comportamento integrato di c-indent-new-comment-line/ indent-new-comment-linefunzioni. Consulta la documentazione Righe multiple di commenti .
  • Un nugget aggiuntivo nel codice seguente garantisce che ci sia almeno uno spazio tra il *su ogni riga di commento e il commento.
(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)

Per esempio, dopo aver valutato il codice di cui sopra, ho l'qui di seguito sulla tipizzazione: /* M-j First comment line M-j Second comment line. ▮ indica la posizione del cursore alla fine della digitazione.

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

Test del blocco dei commenti di offset ..

Con il cursore dopo il punto e virgola, digitare: /* M-j Test offset commentindica quanto segue. ▮ indica la posizione del cursore alla fine della digitazione.

#include<stdio.h>
main() {
  printf("Hello World"); /*
                          * Test offset comment▮  
                          */                                 
}

Grazie! Funziona, ma se ho (setq c-default-style "bsd" c-basic-offset 4)nel mio init.el, questo succede: i.imgur.com/KMLx6Ll.gif Qualche idea?
— Geier,

1
La rimozione (move-to-column star-col-num) (insert "*")dalla soluzione sopra risolverà questo per te. Non codifico in C, quindi non ho studiato quali variabili sono impostate dallo "bsd"stile.
— Kaushal Modi,

Usando questo codice con la modalità Dafny da github.com/boogie-org/boogie-friends , ottengo `/ *` per ogni newline anziché `*`.
— JAB
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.