มีโหมดเติมย่อหน้าอัตโนมัติเต็มรูปแบบสำหรับการแสดงความคิดเห็นรหัสหรือไม่


18

ฉันกำลังมองหาโหมดย่อยเพื่อให้ย่อหน้าเต็มตลอดเวลาขณะพิมพ์ (คล้ายกับaggressive-indent-modeการเยื้อง) นอกจากนี้ยังต้องมีความฉลาดพอที่จะเติมความคิดเห็นเท่านั้น (และอาจมีสตริงขึ้นอยู่กับภาษา)

บางสิ่งที่ฉันได้ลองคือ:

  • auto-fill-mode เติมโดยอัตโนมัติในขณะที่คุณพิมพ์ย่อหน้าใหม่ แต่ไม่เติมเมื่อคุณแก้ไขย่อหน้า

  • refill-mode ทำการเติมย่อหน้าอย่างต่อเนื่อง แต่มันพยายามที่จะใส่โค้ดเข้าไปในย่อหน้าเช่นเดียวกับความคิดเห็น

  • ฉันพยายามเพิ่มfill-paragraphลงในafter-change-functionsตะขอ แต่มันไขสกรูขึ้นมาเพื่อเลิกทำและสิ่งอื่น ๆ อีกมากมาย

มีความคิดที่ดีกว่านี้ไหม?


6
นอกเหนือ: บทที่ 7 ของการเขียนส่วนขยาย GNU EmacsของGlickstein จะอธิบายถึงวิธีการใช้งานของคุณ อาจเป็นโอกาสที่ดีในการเรียนรู้ / ฝึกฝนกับ elisp
แดน

ฉันกำลังมองหาย่อหน้าเติมอัตโนมัติ (ด้วยการเปิดใช้งานการเติมอัตโนมัติ) ในorg-modeแต่คุณอาจลองrebox2
CodyChan

คำตอบ:


4

ฉันคิดวิธีที่น้อยที่สุดในการใช้ฟังก์ชั่นนี้: แค่ผูกแถบพื้นที่เพื่อโทร(fill-paragraph)!

(defun fill-then-insert-space ()
  (interactive)
  (fill-paragraph)
  (insert " "))
(global-set-key (kbd "SPC") #'fill-then-insert-space)

มีข้อแม้อยู่สองสามข้อที่ฉันเคยเจอมา:

  1. elisp-mode(อาจเป็นไปได้ว่าคนอื่น) ทำรหัสแฟนซีบางอย่างเมื่อคุณโทรfill-paragraphซึ่งอาจเป็นหรือไม่เป็นสิ่งที่คุณต้องการ สามารถแก้ไขได้โดยการทดสอบว่ามีจุดอยู่ในความคิดเห็นหรือ docstring แต่ฉันไม่แน่ใจว่าจะทำอย่างไร

  2. บางครั้งคุณไม่สามารถป้อนช่องว่างหลาย ๆ อันได้อย่างง่ายดาย (เพราะfill-paragraphฆ่าช่องว่างต่อท้าย) เนื่องจากพื้นที่แถบตอนนี้ทำหน้าที่เหมือนมันอาจจะตกลงที่จะเปลี่ยนที่มีผลผูกพันกับjust-one-space(insert " ")

ฉันทำเล็ก ๆ น้อย ๆ ที่มีโหมดการทำงานนี้ก็มีอยู่บนGitHubaggressive-fill-paragraphหรือในแพคเกจ melpa


ฉันคิดว่ามันน่าขันที่aggressive-fill-paragraphอยู่ไกลก้าวร้าวน้อยกว่าrefill-modeซึ่งขึ้นอยู่ในเชิงรุกเพื่อเป็นสวยไร้ประโยชน์(ตามที่คุณไม่สามารถแม้แต่จะพูดกับใครสักคน> โดยไม่ต้องเติมโหมดการจัดเรียงสิ่ง: แม้ว่าคุณจะใช้ regexps เพื่อทดแทน)
Hi-Angel

1

ถ้าคุณชอบวิธีการเติมโหมด (ฉันไม่: p) แต่ไม่ใช่เมื่อมันทำงานมันควรจะง่ายต่อการแก้ไขโดยการยับยั้งมันเมื่อใดก็ตามที่คุณไม่อยู่ในสภาวะที่เหมาะสม

ตัวอย่างเช่น

(defvar plop/refill-enabler-function nil)

(defun plop/region-in-comment (beg end)
  ;; should really be comment-only-p, but that seems really broken for me
  (not
   (loop for c from beg to end
      if (not (eq 'font-lock-comment-face (get-char-property c 'face)))
      return t)))

(defun plop/refill-after-change-function (beg end len)
  (unless undo-in-progress
    (when (and plop/refill-enabler-function
               (funcall plop/refill-enabler-function beg end))
      (setq refill-doit end))))

(defun plop/install-refill-hack ()
  (if refill-mode
      (progn
        (add-hook 'after-change-functions 'plop/refill-after-change-function nil t)
        (remove-hook 'after-change-functions 'refill-after-change-function t))
    (progn
      (remove-hook 'after-change-functions 'plop/refill-after-change-function t))))

(defun plop/refill-hook ()
  (set (make-local-variable 'plop/refill-enabler-function)
       #'plop/region-in-comment)
  (add-hook 'refill-mode-hook 'plop/install-refill-hack t t)
  (refill-mode))

(add-hook 'some-hook 'plop/refill-hook)

โดยพื้นฐานแล้วมันจะลบฟังก์ชั่นที่เรียกใช้การเติมเงินafter-change-functionsและแทนที่ด้วยสิ่งที่จะตรวจสอบว่าเราอยู่ในความคิดเห็นก่อนที่จะทำสิ่งเดียวกัน


ดูเหมือนว่าจะเป็นการเริ่มต้นที่ดี แต่ก็ยังไม่ถูกต้อง: หากมีการเติมเงินในขณะที่แก้ไขความคิดเห็นการเติมนั้นจะเติมทั้งย่อหน้ารวมถึงรหัสโดยรอบ นี่อาจเป็นความผิดของโหมดล้อมรอบที่ไม่ได้กำหนดขอบเขตที่เหมาะสม แต่ฉันสงสัยว่า: ฉันลองใช้โหมด Emacs Lisp ซึ่งฉันเข้าใจว่าทำสิ่งต่าง ๆ โดยหนังสือ
Gilles 'ดังนั้น - หยุดความชั่วร้าย'

ดีนั่นคือเหตุผลที่ฉันบอกว่าฉันไม่ชอบrefill-mode:) ปัญหาคือการrefill-modeใช้fill-regionแทนfill-paragraphดังนั้นการสูญเสียความสามารถในการให้เกียรติfill-paragraph-functionและทำให้สิ่งที่อาจยุ่ง
Sigma
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.