Comment puis-je diviser un paragraphe en une ligne par phrase tout en le gardant visuellement enveloppé?

14

Ceci est similaire à l' édition de fichiers avec une phrase par ligne (dans la fonction et le motif), mais je souhaite avoir un paragraphe complet et fluide plutôt que des sauts visuels à chaque phrase.

Je voudrais avoir un mode mineur qui, lorsqu'il est actif, joindra visuellement les lignes du même paragraphe (non séparés par \n\nou paragraph-separateou ...) puis activera un comportement (peut-être dérivé de visual-line-mode) qui encapsulera la ligne sans réellement l'insérer \n.

Existe-t-il un tel mode? Sinon, comment procéder pour modifier les propriétés d'affichage d'un paragraphe afin d'obtenir le résultat? (Après tout, c'est le nœud d'un tel mode et un pourrait être développé à partir de l'extrait.)

Sean Allred
la source
[...] se joindra visuellement [...]. Voulez-vous dire conserver le sous-jacent \n(s'il est présent), ou voulez-vous qu'il supprime réellement les sauts de ligne pour fournir 1 paragraphe par ligne?
Jonathan Leech-Pepin
1
Vous pouvez peut-être utiliser le buffer-display-tablepour faire apparaître les nouvelles lignes \ncomme des espaces ou quelque chose - voir l'exemple suivant dans le lien: stackoverflow.com/a/24842771/2112489 L'avantage avec cela serait que le texte dans le le document n'est pas modifié. La nouvelle ligne peut être à peu près n'importe quoi - par exemple, un visage souriant, des espaces, un symbole de pilcrow, etc. L'effet visuel est que l'enveloppement se produira.
lawlist
@ JonathanLeech-Pepin Je veux garder les nouvelles lignes là où elles sont présentes. En fait, je voudrais forcer la nouvelle ligne sur une fin de phrase, mais cela peut être fait via un crochet séparé.
Sean Allred
1
@lawlist l'effet visuel est que les nouvelles lignes disparaîtront partout, n'est-ce pas? Tous les paragraphes ne seront-ils pas regroupés en un seul?
Malabarba du
1
Je suis favorable à cette demande, mais je pense que le mode mineur décrit par OP n'est pas la bonne solution. Le problème sous-jacent est que diff ne fonctionne pas bien pour le texte car il a été conçu pour le code. Contournement de ce problème dans Emacs est une solution possible mais pas propre pour diverses raisons. Il serait bien préférable d'améliorer diff pour bien travailler avec du texte.
tmalsburg

Réponses:

3

Comme l'a dit Tom, mettre une propriété d'affichage sur les nouvelles lignes sera un travail.

Le problème est de savoir quelles lignes envelopper.

Voici un exemple pour vous aider à démarrer:

(let ((eol-regexp "[[:graph:]] ?\\(\n\\)[^\t\n ]"))
  (font-lock-add-keywords nil
   `((,eol-regexp 1 '(face default display " ")))))

(visual-line-mode 1)

Cela "supprimera" les nouvelles lignes si elles sont précédées de caractères graphiques et si la ligne suivante n'est pas en retrait ou vide. Vous devrez expérimenter pour trouver quelque chose qui vous convient.

Quelques explications supplémentaires:

  1. font-lock-add-keywordsajoute une liste de règles au verrouillage des polices (le verrouillage des polices doit donc être activé. Le premier argument peut être un mode (par exemple text-mode); dans notre cas, il est nul, ce qui signifie ajouter la règle uniquement pour le tampon actuel.
  2. Notre «règle» est (,eol-regexp 1 '(face default display " ")). Le premier élément est l'expression régulière que nous avons construite plus tôt; la seconde est la sous-expression qui nous intéresse; le troisième est le "visage" que nous voulons appliquer.
  3. Bien que l'utilisation d'un visage pour les nouvelles lignes ne nous soit d'aucune utilité, nous pouvons également ajouter des propriétés de texte. Nous utilisons donc la face par défaut et que nous ajoutons une propriété d'affichage qui remplace la sous-chaîne 1 (c'est-à-dire la nouvelle ligne) par un espace.
  4. Si vous vous tirez une balle dans le pied, supprimez le tampon ou supprimez le mot-clé avec font-lock-remove-keywords.
  5. Vous pourriez également vouloir ajouter displayà font-lock-extra-managed-props(je n'ai pas essayé ceci).
  6. La partie délicate est d'obtenir la bonne expression rationnelle. "\ (\ n \) [^ \ n]" correspondrait à toute nouvelle ligne qui n'est pas immédiatement suivie d'une autre. ". \ {30, \} \ (\ n \)" ne correspondrait qu'aux sauts de ligne précédés d'au moins 30 caractères.
olaf b
la source
On peut trouver une implémentation de ce qui précède sous forme de package sur github.com/andersjohansson/tex-fold-linebreaks
zakkak
0

Si je comprends bien le problème, c'est que vous souhaitez conserver toutes les nouvelles lignes dans le tampon telles qu'elles sont; mais vous souhaitez en afficher certains sous forme d'espaces. Ensuite, vous souhaitez un habillage de mots.

Pour l'habillage de mots, je pense que vous pouvez utiliser visual-line-mode.

Pour traiter les retours à la ligne, je pense que vous pourriez peut-être mettre une displaypropriété avec " "(une chaîne composée d'un seul espace) comme valeur sur les retours à la ligne que vous souhaitez afficher différemment.

Tom Tromey
la source