Modification de fichiers avec une phrase par ligne

28

Un peu d'histoire.

J'essaie de contrôler la version de mes documents en latex, et l'efficacité de cette initiative serait grandement améliorée si j'adoptais une approche d' une phrase par ligne .

Par exemple, voici à quoi ressembleront mes documents.

Some text here.
New stencence on the same paragraph.
Some more text, still on the same paragraph.

This is another paragraph.

Ma question est simple.
Dans quelle mesure puis-je automatiser / améliorer avec Emacs?

Je pense aux deux points suivants.

  1. Mes phrases sont longues , je dois donc envelopper les lignes sans vraiment les remplir. Autrement dit, une très longue phrase doit être affichée sur plusieurs lignes sur mon écran, mais elle doit être une seule ligne dans le fichier «.tex» . Cela se ferait de préférence d'une manière qui n'emballe pas les équations.

    visual-line-modeenveloppe à la largeur de la fenêtre, qui est trop large. J'ai besoin de quelque chose qui enveloppe les lignes et limite leur largeur à environ 80 caractères. Tout comme le fill-paragraphferait normalement, mais sans réellement briser les lignes du fichier.

  2. Je peux couper manuellement la ligne après chaque phrase, mais il serait hautement préférable de configurer fill-paragraph(ou peut-être même auto-fill-mode) de mettre également une phrase par ligne.
Malabarba
la source
1
Quel type d'amélioration / d'automatisation recherchez-vous exactement? Voulez-vous savoir comment modifier efficacement des fichiers comme celui-ci?
Rangi Lin
@RangiLin Oui. Le premier point que j'ai mentionné est la chose la plus importante pour moi. Mais toute autre chose pour rendre cela plus efficace est la bienvenue.
Malabarba
La description au premier point ressemble visual-line-mode. Mais en plus de ce retour à la ligne, vous devez également insérer automatiquement un caractère de nouvelle ligne après chaque phrase, n'est-ce pas?
Kaushal Modi
@kaushalmodi Oui, mais la nouvelle ligne après chaque phrase est réelle, elle devrait être dans le fichier. Le problème avec le mode ligne visuelle est qu'il est tout simplement trop large par défaut. S'il y a un moyen de le réduire, ce serait formidable.
Malabarba
@Malabarba: Savez-vous pourquoi? Pour moi, c'est de loin le mode d'emballage le plus utile ...
Tikhon Jelvis

Réponses:

11

Si vous voulez juste quelque chose comme visual-line-modemais configurable, vous pouvez essayer longlines-modece que j'utilise pour la plupart de ma prose. longlines-modeenveloppe votre texte de la même manière visual-line-modequ'avec la largeur configurée par fill-column.

Voici une capture d'écran fill-columndéfinie sur 70(la fenêtre s'étend en fait encore plus vers la droite).

Un exemple de texte d'habillage en mode palangres.

La configuration fill-paragraphserait bien, mais je ne sais pas comment le faire. Au lieu de cela, voici un hack temporaire raisonnable: rendez votre .personnage électrique en mode TeX, en insérant une nouvelle ligne. Cela implique simplement de le relier dans le hook de mode approprié:

(defun my-electric-dot ()
  (interactive)
  (insert ".\n"))
