Bagaimana cara secara otomatis membuat blok komentar C yang rapi saat mengetik?

17

Beberapa editor kode seperti eclipse secara otomatis membentuk blok yang rapi ketika Anda mulai mengetik komentar multi-baris:

masukkan deskripsi gambar di sini

Apakah ada beberapa paket atau cara lain untuk melakukan ini di emacs juga?

Sunting: Untuk memperjelas: Saya tidak ingin kombinasi tombol yang menyisipkan blok komentar. Saya ingin blok komentar dibuat secara otomatis ketika saya menekan RETsetelah /*.

Geier
sumber
Apakah Anda memeriksa pertanyaan serupa ini? stackoverflow.com/a/6578421/4780877
Pengguna Emacs
@EmacsUser: Ya. Tapi bukan itu yang saya inginkan. Saya tidak ingin hanya cuplikan atau fitur mengomentari wilayah yang sudah ditulis.
Geier
Lihat manual untuk Beberapa Baris Komentar .
Dan
@ Dan: Itu cukup dekat, tetapi tidak secara otomatis memasukkan penutupan*/
Geier
2
@Nama *Tanda-tanda tidak sepenuhnya diperlukan, tetapi menyenangkan untuk dimiliki.
Geier

Jawaban:

7

Kode di bawah ini berfungsi dengan baik dari pengujian singkat saya di c-modebuffer:

  • Setelah mengetik /*, tekan M-j, binding default untuk indent-new-comment-line(dan binding default untuk c-indent-new-comment-linein c-mode). Jika ini adalah baris komentar pertama, karakter penutup */akan dimasukkan secara otomatis.
  • Memukul M-jlebih banyak kali dengan memasukkan lebih banyak baris komentar dengan *awalan. Ini adalah perilaku c-indent-new-comment-line/ indent-new-comment-linefungsi bawaan. Lihat beberapa baris dokumentasi komentar .
  • Nugget tambahan dalam kode di bawah ini memastikan bahwa setidaknya ada satu ruang antara *di setiap baris komentar dan komentar.
(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)

Sebagai contoh, setelah mengevaluasi kode di atas, saya mendapatkan di bawah ini pada mengetik: /* M-j First comment line M-j Second comment line. ▮ menunjukkan lokasi kursor di akhir pengetikan.

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

Menguji blok komentar offset ..

Dengan kursor setelah titik koma, ketikkan: /* M-j Test offset commentberi di bawah ini. ▮ menunjukkan lokasi kursor di akhir pengetikan.

#include<stdio.h>
main() {
  printf("Hello World"); /*
                          * Test offset comment▮  
                          */                                 
}
Kaushal Modi
sumber
Terima kasih! Itu bekerja, tetapi jika ada (setq c-default-style "bsd" c-basic-offset 4)di saya init.el, ini terjadi: i.imgur.com/KMLx6Ll.gif Ada ide?
Geier
1
Menghapus (move-to-column star-col-num) (insert "*")dari solusi di atas akan memperbaikinya untuk Anda. Saya tidak kode dalam C, jadi saya belum menyelidiki variabel apa yang ditetapkan oleh "bsd"gaya.
Kaushal Modi
Menggunakan kode ini dengan mode Dafny dari github.com/boogie-org/boogie-friends , saya mendapatkan `/ *` untuk setiap baris baru daripada `*`.
JAB