Unir líneas dentro de párrafos en vim

13

Supongamos que ha escrito un documento largo en vim con salto de línea automático, por lo que todas las líneas se han dividido en, digamos, 79 caracteres. Incluso puede haber aplicado el formato a todo el documento para romper todas las líneas en esa longitud.

Los párrafos están delimitados en su documento por líneas en blanco.

Ahora decides que no quieres saltos de línea dentro de los párrafos.

¿Cómo puede eliminar todos los saltos de línea dentro de los párrafos sin eliminar por completo los límites de los párrafos?

He hecho este truco rápido e idiota, pero estoy buscando la forma correcta.

:%s/^\s*$/@@@@@ - replace blank lines with @@@@@
ggVGgJ           - join all lines in the file
:%s/@@@@@/\r\r/g   - replace @@@@@ with line breaks
dggoldst
fuente
oye, no lo golpees si tu solución funciona y tu solución funciona.
pdwalker

Respuestas:

12

Creo que esto hace lo que quieres: asegúrate de que haya una línea vacía al final del archivo, luego une cada párrafo (terminado por una línea vacía).

G:a

.
:g/^./ .,/^$/-1 join

Explicación: primero vaya al final del archivo y agregue una línea vacía adicional con :a(tal vez haya una forma más elegante de hacerlo; interactivamente, puede reemplazar las primeras tres líneas con o<ESC>). Luego, para cada línea que no esté en blanco que aún no se haya considerado ( :g/^./), aplique el joincomando al rango que comienza en la línea seleccionada ( .) y termina una línea antes de la siguiente línea vacía ( /^$/-1).

Opcionalmente, :g/^$/dsi no desea que quede ninguna línea en blanco (puede quitar la -1).

Gilles 'SO- deja de ser malvado'
fuente
Gracias. Esto se está acercando mucho a mí, sin embargo, está eliminando las líneas en blanco entre los párrafos. (Intenté fileformat unix y dos para ver si era algo de Windows). Además, ¿podrías traducir un poco los comandos? G va a la última línea. : un acuerdo de ayuda es "agregar" pero no estoy seguro de lo que hace. También el g / patrón / cmd que tienes allí me ha perdido. Cual es el comando?
dggoldst
@dggoldst: he cambiado el comando para retener líneas vacías. Las primeras tres líneas son solo para agregar una línea vacía al final del archivo (de lo contrario, el último párrafo no coincidirá). El último comando es :g, que aplica un comando a todas las líneas coincidentes; vea :help :gy quizás este hilo sobre cómo se :gcomporta cuando elimina saltos de línea .
Gilles 'SO- deja de ser malvado'
:$pu _ al final coloque el registro de agujeros negros, lo que da como resultado una línea en blanco al final.
SergioAraujo
12

Esto debería hacerlo:

:set tw=99999
gggqG

twse establece en un valor al menos tan grande como el número de caracteres en el párrafo más largo. ggmueve el cursor a la primera línea; gqes el comando para formatear; Gmueve el cursor a la última línea, diciéndole gqque vuelva a formatear desde la ubicación actual del cursor hasta la última línea.

garyjohn
fuente
5
  1. Coloque el cursor dentro del párrafo deseado.

  2. Tipo: vipJ

( vipresalta el párrafo actual, June todas las líneas)

Juan
fuente
2

Puede que no sea la forma más limpia de hacerlo, pero esto es lo que usaría:

ggqav}bgJ}wq999@a   # go to the top of the file (gg)
                    # start recording macro "a" (qa)
                    # select the entire paragraph (v})
                    # go back one word so as not to join the blank line (b)
                    # join the selected lines without spaces (gJ)
                    # go to first word of the next paragraph (}w)
                    # finish recording the macro (q)
                    # 999 times (arbitrary number of paragraphs to join)
                    # run macro "a" (@a)

( Obras en VIM 7.2. )

Dependiendo exactamente de cómo se dividieron los párrafos cuando se formatearon originalmente, es posible que desee reemplazar el gJcomando (unir sin espacios) con el Jcomando (unir con espacios).

El 999recuento arbitrario solo debe ser al menos el número de párrafos en el archivo; puede seleccionar un número mayor si lo desea y no perder nada más que ciclos de procesador. Suponiendo una y solo una línea en blanco entre los párrafos, puede obtener un recuento de párrafos más preciso utilizando:

:%s/^$//gn     # returns "999 matches on 999 lines"
goldPseudo
fuente
Esto funciona para mi. Sería bueno agregar un "gg" al principio para colocar el cursor en la parte superior del archivo. Además, usar J en lugar de gJ no hace que las palabras separadas se mezclen en una sola. Este podría ser solo el caso de mis valores de "formatoptions", que actualmente me están desconcertando.
dggoldst