如何使填充区域/段落标识段落前缀?


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

如何配置文本模式来做到这一点?

我想这可以通过写一个special来实现fill-paragraph-function,但是将此变量设置为nilin markdown-mode,所以可能有一种更简单的方法。

Answers:


6

很长时间以来,我一直是filladapt-mode的快乐用户,它可以很好地处理这种事情。有关信息,请参阅

http://emacswiki.org/emacs/FillAdapt

从该页面:

KyleJones的Filladapt通过猜测填充前缀(例如程序代码中的注释序列)并处理项目符号(如“ 1”)来增强Emacs的填充功能。要么 ”*”。

例如,它可能会使

* 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.

好的,进行编辑以解决该问题。
克里斯

要与另一种模式一起启用此模式,请在(add-hook 'org-mode-hook 'turn-on-filladapt-mode)配置文件中添加类似内容(此信息在链接的Wiki页面上不直接可用)。
2016年

精美的fill-paragraph外观使的行内引用正常markdown-mode
Radon Rosborough

自回答以来已经过去了2年。下载链接wonderworks.com/download/filladapt.el不再可用。
坦克手六四2015年

该链接现在对我有用。可能网站暂时出现问题。
克里斯(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-functionnil以便该函数用来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
“ markdown-mode可能会将fill-paragraph-function设置为nil,以便该函数使用fill-prefix进行填充。” 那不是全部。当我点击时M-qfill-paragraph将被直接调用(它周围没有让绑定)。尽管有可能fill-prefix最终将其用于此目的,但必须有一些配置变量可以对其进行自动检测。
马拉巴巴

1
@Malabarba看起来markdown-mode实际上是通过段落定义来完成的:gist.github.com/vermiculus/88759fd9f8368adbf663
肖恩·

是的,看起来更像它。
马拉巴巴

2

肖恩(Sean)的要旨为我指明了正确的方向,这是解决该问题的摘录。

(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)))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.