Làm cách nào để điền vùng / đoạn xác định tiền tố đoạn?


11

Hãy nói rằng tôi có bộ đệm sau đây.

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

Đánh M-qở đây trong khi text-modedẫn đến sau đây.

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

Mặt khác, nếu tôi kích hoạt markdown-mode, tôi nhận được những điều sau (Markdown chỉ là một ví dụ, bạn thấy hành vi tương tự trong các chế độ khác nhau).

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

Làm cách nào để định cấu hình chế độ văn bản để làm điều đó?

Tôi tưởng tượng này có thể được thực hiện bằng writting một đặc biệt fill-paragraph-function, nhưng biến này chỉ được thiết lập để nilmarkdown-mode, do đó có thể là một cách dễ dàng hơn.

Câu trả lời:


6

Tôi đã là một người dùng hạnh phúc của chế độ filladapt trong một thời gian dài, xử lý loại điều này thực sự độc đáo. Để biết thông tin, xem

http://emacswiki.org/emacs/FillAdapt

Từ trang đó:

Filladapt by KyleJones tăng cường các chức năng điền của Emacs bằng cách đoán tiền tố điền, chẳng hạn như một chuỗi nhận xét trong mã chương trình và xử lý các dấu đầu dòng như 1. hoặc là "*".

Ví dụ, nó có thể biến điều này

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

vào

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

Ok, chỉnh sửa để giải quyết điều đó.
Chris

để kích hoạt chế độ này kết hợp với chế độ khác, hãy thêm một cái gì đó (add-hook 'org-mode-hook 'turn-on-filladapt-mode)vào tệp cấu hình của bạn (thông tin này không có sẵn trực tiếp trên trang wiki được liên kết).
Đánh dấu

Hoạt động đẹp để làm cho fill-paragraphhành vi đúng trong blockquote trong markdown-mode.
Radon Rosborough

Đã 2 năm trôi qua kể từ khi có câu trả lời. Liên kết tải xuống wonderworks.com/doad/filladapt.el không còn khả dụng.
Tankman

Các liên kết làm việc cho tôi ngay bây giờ. Có lẽ đã có một vấn đề tạm thời với trang web.
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-modecó lẽ thiết lập fill-paragraph-functionđể nilchức năng sử dụng fill-prefixđể thực hiện điền.

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

Ví dụ đầy đủ:

(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
"chế độ markdown có lẽ đặt hàm fill-đoạn thành nil để hàm sử dụng tiền tố điền để thực hiện điền." Đó không thể là toàn bộ câu chuyện. Khi tôi nhấn M-q, fill-paragraphđược gọi trực tiếp (không có liên kết xung quanh nó). Mặc dù có thể fill-prefixcuối cùng được sử dụng cho mục đích này, nhưng phải có một số biến cấu hình cho phép tự động phát hiện.
Malabarba 14/2/2015

1
@Malabarba Có vẻ như markdown-modethực sự làm điều này thông qua các định nghĩa đoạn: gist.github.com/vermiculus/88759fd9f8368adbf663
Sean Allred

Vâng, có vẻ như nó nhiều hơn.
Malabarba 14/2/2015

2

Ý chính của Sean đã chỉ cho tôi đi đúng hướng, và đây là đoạn trích đã giải quyết nó.

(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)))
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.