Come fare in modo che la regione di riempimento / paragrafo identifichi un prefisso di paragrafo?


11

Diciamo che ho il seguente buffer.

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

Colpire M-qqui mentre ci si trova nel text-modeseguito.

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

D'altra parte, se attivo markdown-mode, ottengo quanto segue (Markdown è solo un esempio, vedi un comportamento simile in varie modalità).

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

Come configuro la modalità testo per farlo?

Immagino che questo si può ottenere scrivendo uno speciale fill-paragraph-function, ma questa variabile è appena impostata nilin markdown-mode, quindi probabilmente c'è un modo più semplice.

Risposte:


6

Sono stato un utente felice della modalità filladapt per molto tempo, che gestisce questo tipo di cose davvero bene. Per informazioni, vedi

http://emacswiki.org/emacs/FillAdapt

Da quella pagina:

Filladapt di KyleJones migliora le funzioni di riempimento di Emacs indovinando un prefisso di riempimento, come una sequenza di commenti nel codice del programma, e gestendo punti elenco come "1". o "*".

Ad esempio, potrebbe trasformarlo

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

in

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

Ok, modificato per risolverlo.
Chris,

per abilitare questa modalità in combinazione con un'altra modalità, aggiungi qualcosa di simile (add-hook 'org-mode-hook 'turn-on-filladapt-mode)al tuo file di configurazione (questa informazione non è direttamente disponibile sulla pagina wiki collegata).
Segna il

Funziona magnificamente per fill-paragraphcomportarsi correttamente all'interno di blockquotes in markdown-mode.
Radon Rosborough,

Sono trascorsi 2 anni dalla risposta. Il link per il download wonderworks.com/download/filladapt.el non è più disponibile.
Tankman 六四

Il link funziona per me in questo momento. Forse si è verificato un problema temporaneo con il sito.
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-modepresumibilmente impostato fill-paragraph-functionsu in nilmodo che la funzione utilizzi fill-prefixper eseguire il riempimento.

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

Esempio completo:

(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
"presumibilmente markdown-mode imposta la funzione fill-paragraph su zero in modo che la funzione utilizzi il prefisso fill per eseguire il riempimento." Non può essere l'intera storia. Quando premo M-q, fill-paragraphviene invocato direttamente (non c'è alcun vincolo). Sebbene sia possibile che alla fill-prefixfine venga utilizzato per questo scopo, è necessario che vi siano alcune variabili di configurazione che ne consentano il rilevamento automatico.
Malabarba,

1
@Malabarba Sembra markdown-modeeffettivamente farlo tramite le definizioni dei paragrafi: gist.github.com/vermiculus/88759fd9f8368adbf663
Sean Allred

Sì, sembra più simile.
Malabarba,

2

L'essenza di Sean mi ha indicato la giusta direzione, ed ecco lo snippet che l'ha risolto.

(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)))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.