วิธีสร้างบล็อกความคิดเห็น C เรียบร้อยโดยอัตโนมัติในขณะพิมพ์?


17

เครื่องมือแก้ไขโค้ดบางตัวเช่น eclipse จะสร้างบล็อกที่เรียบร้อยโดยอัตโนมัติเมื่อคุณเริ่มพิมพ์ความคิดเห็นแบบหลายบรรทัด:

ป้อนคำอธิบายรูปภาพที่นี่

มีแพ็กเกจหรือวิธีอื่นใน emacs ด้วยหรือไม่

แก้ไข:เพื่อชี้แจง: ฉันไม่ต้องการชุดคีย์ที่แทรกบล็อกความคิดเห็น ฉันต้องการแสดงความคิดเห็นบล็อกจะถูกสร้างขึ้นโดยอัตโนมัติเมื่อกดหลังRET/*


คุณตรวจสอบคำถามที่คล้ายกันนี้หรือไม่ stackoverflow.com/a/6578421/4780877
ผู้ใช้ Emacs

@EmacsUser: ใช่ แต่นั่นไม่ใช่สิ่งที่ฉันต้องการ ฉันไม่ต้องการเพียงตัวอย่างหรือคุณสมบัติในการแสดงความคิดเห็นภูมิภาคที่เขียนแล้ว
Geier

ดูคู่มือสำหรับสายหลายความคิดเห็น
แดน

@ แดน: มันค่อนข้างใกล้ แต่มันไม่ได้แทรกการปิดโดยอัตโนมัติ*/
Geier

2
@ ชื่อ*สัญญาณไม่จำเป็นต้องเคร่งครัด แต่ก็ดี
Geier

คำตอบ:


7

รหัสด้านล่างทำงานได้ดีจากการทดสอบสั้น ๆ ของฉันในc-modeบัฟเฟอร์:

  • หลังจากพิมพ์/*กดM-jเริ่มต้นการผูกสำหรับindent-new-comment-line(และการผูกเริ่มต้นสำหรับc-indent-new-comment-lineในc-mode) หากเป็นบรรทัดแรกของความคิดเห็นอักขระการปิด*/จะถูกแทรกโดยอัตโนมัติ
  • กดปุ่มM-jเพิ่มอีกครั้งด้วยการใส่บรรทัดความคิดเห็นด้วย*คำนำหน้า นี่คือพฤติกรรมc-indent-new-comment-line/ indent-new-comment-lineฟังก์ชั่นที่สร้างขึ้นใน ตรวจสอบเอกสารแสดงความคิดเห็นหลายบรรทัด
  • นักเก็ตแบบพิเศษในโค้ดด้านล่างช่วยให้มั่นใจได้ว่ามีช่องว่างอย่างน้อยหนึ่งช่องระหว่าง*แต่ละบรรทัดความคิดเห็นและความคิดเห็น
(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)

/* M-j First comment line M-j Second comment lineยกตัวอย่างเช่นหลังจากการประเมินโค้ดข้างต้นที่ผมได้รับด้านล่างในการพิมพ์: ▮ระบุตำแหน่งเคอร์เซอร์เมื่อสิ้นสุดการพิมพ์

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

การทดสอบบล็อกความคิดเห็นชดเชย ..

ด้วยเคอร์เซอร์หลังเครื่องหมายอัฒภาคให้พิมพ์: /* M-j Test offset commentให้ด้านล่าง ▮ระบุตำแหน่งเคอร์เซอร์เมื่อสิ้นสุดการพิมพ์

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

ขอบคุณ! ใช้งานได้แต่ถ้าฉันมี(setq c-default-style "bsd" c-basic-offset 4)ในตัวฉันinit.elสิ่งนี้จะเกิดขึ้น: i.imgur.com/KMLx6Ll.gif มีความคิดอะไรบ้าง
Geier

1
การนำออก(move-to-column star-col-num) (insert "*")จากโซลูชันด้านบนจะแก้ไขปัญหาให้คุณ ฉันไม่ใช้รหัสใน C ดังนั้นฉันจึงไม่ได้ตรวจสอบตัวแปรที่ตั้งตาม"bsd"สไตล์
Kaushal Modi

ใช้รหัสนี้กับโหมด Dafny จากgithub.com/boogie-org/boogie-friendsฉันจะได้รับ `/ * 'สำหรับแต่ละบรรทัดใหม่แทนที่จะเป็น` *'
JAB
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.