Dolgu bölgesi / paragrafın bir paragraf önekini tanımlaması nasıl yapılır?


11

Diyelim ki şu arabelleğe sahibim.

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

M-qBurada iken vurmak text-modeaşağıdakilere yol açar.

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

Öte yandan, etkinleştirirsem markdown-modeaşağıdakileri elde ederim (Markdown sadece bir örnektir, çeşitli modlarda benzer davranışlar görürsünüz).

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

Metin modunu bunun için nasıl yapılandırabilirim?

Bunun bir special yazma elde edilebilir hayal fill-paragraph-function, ama bu değişken sadece ayarlandığında nilin markdown-modeyüzden muhtemelen daha kolay bir yolu var.

Yanıtlar:


6

Uzun zamandır filladapt modunun mutlu bir kullanıcısıyım, bu tür şeyleri gerçekten güzel idare ediyor. Bilgi için bkz.

http://emacswiki.org/emacs/FillAdapt

Bu sayfadan:

KyleJones tarafından yapılan Filladapt, program kodundaki yorum dizisi gibi bir dolgu önekini tahmin ederek ve “1” gibi madde işaretlerini işleyerek Emacs'ın dolgu işlevlerini geliştirir. veya “*”.

Örneğin,

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

içine

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

Tamam, bunu ele almak için düzenlendi.
Chris

bu modu başka bir modla birlikte etkinleştirmek (add-hook 'org-mode-hook 'turn-on-filladapt-mode)için yapılandırma dosyanıza benzer bir şey ekleyin (bu bilgi doğrudan bağlantılı wiki sayfasında mevcut değildir).
Mark

fill-paragraphBlockquotes içinde düzgün davranmak için güzel çalışıyor markdown-mode.
Radon Rosborough

Cevabın üzerinden 2 yıl geçti. İndirme bağlantısı wonderworks.com/download/filladapt.el artık mevcut değil.
Tankman 六四

Bağlantı şu anda benim için çalışıyor. Belki siteyle ilgili geçici bir sorun vardı.
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-modemuhtemelen setleri fill-paragraph-functioniçin nilöylesine işlev kullandığı bu fill-prefixdolum yapmak.

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

Tam örnek:

(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 muhtemelen doldurma-paragraf-işlevini nil olarak ayarlar, böylece işlev doldurma yapmak için dolgu önekini kullanır." Bütün hikaye bu olamaz. Ben vurduğunda M-q, fill-paragraph(orada let-bağlama etrafında hiçbir oluyor) doğrudan çağrılır. fill-prefixNihayetinde bu amaç için kullanılması mümkün olsa da , otomatik olarak algılanmasını sağlayan bazı yapılandırma değişkenleri olmalıdır.
Malabarba

1
@Malabarba markdown-modeAslında bunu paragraf tanımları aracılığıyla yapıyor gibi görünüyor : gist.github.com/vermiculus/88759fd9f8368adbf663
Sean Allred

Evet, daha çok benziyor.
Malabarba

2

Sean'ın özü beni doğru yöne çekti ve işte onu çözen snippet.

(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)))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.