Comment faire en sorte que fill-region / paragraph identifie un préfixe de paragraphe?

11

Disons que j'ai le tampon suivant.

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

Frapper M-qici pendant qu'il text-modemène mène à ce qui suit.

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

D'un autre côté, si j'active markdown-mode, j'obtiens ce qui suit (Markdown n'est qu'un exemple, vous voyez un comportement similaire dans différents modes).

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

Comment configurer le mode texte pour cela?

J'imagine que cela peut être réalisé en écrivant un spécial fill-paragraph-function, mais cette variable est juste définie sur nilin markdown-mode, donc il y a probablement un moyen plus simple.

Malabarba
la source

Réponses:

6

Je suis un utilisateur heureux du mode filladapt depuis longtemps, qui gère très bien ce genre de chose. Pour info, voir

http://emacswiki.org/emacs/FillAdapt

De cette page:

Filladapt par KyleJones améliore les fonctions de remplissage d'Emacs en devinant un préfixe de remplissage, comme une séquence de commentaires dans le code du programme, et en gérant les puces comme «1.» ou "*".

Par exemple, cela pourrait transformer ce

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

dans

* Pretend I'm a really super
  long line.
* And the window's narrow.
Chris
la source
Ok, modifié pour y remédier.
Chris
pour activer ce mode conjointement avec un autre mode, ajoutez quelque chose comme (add-hook 'org-mode-hook 'turn-on-filladapt-mode)à votre fichier de configuration (cette information n'est pas directement disponible sur la page wiki liée).
Mark
Fonctionne à merveille pour faire fill-paragraphse comporter correctement dans les citations de blocs dans markdown-mode.
Radon Rosborough
2 ans se sont écoulés depuis la réponse. Le lien de téléchargement wonderworks.com/download/filladapt.el n'est plus disponible.
Tankman
Le lien fonctionne pour moi en ce moment. Il y a peut-être eu un problème temporaire avec le site.
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-modevraisemblablement défini fill-paragraph-functionsur nilafin que la fonction utilise fill-prefixpour effectuer le remplissage.

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

Exemple complet:

(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
la source
1
"Le mode Markdown définit vraisemblablement la fonction fill-paragraph à nil afin que la fonction utilise le préfixe fill pour effectuer le remplissage." Ça ne peut pas être toute l'histoire. Quand je frappe M-q, fill-paragraphest invoqué directement (il n'y a pas de let-bind autour). Bien qu'il soit possible qu'il fill-prefixsoit finalement utilisé à cette fin, il doit y avoir une variable de configuration qui lui permette d'être détectée automatiquement.
Malabarba
1
@Malabarba On dirait que cela markdown-modese fait via les définitions de paragraphe: gist.github.com/vermiculus/88759fd9f8368adbf663
Sean Allred
Oui, ça y ressemble plus.
Malabarba
2

L'essentiel de Sean m'a pointé dans la bonne direction, et voici l'extrait de code qui l'a résolu.

(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
la source