Tengo un archivo de texto bastante grande formado por bloques como
Short line.
Really long line.
Short line.
separados por líneas vacías, y me gustaría usar vim (en Linux) para dividir las líneas largas y obtener bloques como
Short line.
This was
part of
a long line.
Short line.
Mi problema con gq
(y gw
) es que redistribuye cada bloque como un párrafo completo, es decir, no conserva los dos saltos de línea dentro de cada bloque, y de acuerdo con :help fo-table
ninguna de gq
las opciones de formato me permitiría hacer lo que quiero. También pensé que podría lograr mi objetivo si pudiera definir caracteres de nueva línea como delimitadores de párrafo, pero de acuerdo con :help paragraph
ellos están codificados.
Editar: Sé que podría usar gq
o gw
formatear cada línea larga una por una, pero dado que mi archivo se ejecuta en unos pocos miles de líneas, estoy buscando una manera de lograr esto automáticamente.
gq
ygw
. También me alegro de no haberme detenido allí, de lo contrario no habría aprendido sobre el:g
comando. :)Respuestas:
Esto aplica el
normal
comandogww
(que formatea la línea actual como congw
) en todo el búfer, sin tener en cuenta las asignaciones personalizadas (para evitar problemas si, por ejemplo,gw
se ha asignado a otra cosa).Ver
:help :%
:help :norm
:help gww
Esta alternativa es según la sugerencia de Ben en los comentarios, y es más sencilla que la solución original, que se guarda a continuación, ya que podría encajar mejor en otras circunstancias similares debido a la capacidad de coincidencia de expresiones regulares. Sin embargo, en el caso de "coincidir todas las líneas", es innecesariamente bruto.
Aplicando
gww
en cada línea individual en el búfer mediante programación:Ver
:help :g
y:help norm
.^
coincide con el comienzo de una línea, que en la práctica hace que coincida con cada línea.También se puede optar por seleccionar solo líneas de más de, por ejemplo, 60 caracteres con
(ver
:help \%<
), pero en la prácticagww
solo formateará las líneas más tiempo que detextwidth
todos modos, por lo que puede que no importe mucho ni en velocidad ni en resultado.(Estoy usando
v
para "columna virtual" en lugar dec
"columna", ya que este último realmente calcula un cierto número de bytes en la línea. Esto puede conducir a resultados inesperados cuando se usan codificaciones multibyte, lo que a menudo es una razón para desconfiar. En la práctica, no es un problema real por la misma razón que antes, ya quegww
no formateará las líneas más cortas que detextwidth
todos modos).fuente
:g
falla sin un patrón, por lo:g//norm gww
que no funciona pero:g/.*/norm gww
sí.:g//
reutiliza el último patrón de búsqueda; Si no hay ninguno, falla. Use:g/^/
para aplicar a todas las líneas.:help last-pattern
para la búsqueda normal se aplique también al:global
comando.Dado que ya ha leído el manual de las
gq
ygw
los comandos, supongo que es probable que desee algo más conveniente que mover manualmente a las largas filas y luego utilizandogw0
,gw$
u otrogw
comando sólo para dar formato a la línea actual.No conozco una manera fácil de romper largas líneas en Vim sobre un bloque de texto. Sin embargo, como ha mencionado que está usando Vim en un sistema GNU / Linux, le sugiero que filtre su texto a través del
fmt
comando GNU .Para todo el archivo:
Para el párrafo actual (usando opciones cortas):
La explicación de las
fmt
opciones relevantes son:-w, --width=WIDTH
- ancho de línea máximo (predeterminado de 75 columnas). La opción-WIDTH
es una forma abreviada de--width=DIGITS
(si usa esta versión abreviada, debe ser la primera opción).-s, --split-only
- dividir líneas largas, pero no rellenar; Esta es la opción que conserva los saltos de línea dura preexistentes.fuente
fmt
. Sin embargo, preferí aceptar la otra respuesta, porque solo requiere vim.Desde:
Poniendo el marcador en la línea "lorem ipsum" y presionando los
gww
rendimientos (contextwidth=40
mayor claridad):que a mí me parece lo que estás pidiendo. Si no, no dude en aclarar.
fuente