En VIM, ¿cómo divido una línea realmente larga en varias líneas?

170

Digamos que tengo una línea super larga en el editor VIM (digamos alrededor de más de 300 caracteres). ¿Cómo dividiría eso en varias líneas para que los límites de las palabras se rompan aproximadamente en 80 caracteres?

Ejemplo:

This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line

a

This is a really long line 
This is a really long line
This is a really long line
This is a really long line
This is a really long line
This is a ...
Jordan Parmer
fuente

Respuestas:

254

Vim hace esto muy fácil (romper líneas en los límites de las palabras).

gq{motion} % format the line that {motion} moves over
{Visual}gq % format the visually selected area
gqq        % format the current line
...

Te sugiero que eches un vistazo :help gqy :help gw.

También establecer textwidth ( tw) le dará un salto de línea automático cuando se exceda durante la escritura. También se usa gq, aunque si se deshabilita se gqrompe el tamaño de la ventana o 79, dependiendo de cuál sea el primero.

:set tw=80

Al configurar las opciones de formato para incluir el ancho de texto, vim se romperá automáticamente en la configuración tw.

:set fo+=t
he_the_great
fuente
55
Entonces, para su caso, el gqcomando sería <ESC>(salir del modo Insertar / Reemplazar / etc.), luegogq80l
MidnightLightning
66
Esto es lo opuesto a Ctrl + j (combina varias líneas en una).
Yzmir Ramirez
9
Vim nunca deja de sorprenderme. Esto es oro puro.
Jondlm
10
solo para la siguiente persona que encuentre esto, gq solo no dividirá una línea de texto sólido, necesita espacios en blanco para hacer lo suyo
stringy05
2
[corre gqq] aaaahhh, es hermoso
underscore_d
85

Primero configure su vim para que comprenda que desea 80 caracteres:

:set tw=80

entonces, crepúsculo la línea:

V

y haz que vim lo reformatee:

gq

fuente
17

Esto no está realmente relacionado con VIM, pero podría usar el programa fmt como en

$ fmt myfile
Wernsey
fuente
38
:%! fmt% "Puede hacerlo vim relacionado :)
Maxim Sloyko
2
Útil para vi, aunque preferiría gqq en vim.
WhyNotHugo
13

Para líneas continuas de texto, resalte el área usando v en modo normal, luego presione

:s/\v(.{80})/\1\r/g

Esto agregará una nueva línea al final de cada 80 caracteres.

:s/       replaces within the current select
\v        uses regular expressions
(.{80})   selects 80 characters & placed them into group one
\1\r      replaces group one with group one and a newline
ahumado
fuente
Esta es la única solución que funcionó para una larga cadena base64.
jviotti
6

Si estás en * nix, probablemente tengas folddisponible.

Seleccione la región que desea usar v, luego puede dividir espacios en el ancho 80 usando:

!fold --spaces --width=80

Esto es esencialmente lo mismo que usar gq.

Sin embargo, si solo desea romper en el carácter 80 y no limitarse a espacios en blanco, puede usar:

!fold --width=80

Si lo desea con solo presionar una tecla, simplemente configure una asignación: he usado

vmap <f1> !fold --width=80<CR>

Michael Anderson
fuente
Esta es la respuesta que funciona para cadenas largas no separadas por espacios en blanco. Sin embargo, en macOS puede que necesite usar gfold en lugar de fold.
Aaron D
en mac os, tuve que hacerlo! fold -w 80
user674669
5

Para dividir líneas largas en el documento completo sin eliminar los saltos de línea ya presentes, use:

:set formatoptions+=w
:set tw=80
gggqG
Olivier Faucheux
fuente
4

Necesitaba formatear un archivo completo en lugar de una línea. Como señala Wernsey, podría haber usado 'fmt', pero la siguiente secuencia en vim también funcionó (tomando prestado de las diversas respuestas aquí):

<ESC>
:setl tw=80 fo=t
1GVGgq
John Rix
fuente
3

Como rápido y desagradable, quizás pruebe el siguiente mapa:

map q 080lwbels<CR><ESC>

que dice:

  • comenzar una posición 0 de línea,
  • pasar al 80º char a la derecha,
  • ir al comienzo de la siguiente palabra,
  • volver a la palabra anterior
  • ir al final de la palabra actual,
  • ir un char a la derecha, y
  • sustituir un CR por ese personaje.

Luego, presionando q y CR dividirá la línea en trozos en el límite de la palabra.

Rob Wells
fuente
-1

Inserté manualmente '\' (y luego CR / tab para formatear) en cada LONGLINE después del último espacio en blanco pero antes de la columna 80. Es decir:

1 this is a long, long, line

ahora parece

1 this is a long, \
        long line

y compila normalmente.

808
fuente