Làm thế nào để tự động tạo khối bình luận C gọn gàng trong khi gõ?


17

Một số trình chỉnh sửa mã như nhật thực sẽ tự động tạo thành các khối gọn gàng khi bạn bắt đầu nhập một nhận xét nhiều dòng:

nhập mô tả hình ảnh ở đây

Có một số gói hoặc cách khác để làm điều này trong emacs quá?

Chỉnh sửa: Để làm rõ: Tôi không muốn tổ hợp phím chèn khối nhận xét. Tôi muốn một khối bình luận sẽ được tạo tự động khi tôi nhấn RETsau /*.


Bạn đã kiểm tra câu hỏi tương tự này? stackoverflow.com/a/6578421/4780877
Người dùng Emacs

@EmacsUser: Vâng. Nhưng đó không phải là điều tôi muốn. Tôi không muốn chỉ là một đoạn trích hoặc tính năng để nhận xét một khu vực đã được viết.
Geier

Xem hướng dẫn cho nhiều dòng bình luận .
Dân

@Dan: Điều đó khá gần, nhưng nó không tự động chèn đóng*/
Geier

2
@ Tên Các *dấu hiệu không bắt buộc, nhưng rất tốt để có.
Geier

Câu trả lời:


7

Đoạn mã dưới đây hoạt động tốt từ thử nghiệm ngắn gọn của tôi trong c-modebộ đệm:

  • Sau khi gõ /*, nhấn M-j, ràng buộc mặc định cho indent-new-comment-line(và ràng buộc mặc định cho c-indent-new-comment-linein c-mode). Nếu đó là dòng bình luận đầu tiên, các ký tự đóng */sẽ được tự động chèn vào.
  • Đánh M-jnhiều lần hơn với chèn thêm dòng nhận xét với *tiền tố. Đây là hành vi được xây dựng của c-indent-new-comment-line/ indent-new-comment-linechức năng. Kiểm tra nhiều dòng tài liệu bình luận .
  • Một nugget bổ sung trong mã dưới đây đảm bảo rằng có ít nhất một khoảng trắng giữa *trên mỗi dòng bình luận và bình luận.
(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)

Chẳng hạn, sau khi đánh giá đoạn mã trên, tôi nhận được phần dưới đây khi gõ : /* M-j First comment line M-j Second comment line. Chỉ vị trí con trỏ ở cuối gõ.

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

Kiểm tra khối nhận xét bù ..

Với con trỏ sau dấu chấm phẩy, gõ: /* M-j Test offset commentđưa ra bên dưới. Chỉ vị trí con trỏ ở cuối gõ.

#include<stdio.h>
main() {
  printf("Hello World"); /*
                          * Test offset comment▮  
                          */                                 
}

Cảm ơn! Đó là các công trình, nhưng nếu tôi có (setq c-default-style "bsd" c-basic-offset 4)trong tôi init.el, điều này xảy ra: i.imgur.com/KMLx6Ll.gif Bất kỳ ý tưởng?
Geier

1
Loại bỏ (move-to-column star-col-num) (insert "*")khỏi giải pháp trên sẽ khắc phục điều đó cho bạn. Tôi không viết mã bằng C, vì vậy tôi chưa điều tra biến nào được đặt theo "bsd"kiểu.
Kaushal Modi

Sử dụng mã này với chế độ Dafny từ github.com/boogie-org/boogie-friends , tôi nhận được `/ *` cho mỗi dòng mới thay vì `*`.
JAB
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.