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 /*.


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▮  
                          */                                 
}

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.