fill-region / paragraphに段落接頭辞を特定させる方法は?


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

それを行うにはテキストモードをどのように設定しますか?

これは特別なを書くことで達成できると思いfill-paragraph-functionますが、この変数はnilin markdown-modeに設定されているだけなので、おそらくもっと簡単な方法があります。

回答:


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.

OK、それに対処するために編集されました。
Chris

このモードを別のモードと組み合わせて有効にする(add-hook 'org-mode-hook 'turn-on-filladapt-mode)には、設定ファイルに次のようなものを追加します(この情報はリンクされたWikiページでは直接利用できません)。
マーク

fill-paragraphブロッククォート内で適切に動作するように美しく機能しますmarkdown-mode
Radon Rosborough 2017年

回答から2年が経ちました。ダウンロードリンクwonderworks.com/download/filladapt.elは使用できなくなりました。
タンクマン六四2017

リンクは今私のために機能します。サイトに一時的な問題があったのかもしれません。
クリス

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
「markdown-modeは、おそらくfill-paragraph-functionをnilに設定して、関数がfill-prefixを使用して埋め込みを行うようにします。」それだけでは話になりません。を押すとM-qfill-paragraphが直接呼び出されます(その周りにバインドすることはありません)。fill-prefixこれが最終的にこの目的で使用される可能性はありますが、自動検出できるようにするいくつかの構成変数が必要です。
マラバルバ2015

1
@Malabarbaはmarkdown-mode実際には段落の定義を介してこれを行うように見えます:gist.github.com/vermiculus/88759fd9f8368adbf663
Sean Allred

はい、それはもっとそれに似ています。
マラバルバ2015

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.