¿Cómo puedo dividir el párrafo en una línea por oración pero aún así mantenerlo envuelto visualmente?

14

Esto es similar a la edición de archivos con una oración por línea (tanto en función como en motivo), pero deseo tener un párrafo completo y fluido en lugar de saltos visuales en cada oración.

Me gustaría tener un modo menor que, cuando esté activo, unirá visualmente líneas del mismo párrafo (no separadas por \n\no paragraph-separateo ...) y luego activará un comportamiento (quizás derivado de visual-line-mode) que envolverá la línea sin insertarla realmente \n.

¿Existe tal modo? Si no es así, ¿cómo realizaría el proceso de alterar las propiedades de visualización de un párrafo para lograr el resultado? (Después de todo, este es el quid de este modo y uno podría desarrollarse a partir del fragmento).

Sean Allred
fuente
[...] se unirá visualmente [...]. ¿Te refieres a mantener el subyacente \n(si está presente), o quieres que realmente elimine las nuevas líneas para proporcionar 1 párrafo por línea?
Jonathan Leech-Pepin
1
Tal vez podría usar el buffer-display-tablepara hacer que las nuevas líneas \nparezcan algo más como espacios o algo; vea el siguiente ejemplo en el enlace: stackoverflow.com/a/24842771/2112489 La ventaja con esto sería que el texto en el El documento no se modifica. La nueva línea puede ser casi cualquier cosa, por ejemplo, una carita sonriente, espacios, un símbolo de pilcrow, etc. El efecto visual es que se producirá una envoltura.
ley
@ JonathanLeech-Pepin Quiero mantener las nuevas líneas donde estén presentes. De hecho, me gustaría forzar la nueva línea en el final de una oración, pero esto se puede hacer a través de un gancho separado.
Sean Allred
1
@lawlist, el efecto visual es que las nuevas líneas desaparecerán en todas partes, ¿no? ¿No se colapsarán todos los párrafos en uno?
Malabarba
1
Comprendo esta solicitud, pero creo que el modo menor descrito por OP no es la solución correcta. El problema subyacente es que diff no funciona bien para el texto, ya que fue diseñado para el código. Evitar este problema en Emacs es una solución posible pero no limpia por varias razones. Sería mucho mejor mejorar diff para trabajar bien con texto.
Tmalsburg

Respuestas:

3

Como dijo Tom, poner una propiedad de visualización en las nuevas líneas funcionará.

El problema es averiguar qué líneas ajustar.

Aquí hay un ejemplo para comenzar:

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

(visual-line-mode 1)

Esto "eliminará" las nuevas líneas si está precedido por caracteres gráficos y la siguiente línea no está sangrada o vacía. Tendrá que experimentar para encontrar algo que funcione para usted.

Algunas explicaciones más:

  1. font-lock-add-keywordsagrega una lista de reglas para el bloqueo de fuentes (por lo que el bloqueo de fuentes debe estar habilitado. El primer argumento puede ser un modo (por ejemplo text-mode); en nuestro caso es nulo, lo que significa agregar la regla solo para el búfer actual.
  2. Nuestra "regla" es (,eol-regexp 1 '(face default display " ")). El primer elemento es la expresión regular que construimos anteriormente; el segundo es la subexpresión que nos interesa; el tercero es la "cara" que queremos aplicar.
  3. Si bien usar una cara para las nuevas líneas no nos sirve, también podemos agregar propiedades de texto. Entonces usamos la cara predeterminada y luego agregamos una propiedad de visualización que reemplaza la subcadena 1 (es decir, la nueva línea) con un espacio.
  4. Si se dispara en el pie, elimine el búfer o elimine la palabra clave con font-lock-remove-keywords.
  5. También es posible que desee agregar displaya font-lock-extra-managed-props(no he intentado esto).
  6. La parte difícil es acertar con la expresión regular. "\ (\ n \) [^ \ n]" coincidiría con cualquier nueva línea que no sea seguida inmediatamente por otra. ". \ {30, \} \ (\ n \)" solo coincidiría con las nuevas líneas precedidas por al menos 30 caracteres.
olaf b
fuente
Uno puede encontrar una implementación de lo anterior como un paquete en github.com/andersjohansson/tex-fold-linebreaks
zakkak
0

Si entiendo el problema correctamente, es que desea conservar todas las nuevas líneas en el búfer como están; pero le gustaría mostrar algunos de ellos como espacios. Entonces, te gustaría envolver palabras.

Para envolver palabras, creo que puedes usar visual-line-mode.

Para tratar con las nuevas líneas, creo que quizás podría poner una displaypropiedad con " "(una cadena que consiste en un solo espacio) como valor en las nuevas líneas que desea mostrar de manera diferente.

Tom Tromey
fuente