¿Cómo unirse a cada segunda línea en Vim?

28

Me gustaría unir muchas (~ 1000) líneas, pero solo todas las impares con la siguiente. A mano podría hacer

Jj

500 veces y hazlo. Sin embargo, ¿cómo puedo ejecutar estas dos declaraciones 500 veces en un solo comando? Mecanografía

500Jj

se unirá a las siguientes 500 líneas y luego se moverá hacia abajo una línea.

Ejemplo:

Yo tengo:

a
b
c
d
e
f
g
h

Quiero:

a b
c d
e f
g h

Editar: intenté mapear:

:map X Jj
500X

pero aparentemente debería leer los documentos de mapeo nuevamente. No funciona

Boldewyn
fuente

Respuestas:

30

yo haría esto:

  1. comenzar a grabar una macro 'q': qqJjq

  2. reproducir la macro 'q' 500 veces: 500@q

(en realidad no es una macro llamada 'q', es un registro con nombre llamado 'q'. en lugar de llenar ese registro de manera interactiva como en 1., también puede hacer :let @q = "Jj"y luego hacer 2.)

akira
fuente
Genial, ¡gracias por recordarme las macros!
Boldewyn
:% normal J fue muy rápido y fácil (vea la segunda solución superior a continuación) ... en comparación con esta solución macro que se ejecuta en más de 50,000 líneas
ihightower
@ihightower es por eso que también voté por esa respuesta. Hace 6 años :)
akira
@akira, tu macro me salvó el día, ya que necesitaba esta solución macro hoy para un propósito diferente.
ihightower
24

Para hacer esto en cada línea del archivo:

:%normal J

o, más corto:

:%norm J

Para hacer esto en solo una parte del archivo, seleccione las líneas con Vu obtenga un rango de alguna otra manera:

:'<,'>global/^/normal J

o, más corto:

:'<,'>g/^/norm J
Kevin Panko
fuente
Kevin está buscando ejecutar dos comandos en cada archivo, no solo uno.
JNK
1
el uso de :grespuestas OP necesita.
Luc Hermitte
2
De hecho, esto se unirá a cada segunda línea. ¡Intentalo!
Kevin Panko
Gracias por el globaltruco. Sin embargo, en mi caso, grabar la macro fue más fácil y rápido.
Boldewyn
2
Solo una suposición: ejecuta el comando en cada línea en orden, y después de hacer la primera línea, la segunda línea ya no está (se ha unido a la primera línea), por lo que se ve obligada a pasar a la tercera línea.
Kevin Panko
9

¿Qué hay de esto?

:g/$/j  

o

:g/$/j!  

y agrupar cada tres líneas

:g/$/j3 
Miró
fuente
1
Esta es una muy buena solución Miro. Es aún mejor porque también puede usar esto en vi estándar, aunque extrañamente, cuando usa el número final en SVR4.0 vi (como en Solaris) en lugar de j3 haciendo 3 columnas, hace 4 (por lo que debe usar j2 allí para agrupar cada 3 líneas)
JohnGH
0

También podemos jugar con:

'<,'>g//s/.*\zs\n\ze.*/ /
Luc Hermitte
fuente
-1

No soy un usuario de Vim, pero al verificar los documentos en línea parece que

500(Jj) 

podría funcionar ya que analiza las cosas dentro de paréntesis como una unidad.

JNK
fuente
Hm, gracias por intentarlo, pero en mi versión Vim simplemente ignora los paréntesis. ¿Podría decirme el enlace donde encontró esta sintaxis?
Boldewyn
1
vimdoc.sourceforge.net/htmldoc/syntax.html - ¡Lo siento, no ayudó!
JNK
Realmente revise este enlace: vim.org/scripts/script.php?script_id=2136 vea si eso hace lo que busca .
JNK