(defun my-tex-hook ()
  (local-set-key (kbd ".") 'my-electric-dot))
(add-hook 'TeX-mode-hook 'my-tex-hook)
Tikhon Jelvis
la source
1
Merci beaucoup d'avoir souligné le mode palangre! J'ai réussi à ne pas envelopper les équations et même à corriger l'apparence des lignes en retrait. Voici l'essentiel gist.github.com/c532f77144ddf86b4ea4.git
Malabarba
@Malabarba: Cool. J'utiliserai probablement certains de ces changements moi-même! Votre lien ne fonctionne pas correctement cependant; voici une version Web: gist.github.com/Bruce-Connor/c532f77144ddf86b4ea4
Tikhon Jelvis
Merci. Aussi, j'ai oublié de mentionner que les conseils utilisent une fonction du package latex-extra.
Malabarba
Par ailleurs, il convient de noter que le mode palangres est marqué comme obsolète en 24.4 (pas qu'il ait une alternative équivalente),
Malabarba
2
Le point électrique ne fonctionnera pas bien car les points ne sont pas seulement utilisés pour terminer des phrases mais aussi pour toutes sortes d'autres fins. Il serait préférable de remplacer un point suivi de deux espaces par un point suivi d'une nouvelle ligne.
tmalsburg
13

Pour (1), j'utiliserais une marge agrandie, de sorte que les visual-line-modelignes s'enroulent au niveau souhaité fill-column. Cela affectera à la fois les lignes de texte et les équations.

Comme pour (2), on peut définir une commande de remplissage personnalisée à lier M-qet à remplir correctement les paragraphes. Je n'ai pas encore réussi à écrire une commande avec le comportement correct pour le remplissage automatique.

Envelopper tout cela dans un mode mineur pourrait ressembler à ce qui suit. Ce n'est pas un très beau code, mais devrait fonctionner dans la plupart des cas. (J'ai la unfill-paragraphfonction dans mon init.eldepuis un certain temps sans remarquer de problèmes).

(define-minor-mode ospl-mode
  "One Sentence Per Line"
  :init-value nil
  :lighter " ospl"
  :keymap (let ((map (make-sparse-keymap)))
            (define-key map (kbd "M-q") 'ospl/fill-paragraph)
            map)

  (if ospl-mode
      (progn
        (visual-line-mode 1)
        (setq right-margin-width (- (window-body-width) fill-column)))
    (visual-line-mode -1)
    (setq right-margin-width 0))

  ;; Account for new margin width
  (set-window-buffer (selected-window) (current-buffer)))


(defun ospl/unfill-paragraph ()
  "Unfill the paragraph at point.

This repeatedly calls `join-line' until the whole paragraph does
not contain hard line breaks any more."
  (interactive)
  (forward-paragraph 1)
  (forward-paragraph -1)
  (while (looking-at paragraph-start)
    (forward-line 1))
  (let ((beg (point)))
    (forward-paragraph 1)
    (backward-char 1)
    (while (> (point) beg)
      (join-line)
      (beginning-of-line))))


(defun ospl/fill-paragraph ()
  "Fill the current paragraph until there is one sentence per line.

This unfills the paragraph, and places hard line breaks after each sentence."
  (interactive)
  (save-excursion
    (fill-paragraph)         ; takes care of putting 2 spaces if needed
    (ospl/unfill-paragraph)  ; remove hard line breaks

    ;; insert line breaks again
    (let ((end-of-paragraph (make-marker)))
      (save-excursion
        (forward-paragraph)
        (backward-sentence)
        (forward-sentence)
        (set-marker end-of-paragraph (point)))
      (forward-sentence) 
      (while (< (point) end-of-paragraph)
        (just-one-space)
        (delete-backward-char 1)
        (newline)
        (forward-sentence))
      (set-marker end-of-paragraph nil)))) 
ffevotte
la source
Le remplissage de paragraphe fonctionne très bien, j'aimerais pouvoir accepter deux réponses. Remplacez simplement unfill-paragraphpar ospl/unfill-paragraph. Les marges fonctionnent également, mais le texte en retrait semble mauvais et ils encapsulent également les équations, alors que j'ai réussi à pirater la méthode des palangres ci-dessous pour résoudre ces deux problèmes.
Malabarba
Fixé, merci. Comme je l'ai dit, j'ai unfill-paragraph(non préfixé) dans mon init.eldepuis longtemps. Je l'ai juste préfixé hier pour plus de cohérence et introduit un bug ....
ffevotte
Ouais, je pensais que c'était quelque chose comme ça. J'ai également réalisé que nous pouvons probablement remplir le paragraphe en faisant simplement quelque chose comme (let ((fill-column 1000000)) (fill-pragraph)). Je ne l'ai pas encore testé.
Malabarba du
Oui, une telle solution fonctionne. Je n'aime tout simplement pas avoir des constantes magiques (mais mon code n'est pas très beau non plus, donc on pourrait dire ce qui est mieux ...)
ffevotte
1
J'adore cette solution. Existe-t-il un moyen simple d'éviter de casser des lignes commentées en plusieurs lignes?
Ramprasad
9

Vos problèmes de contrôle de version seraient-ils évités / résolus si vous utilisez git diff --color-words ou latexdiff? Ensuite, vous pouvez regarder les mots modifiés.

Sacha Chua
la source
2
Les mots à colorier sont vraiment utiles! Mais j'ai toujours besoin de l' approche olps pour éviter les conflits lors de la fusion des contributions des autres et lors du rétablissement des anciens commits.
Malabarba du
2

Une façon d'améliorer cela que j'utilise (parfois) depuis plusieurs années est d'afficher des phrases avec des sauts de ligne qui s'écoulent les uns après les autres en pliant les sauts de ligne en utilisant les fonctionnalités de tex-fold(une partie d'AUTCTeX).

Cela signifie que ce

Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Mauris pellentesque fringilla justo, quis dapibus velit tincidunt quis?
Quisque varius ligula arcu, ut imperdiet risus maximus nec.

est plié

Lorem ipsum dolor sit amet, consectetur adipiscing elit⁎ Mauris pellentesque fringilla justo, quis dapibus velit tincidunt quis❓  Quisque varius ligula arcu, ut imperdiet risus maximus nec⁎

J'ai récemment mis cela ensemble en tant que mode mineur dans un package. Peut-être que quelqu'un d'autre trouvera également cela utile: https://github.com/andersjohansson/tex-fold-linebreaks

Anders Johansson
la source