Jak automatycznie tworzyć czyste bloki komentarzy C podczas pisania?

17

Niektóre edytory kodu, takie jak zaćmienie, automatycznie tworzą zgrabne bloki, gdy zaczynasz pisać komentarz wielowierszowy:

wprowadź opis zdjęcia tutaj

Czy jest jakiś pakiet lub inny sposób, aby to zrobić również w emacsie?

Edycja: W celu wyjaśnienia: ja nie chce kluczy kombinację, która wstawia komentarz blokowy. Chcę, aby blok komentarzy był tworzony automatycznie po naciśnięciu przycisku RETpo /*.

Geier
źródło
Czy sprawdziłeś to podobne pytanie? stackoverflow.com/a/6578421/4780877
Użytkownik Emacsa
@EmacsUser: Tak. Ale nie tego chcę. Nie chcę, aby tylko fragment lub funkcja komentowała już napisany region.
Geier,
Zobacz instrukcję dla wielu linii komentarzy .
Dan
@ Dan: To dość blisko, ale nie wstawia automatycznie zamknięcia*/
Geier
2
@ Imię *Znaki nie są ściśle wymagane, ale miło mieć.
Geier,

Odpowiedzi:

7

Poniższy kod działa poprawnie z moich krótkich testów w c-modebuforze:

  • Po wpisaniu /*naciśnij M-j, domyślne powiązanie dla indent-new-comment-line(i domyślne powiązanie dla c-indent-new-comment-linein c-mode). Jeśli jest to pierwszy wiersz komentarza, zamykające znaki zamykające */zostaną wstawione automatycznie.
  • Trafienie M-jwięcej razy z wstawieniem większej liczby wierszy komentarza z *prefiksem. Jest to wbudowane zachowanie c-indent-new-comment-line/ indent-new-comment-linefunkcji. Sprawdź dokumentację dotyczącą wielu wierszy komentarzy .
  • Dodatkowy model użytkowy w poniższym kodzie zapewnia, że ​​między *wierszem komentarza a komentarzem jest co najmniej jedna spacja .
(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)

Na przykład, po dokonaniu oceny powyższy kod, otrzymuję poniżej na wpisywanie: /* M-j First comment line M-j Second comment line. ▮ wskazuje położenie kursora na końcu pisania.

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

Testowanie bloku komentarza odsunięcia ..

Kursor po średniku, wpisując: /* M-j Test offset commentdaje poniżej. ▮ wskazuje położenie kursora na końcu pisania.

#include<stdio.h>
main() {
  printf("Hello World"); /*
                          * Test offset comment▮  
                          */                                 
}
Kaushal Modi
źródło
Dzięki! To działa, ale jeśli mam (setq c-default-style "bsd" c-basic-offset 4)w moim init.el, tak się dzieje: i.imgur.com/KMLx6Ll.gif Każdy pomysł?
Geier,
1
Usunięcie (move-to-column star-col-num) (insert "*")z powyższego rozwiązania naprawi to za Ciebie. Nie koduję w C, więc nie sprawdziłem, jakie zmienne są ustawione według "bsd"stylu.
Kaushal Modi,
Używając tego kodu w trybie Dafny z github.com/boogie-org/boogie-friends , otrzymuję `/ *` dla każdej nowej linii zamiast `*`.
JAB