before-save-hook สำหรับโหมด cc


13

ฉันต้องการปรับแต่งcc-modeเพื่อใช้งานฟังก์ชั่นก่อนบันทึก ทางออกหนึ่งคือการปรับเปลี่ยนcc-modekeymap เพื่อผูกC-x C-sกับฟังก์ชั่นที่ทำงานที่ฉันต้องการแล้วบันทึก

คำถามของฉันคือมีเบ็ดที่ฉันสามารถปรับแต่งสำหรับนี้ เอกสาร CC เบ็ดไม่พูดถึงเฉพาะสำหรับbefore-save-hook cc-modeสิ่งนี้ควรทำผ่านเบ็ดได้อย่างไร?

หรือฉันจะทำสิ่งนี้ผ่านได้defadviceอย่างไร จากการอ่านคู่มือวิธีเดียวที่ฉันเห็นคือการเปิดใช้งานคำแนะนำก่อนบันทึกแล้วปิดใช้งานหลังจากงานเสร็จ ฟังดูยุ่งยาก สิ่งที่เป็นวิธีการใช้สำนวนadvice?


3
ฟังก์ชั่นที่คุณเพิ่มเพื่อbefore-save-hookสามารถตรวจสอบโหมดหลักปัจจุบัน (เช่น(eq major-mode ...)) และไม่ทำอะไรเลยหากมันไม่ตรงกับโหมดที่คุณกำหนดเอง
Constantine

@ เห็นด้วยเห็นด้วย ฉันต้องการตรวจสอบว่ามี "สิ่งที่มีอยู่ภายใน" สำหรับสิ่งประเภทนี้อีกหรือไม่ IIRC haskell-modeมีafter/before-saveตะขออย่างน้อยหนึ่งอันและฉันคิดว่านี่เป็นแบบฝึกหัดมาตรฐานสำหรับโหมดโปรแกรม
Pradhan

@ คอนสแตนติน: คุณสามารถแปลงความคิดเห็นของคุณเป็นคำตอบ (เพิ่มขึ้นเล็กน้อย)?
แดน

1
ดูหัวข้อนี้สำหรับตัวอย่างการใช้งานของafter-save-hook; คุณสามารถใช้โพรซีเดอร์ประเภทเดียวกัน แต่ใช้แทนbefore-save-hookได้
ด่าน

คำตอบ:


12

วิธีการหนึ่งที่เป็นเรื่องธรรมดาของการ จำกัด major-modeการกระทำของเบ็ดไปยังโหมดที่สำคัญโดยเฉพาะอย่างยิ่งคือการตรวจสอบค่าของ

ตัวอย่างเช่น hook นี้พิมพ์ข้อความก่อนบันทึกบัฟเฟอร์โดยใช้c++-mode:

(defun my-c++-mode-before-save-hook ()
  (when (eq major-mode 'c++-mode)
    (message "It's never too early to start saving (C++ code)!")))

(add-hook 'before-save-hook #'my-c++-mode-before-save-hook)

หมายเหตุด้านข้าง: บางครั้งอาจมีประโยชน์ในการตรวจสอบว่าโหมดหลักได้รับจากโหมด CC หรือไม่ เราสามารถทำได้โดยตรวจสอบว่าc-buffer-is-cc-modeไม่ใช่nil:

(defun my-cc-mode-before-save-hook ()
  (when c-buffer-is-cc-mode
    (message "Saving a buffer with a major-mode derived from CC Mode.")))

19

หรือใช้เบ็ดท้องถิ่น:

(add-hook 'c++-mode-hook
          (lambda () (add-hook 'before-save-hook MY-HOOK-FUNC nil 'local)))

นี้จะเพิ่มMY-HOOK-FUNCไปยังบัฟเฟอร์ท้องถิ่น before-save-hookของแต่ละบัฟเฟอร์ c ++ โหมดหรือบัฟเฟอร์ใด ๆ ในโหมดที่ได้มาของโหมด C ++

ฉันพบว่ามันดูสง่างามกว่าที่ตรวจสอบอย่างชัดเจนmajor-modeและมันมีข้อดีที่คุณสามารถปิดการใช้งานbefore-save-hook ภายในสำหรับแต่ละบัฟเฟอร์ด้วยM-: (remove-hook 'before-save-hook MY-HOOK-FUNC 'local)โดยไม่กระทบกับบัฟเฟอร์อื่น ๆ


-1

ฉันเคยต้องการบางสิ่งเช่นนั้นสำหรับการเติมข้อความอัตโนมัติในไฟล์ elisp ของฉันเมื่อบันทึกฉันใช้วิธีการเช่นนี้ (แปลงวิธีการเป็นโหมดซีซี):

(add-hook 'c-common-hook #'(lambda ()
                              (add-hook 'before-save-hook #'(lambda ()
                                                               (funcall #'YOUR-FUNC-HOOK)))))

1
ก่อนอื่นคุณหมายถึงc-mode-common-hookอะไร ประการที่สองดูเหมือนว่าจะเพิ่มฟังก์ชั่นbefore-save-hookในครั้งแรกที่คุณป้อนCภาษาที่เกี่ยวข้อง แต่จากนั้นฟังก์ชั่นนั้นจะถูกเรียกก่อนบันทึกทุกครั้งในทุกบัฟเฟอร์ สิ่งที่ OP ต้องทำคือเรียกใช้ฟังก์ชันตามเงื่อนไขในบัฟเฟอร์ที่อยู่ในโหมดเฉพาะ (ดูความคิดเห็นของ @ Constantine สำหรับวิธีการ)
แดน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.