Bagaimana cara mengisi wilayah / paragraf mengidentifikasi awalan paragraf?

11

Katakanlah saya memiliki buffer berikut.

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

Memukul di M-qsini saat text-modemengarah ke yang berikut.

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

Di sisi lain, jika saya mengaktifkan markdown-mode, saya mendapatkan yang berikut (Penurunan harga hanyalah sebuah contoh, Anda melihat perilaku serupa di berbagai mode).

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

Bagaimana cara mengkonfigurasi mode teks untuk melakukan itu?

Saya membayangkan ini dapat dicapai dengan menulis khusus fill-paragraph-function, tetapi variabel ini hanya diatur ke nildalam markdown-mode, jadi mungkin ada cara yang lebih mudah.

Malabarba
sumber

Jawaban:

6

Saya sudah lama menjadi pengguna filladapt-mode, yang menangani hal semacam ini dengan sangat baik. Untuk info, lihat

http://emacswiki.org/emacs/FillAdapt

Dari halaman itu:

Filladapt oleh KyleJones meningkatkan fungsi isian Emacs dengan menebak awalan isian, seperti urutan komentar dalam kode program, dan menangani poin-poin seperti "1." atau "*".

Misalnya, ini bisa mengubah ini

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

ke

* Pretend I'm a really super
  long line.
* And the window's narrow.
Chris
sumber
Oke, diedit untuk mengatasi itu.
Chris
untuk mengaktifkan mode ini bersamaan dengan mode lain, tambahkan sesuatu seperti (add-hook 'org-mode-hook 'turn-on-filladapt-mode)ke file konfigurasi Anda (info ini tidak tersedia secara langsung di halaman wiki yang ditautkan).
Markus
Berfungsi dengan baik untuk membuat fill-paragraphberperilaku dengan benar di dalam blockquotes markdown-mode.
Radon Rosborough
2 tahun telah berlalu sejak jawabannya. Unduh tautan wonderworks.com/download/filladapt.el tidak lagi tersedia.
Tankman 六四
Tautan ini berfungsi untuk saya sekarang. Mungkin ada masalah sementara dengan situs tersebut.
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-modemungkin set fill-paragraph-functionke nilsehingga penggunaan fungsi fill-prefixuntuk melakukan pengisian.

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

Contoh lengkap:

(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 "
Sean Allred
sumber
1
+ msgstr "mode penurunan harga mungkin mengatur fungsi fill-paragraf ke nil sehingga fungsi tersebut menggunakan fill-prefix untuk melakukan pengisian." Itu tidak mungkin keseluruhan cerita. Ketika saya menekan M-q, fill-paragraphdipanggil langsung (tidak ada let-bind di sekitarnya). Meskipun mungkin yang fill-prefixpada akhirnya digunakan untuk tujuan ini, harus ada beberapa variabel konfigurasi yang memungkinkannya untuk dideteksi secara otomatis.
Malabarba
1
@Malabarba Sepertinya markdown-modebenar - benar melakukan ini melalui definisi paragraf: gist.github.com/vermiculus/88759fd9f8368adbf663
Sean Allred
Ya, itu lebih terlihat seperti itu.
Malabarba
2

Inti Sean menunjuk saya ke arah yang benar, dan inilah cuplikan yang memecahkannya.

(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)))
Malabarba
sumber