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.