Wie erstelle ich beim Tippen automatisch ordentliche C-Kommentarblöcke?

17

Einige Code-Editoren wie Eclipse bilden automatisch übersichtliche Blöcke, wenn Sie mit der Eingabe eines mehrzeiligen Kommentars beginnen:

Bildbeschreibung hier eingeben

Gibt es ein Paket oder eine andere Möglichkeit, dies auch in Emacs zu tun?

Bearbeiten: Zur Verdeutlichung: Ich möchte keine Tastenkombination, die einen Kommentarblock einfügt. Ich möchte ein Kommentarblock automatisch erstellt werden , wenn ich drücken RETnach /*.

Geier
quelle
Haben Sie diese ähnliche Frage überprüft? stackoverflow.com/a/6578421/4780877
Emacs User
@EmacsUser: Ja. Aber das will ich nicht. Ich möchte nicht, dass nur ein Ausschnitt oder das Feature eine bereits geschriebene Region kommentiert.
Geier
Siehe das Handbuch für Multiple Lines of Comments .
Dan
@Dan: Das ist ziemlich knapp, aber es fügt nicht automatisch das Closing ein*/
Geier
2
@Name Die *Zeichen sind nicht unbedingt erforderlich, aber schön zu haben.
Geier

Antworten:

7

Der folgende Code funktioniert einwandfrei, wenn ich ihn kurz in einem c-modePuffer getestet habe :

  • Nach der Eingabe /*drücken Sie M-j, um die Standardbindung für indent-new-comment-line(und die Standardbindung für c-indent-new-comment-linein c-mode). Wenn es sich um die erste Kommentarzeile handelt, werden die schließenden schließenden Zeichen */automatisch eingefügt.
  • Schlagen M-jmehrmals mit Einsatz mehr Kommentarzeilen mit dem *Präfix. Dies ist das eingebaute Verhalten von c-indent-new-comment-line/ indent-new-comment-linefunctions. Lesen Sie die Dokumentation zu Multiple lines of comments .
  • Ein zusätzliches Nugget im folgenden Code stellt sicher, dass zwischen *jeder Kommentarzeile und dem Kommentar mindestens ein Leerzeichen steht .
(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)

Zum Beispiel nach dem obigen Code Auswertung, erhalte ich die unten auf der Eingabe: /* M-j First comment line M-j Second comment line. Das ▮ zeigt die Cursorposition am Ende der Eingabe an.

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

Offset-Kommentarblock wird getestet.

Wenn der Cursor hinter dem Semikolon steht, /* M-j Test offset commentgeben Sie Folgendes ein: Das ▮ zeigt die Cursorposition am Ende der Eingabe an.

#include<stdio.h>
main() {
  printf("Hello World"); /*
                          * Test offset comment▮  
                          */                                 
}
Kaushal Modi
quelle
Vielen Dank! Das funktioniert, aber wenn ich (setq c-default-style "bsd" c-basic-offset 4)in meinem habe init.el, passiert folgendes: i.imgur.com/KMLx6Ll.gif Irgendeine Idee?
Geier
1
Das Entfernen (move-to-column star-col-num) (insert "*")aus der obigen Lösung wird das für Sie beheben. Ich codiere nicht in C und habe daher nicht untersucht, welche Variablen durch den "bsd"Stil festgelegt werden.
Kaushal Modi
Wenn ich diesen Code im Dafny-Modus von github.com/boogie-org/boogie-friends verwende , erhalte ich "/ *" für jede neue Zeile anstatt "*".
JAB