Edición de archivos con una frase por línea

28

Un poco de historia.

Estoy tratando de controlar la versión de mis documentos de látex, y la efectividad de esta iniciativa mejoraría enormemente si adopto un enfoque de una oración por línea .

Por ejemplo, el siguiente es el aspecto que tendrán mis documentos.

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

This is another paragraph.

Mi pregunta es simple
¿Cuánto de eso puedo automatizar / mejorar con Emacs?

Los siguientes dos puntos son lo que tengo en mente.

  1. Mis oraciones son largas , así que necesito ajustar líneas sin llenarlas. Es decir, una oración muy larga debe mostrarse en varias líneas en mi pantalla, pero debe ser una sola línea en el archivo ".tex" . Esto se haría preferiblemente de una manera que no envuelva ecuaciones.

    visual-line-modese ajusta al ancho de la ventana, que es demasiado ancho. Necesito algo que envuelva líneas y limite su ancho a aproximadamente 80 caracteres. Al igual que lo fill-paragraphharía normalmente, pero sin romper realmente las líneas en el archivo.

  2. Puedo romper manualmente la línea después de cada oración, pero sería muy preferible si pudiera configurar fill-paragraph(o tal vez incluso auto-fill-mode) poner una oración por línea también.
Malabarba
fuente
1
¿Qué tipo de mejora / automatización buscas exactamente? ¿Quieres saber cómo editar de manera efectiva en archivos como este?
Rangi Lin
@RangiLin Sí. El primer punto que mencioné es lo más importante para mí. Pero cualquier otra cosa para hacer esto más efectivo es bienvenida.
Malabarba
La descripción en el primer punto se ve así visual-line-mode. Pero además de ese ajuste de línea, también debe insertar automáticamente un carácter de nueva línea después de cada oración, ¿correcto?
Kaushal Modi
@kaushalmodi Sí, pero la nueva línea después de cada oración es real, debe estar en el archivo. El problema con el modo de línea visual es que es demasiado ancho por defecto. Si hay una manera de reducirlo, sería genial.
Malabarba
@Malabarba: ¿Sabes por qué? Para mí, es el modo de envoltura más útil con diferencia ...
Tikhon Jelvis

Respuestas:

11

Si solo quieres algo similar visual-line-modepero configurable, puedes probar longlines-modecuál es el que uso para la mayoría de mi prosa. longlines-modeajusta su texto de manera similar al visual-line-modeancho configurado por fill-column.

Aquí hay una captura de pantalla con fill-columnset to 70(la ventana en realidad se extiende aún más a la derecha).

Un ejemplo de texto de ajuste de modo de palangre.

La configuración fill-paragraphsería ordenada, pero no estoy seguro de cómo hacerlo. En cambio, aquí hay un truco temporal razonable: haz que tu .personaje sea eléctrico en modo TeX, insertando una nueva línea. Esto solo implica volver a vincularlo en cualquier gancho de modo apropiado:

(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
fuente
1
¡Muchas gracias por señalar el modo de palangre! Me las arreglé para que no envolviera ecuaciones e incluso arreglara el aspecto de las líneas sangradas. Aquí está el gist gist.github.com/c532f77144ddf86b4ea4.git
Malabarba
@Malabarba: Genial. ¡Probablemente usaré algunos de esos cambios yo mismo! Sin embargo, su enlace no funciona correctamente; Aquí hay una versión amigable para la web: gist.github.com/Bruce-Connor/c532f77144ddf86b4ea4
Tikhon Jelvis
Gracias. Además, olvidé mencionar que ese consejo utiliza una función del paquete latex-extra.
Malabarba
Por cierto, vale la pena señalar que el modo de palangre está marcado como obsoleto en 24.4 (no es que tenga una alternativa equivalente),
Malabarba
2
El punto eléctrico no funcionará bien porque los puntos no solo se usan para terminar oraciones sino también para todo tipo de otros propósitos. Sería mejor reemplazar un punto seguido de dos espacios por un punto seguido de una nueva línea.
Tmalsburg
13

Para (1), usaría un margen ampliado, para que las visual-line-modelíneas se ajusten a la deseada fill-column. Sin embargo, esto afectará tanto a las líneas de texto como a las ecuaciones.

En cuanto a (2), se puede definir un comando de relleno personalizado para enlazar M-qy rellenar correctamente los párrafos. Todavía no he logrado escribir un comando con el comportamiento correcto para el autocompletado.

Envolver todo esto en un modo menor podría verse de la siguiente manera. No es un código muy bonito, pero debería funcionar en la mayoría de los casos. (He tenido la unfill-paragraphfunción en mi init.eldurante bastante tiempo sin notar problemas).

(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
fuente
El relleno del párrafo funciona muy bien, desearía poder aceptar dos respuestas. Solo reemplace unfill-paragraphcon ospl/unfill-paragraph. Los márgenes también funcionan, pero el texto sangrado se ve mal y también envuelven ecuaciones, mientras que logré hackear el método de palangre a continuación para solucionar estos dos problemas.
Malabarba
Fijo, gracias. Como dije, he tenido unfill-paragraph(sin prefijo) en mi init.eldurante mucho tiempo. Yo sólo prefijado ayer por su consistencia y presenté un error ....
ffevotte
Sí, pensé que era algo así. También me di cuenta de que probablemente podamos completar el párrafo simplemente haciendo algo como (let ((fill-column 1000000)) (fill-pragraph)). Sin embargo, aún no lo he probado.
Malabarba
Sí, tal solución funciona. Simplemente no me gusta tener constantes mágicas (pero mi código tampoco es muy hermoso, por lo que uno podría discutir cuál es mejor ...)
ffevotte
1
Amo esta solución. ¿Hay una manera simple de evitar dividir las líneas comentadas en varias líneas?
Ramprasad
9

¿Se evitarían / ​​resolverían sus problemas de control de versiones si usa git diff --color-words o latexdiff? Entonces puedes mirar las palabras cambiadas.

Sacha Chua
fuente
2
¡Colorear palabras es de hecho hepful! Pero todavía necesito el enfoque olps para ayudar a evitar conflictos al fusionar las contribuciones de otras personas y al revertir los viejos compromisos.
Malabarba
2

Una forma de mejorar esto que he usado (a veces) durante varios años es mostrar oraciones con saltos de línea que fluyen una tras otra doblando los saltos de línea usando las facilidades de tex-fold(una parte de AUCTeX).

Esto significa que esto

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á plegado a

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⁎

Recientemente he reunido esto como un modo menor en un paquete. Quizás alguien más también encuentre esto útil: https://github.com/andersjohansson/tex-fold-linebreaks

Anders Johansson
fuente