วิธีการเติมภูมิภาค / วรรคระบุคำนำหน้าย่อหน้า?


11

สมมุติว่าฉันมีบัฟเฟอร์ต่อไปนี้

1. lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

การกดปุ่มM-qที่นี่ในขณะที่text-modeนำไปสู่การต่อไปนี้

1. lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem
ipsum lorem ipsum lorem ipsum lorem ipsum

ในทางตรงกันข้ามถ้าฉันเปิดใช้งานmarkdown-modeฉันได้รับดังต่อไปนี้ (Markdown เป็นเพียงตัวอย่างคุณจะเห็นพฤติกรรมที่คล้ายกันในโหมดต่างๆ)

1. lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem
   ipsum lorem ipsum lorem ipsum lorem ipsum

ฉันจะกำหนดค่าโหมดข้อความให้ทำอย่างไร

ผมคิดนี้สามารถทำได้โดยการ writting พิเศษfill-paragraph-functionแต่ตัวแปรนี้จะถูกตั้งค่าเพียงเพื่อnilในmarkdown-modeจึงมีอาจจะเป็นวิธีที่ง่าย

คำตอบ:


6

ฉันเป็นผู้ใช้ที่มีความสุขของโหมด filladapt มาเป็นเวลานานซึ่งจัดการสิ่งเหล่านี้ได้เป็นอย่างดี สำหรับข้อมูลดู

http://emacswiki.org/emacs/FillAdapt

จากหน้านั้น:

Filladapt โดย KyleJones ปรับปรุงฟังก์ชั่นเติมของ Emacs โดยคาดเดาคำนำหน้าการเติมเช่นลำดับความคิดเห็นในรหัสโปรแกรมและการจัดการสัญลักษณ์หัวข้อย่อยเช่น "1" หรือ "*".

ตัวอย่างเช่นมันสามารถเปลี่ยนสิ่งนี้ได้

* Pretend I'm a really super long line.
* And the window's narrow.

เข้าไป

* Pretend I'm a really super
  long line.
* And the window's narrow.

ตกลงแก้ไขแล้วเพื่อแก้ไข
Chris

หากต้องการเปิดใช้งานโหมดนี้ร่วมกับโหมดอื่นให้เพิ่มสิ่งที่ชอบ(add-hook 'org-mode-hook 'turn-on-filladapt-mode)ลงในไฟล์กำหนดค่าของคุณ (ข้อมูลนี้ไม่สามารถใช้งานได้โดยตรงในหน้าวิกิที่ลิงก์)
ทำเครื่องหมาย

ทำงานได้อย่างสวยงามเพื่อให้มีfill-paragraphพฤติกรรมที่เหมาะสมภายในบล็อกmarkdown-modeโควต
Radon Rosborough

2 ปีที่ผ่านมาตั้งแต่คำตอบ ลิงค์ดาวน์โหลดwonderworks.com/download/filladapt.el ใช้งานไม่ได้อีกต่อไป
Tankman 六四

ลิงค์ใช้งานได้สำหรับฉันตอนนี้ อาจมีปัญหาชั่วคราวกับเว็บไซต์
Chris

3
(fill-paragraph &optional JUSTIFY REGION)

[...]

If `fill-paragraph-function' is non-nil, we call it (passing our
argument to it), and if it returns non-nil, we simply return its value.

If `fill-paragraph-function' is nil, return the `fill-prefix' used for filling.

[...]

markdown-modeสันนิษฐานว่าตั้งfill-paragraph-functionไว้nilเพื่อให้ฟังก์ชั่นใช้fill-prefixทำการเติม

(let ((fill-prefix (make-string (length "1. ") ? ))
  (fill-paragraph))

ตัวอย่างเต็มรูปแบบ:

(let* ((num 15)
       (numstr (format "%d. " num))
       (fill-prefix (make-string (length numstr) ? )))
  (with-temp-buffer
    (loop for i from 1 to 15 do
          (insert (format "lorem ipsum (%d) doler sit amet " i)))
    (beginning-of-line)
    (insert numstr)
    (fill-paragraph)
    (buffer-string)))

;; =>

"\
15. lorem ipsum (1) doler sit amet lorem ipsum (2) doler sit amet
    lorem ipsum (3) doler sit amet lorem ipsum (4) doler sit amet
    lorem ipsum (5) doler sit amet lorem ipsum (6) doler sit amet
    lorem ipsum (7) doler sit amet lorem ipsum (8) doler sit amet
    lorem ipsum (9) doler sit amet lorem ipsum (10) doler sit amet
    lorem ipsum (11) doler sit amet lorem ipsum (12) doler sit amet
    lorem ipsum (13) doler sit amet lorem ipsum (14) doler sit amet
    lorem ipsum (15) doler sit amet "

1
"โหมดมาร์คดาวน์สันนิษฐานว่าตั้งค่าย่อหน้าเติมฟังก์ชั่นเป็นศูนย์เพื่อให้ฟังก์ชั่นใช้คำเติมหน้าเพื่อเติมข้อความ" นั่นไม่สามารถเป็นเรื่องราวทั้งหมดได้ เมื่อฉันตีM-q, fill-paragraphถูกเรียกโดยตรง (ไม่มีการปล่อยให้ผูกรอบ) แม้ว่าจะเป็นไปได้ว่าfill-prefixท้ายที่สุดจะใช้เพื่อจุดประสงค์นี้ แต่จะต้องมีตัวแปรการกำหนดค่าบางอย่างที่ช่วยให้สามารถตรวจจับได้โดยอัตโนมัติ
Malabarba

1
@Malabarba ดูเหมือนว่าmarkdown-modeจะทำสิ่งนี้ผ่านคำจำกัดความวรรค: gist.github.com/vermiculus/88759fd9f8368adbf663
Sean Allred

ใช่ว่ามันดูเหมือนมากขึ้น
Malabarba

2

ส่วนสำคัญของฌอนชี้ให้ฉันไปในทิศทางที่ถูกต้องและนี่คือตัวอย่างที่แก้ไขได้

(defun my-adaptive-fill-function ()
  "Return prefix for filling paragraph or nil if not determined."
  (cond
   ;; List item inside blockquote
   ((looking-at "^[ \t]*>[ \t]*\\([0-9]+\\.\\|[*+-]\\)[ \t]+")
    (replace-regexp-in-string
     "[0-9\\.*+-]" " " (match-string-no-properties 0)))
   ;; Blockquote
   ((looking-at "^[ \t]*>[ \t]*")
    (match-string-no-properties 0))
   ;; List items
   ((looking-at "^\\([ \t]*\\)\\([0-9]+\\.\\|[\\*\\+-]\\)\\([ \t]+\\)")
    (match-string-no-properties 0))
   ;; No match
   (t nil)))

;; Paragraph filling in text-mode.
(add-hook 'text-mode-hook
  (lambda ()
    (set (make-local-variable 'paragraph-start)
         "\f\\|[ \t]*$\\|[ \t]*[*+-] \\|[ \t]*[0-9]+\\.[ \t]\\|[ \t]*: ")
    (set (make-local-variable 'paragraph-separate)
         "\\(?:[ \t\f]*\\|.*  \\)$")
    (set (make-local-variable 'adaptive-fill-first-line-regexp)
         "\\`[ \t]*>[ \t]*?\\'")
    (set (make-local-variable 'adaptive-fill-function)
         'my-adaptive-fill-function)))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.