Sé que puedo unir líneas en Vim con J
y varias variantes de las mismas ( gJ
, etc.); J
será "Eliminar el guión e insertar hasta dos espacios" .
Pero, ¿hay también una forma directa de insertar otro personaje en lugar de los dos espacios? Por ejemplo, una coma ( ,
) o coma y espacio ( ,
)?
Dado:
8
9
10
32
Me gustaría terminar con:
8, 9, 10, 32
o:
8,9,10,32
line-breaks
Martin Tournoij
fuente
fuente
Respuestas:
Escribí un plugin Join, puedo hacer lo que quieras y mucho más.
Más detalles y capturas de pantalla:
https://github.com/sk1418/Join
fuente
Una manera simple es esta: simplemente seleccione sus líneas (todas menos la última), o use
%
, y ejecute:o
(donde, por supuesto, la
'<,'>
parte ya fue insertada después:
por Vim, para apuntar a la selección)(2º) Actualización:
Sobre la base de lo anterior (y el comentario de Sato Katsura ), aquí hay una posible implementación de "unión interactiva", con conteo y soporte de repetición opcional:
Y un mapeo real:
Esto es un poco (*) como
J
, pero interactivo: solicitará la cadena de separación. La cadena predeterminada es un espacio; por ejemplo, para unir líneas sin separador, presioneBackspace
cuando se le solicite, para eliminar el carácter de espacio predeterminado yEnter
para aceptar el separador vacío (ahora). Contar, por ejemplo3J
, también funciona. Si eltpope/vim-repeat
complemento está instalado, repita con '.' también funcionará, reutilizando el último separador y (si no se modifica, por ejemplo10.
) el último recuento o rango de línea visual.(*) Sin embargo, no es exactamente así
J
: aunque eliminará la sangría, no buscará.!?
(fin de la frase) para insertar 2 espacios en lugar de uno, o inserta un espacio solo si falta (es difícil hacer algo como esto, ya que la cadena de separación puede ser cualquier cosa ahora). También eliminará los espacios finales (tiene más sentido).Creo que esta podría ser una buena manera de sobrecargar el espacio limitado de letras de los operadores :)
Bueno, técnicamente
J
no es un operador, pero está cerca de uno, por ejemplo, no se puede hacerJaw
, para unir "una palabra".(sugerencias son bienvenidas)
fuente
:'<,'>-1s/\n/, /
para líneas marcadas o:1,$-1s/\n/, /
para todo el archivo.-1
?'<,'>-s/\n/, /
o1,$-s/\n/, /
as-
es lo mismo que-1
.l:sep
es un&
, entonces su reemplazo funcionará incorrectamente, ya que&
es mágico en el reemplazo. Podría ser mejor usar el\=
para usar una cadena literallet l:subst = 's/\n\+/\=' . "'" . l:sep . "'/"
- en lugar de tratar de manejar el escape.Aquí hay un ejemplo usando un comando externo:
donde
%!
reemplaza el búfer actual (contenido del archivo) con el comando:paste -sd,
(los parámetros-s
se utilizan para unir varias líneas y-d
establece el carácter delimitador en,
).fuente
En caso de que a alguien no le guste escribir Regex y memorizar más comandos Ex Plugin:
Bloque visual Agregar
Visual-block Append está disponible en el modo Visual Block (
<C-v>
) y puede hacer un bloque A ppend (y el bloque I nsert para prepend). (ref::help v_b_A
,:help v_b_I
)Y si el último movimiento en el Modo visual de bloque es
$
, la adición se realizará al final de todas las selecciones; o de lo contrario se insertarán espacios antes del texto que agregó (imagine alinear el cierre)
al final de varias llamadas a métodos en el código).Con el texto de muestra a continuación y el cursor encendido
8
:<C-v>}$A,<C-c>
. Después de volver al modo normal, podemos ver que,
se agrega a todas las líneas seleccionadas. (Prueba sin$
)Luego haga
gv
para volver a seleccionar el área yJ
ogJ
. Tenemos un rastro,
:8,9,10,12,
y$x
hemos terminado.Use Insertar sin seguimiento
,
Vamos a deshacer nuestro texto (ya sea
uu..u
elegante:ea 1d<cr>:lat 1
) e intentemos Visual Insert:j<C-v>}I, <C-c>
y luego podemos unir las líneasgJ
sin espacios.Espera espera espera, falta algo. ¿Cómo volver a seleccionar toda la "matriz"? Esta vez no seleccionamos la primera línea ... así
gv
que no ayuda.- O puede ayudar,
gvok
es volver a seleccionar (gv
),o
esquina opuesta yk
arriba.PD: Mi meñique no es lo suficientemente rápido y preciso para escribir ,
/\
por/\n
lo que me gusta combinar las operaciones y los movimientos integrados de Vim para evitar el uso de Regex. Sin embargo, si hago esto con suficiente frecuencia, usar un mapeo, tal vez los que se mapean a complementos deberían ser mejores.fuente
Una forma mucho más simple sin complementos o comandos externos para reasignar join (
J
) desde un espacio a cualquier personaje que desee. Por ejemplo, para unirse con una coma y un espacio:Para el carácter especial nueva línea al final (
^M
) presioneCtrl-V
y luego Retorno / Entrar. Lo mismo ocurre si desea reemplazar con una pestaña (^I
), escribaCtrl-I
entoncesTab
.Lo que está haciendo es reemplazar una nueva línea con una pestaña en la línea actual y reasignar ese comportamiento al carácter J.
Esto también funciona con combinaciones, como
4J
para unir las siguientes 4 líneas.fuente
Puede grabar una macro para unir líneas con una coma. Esto es útil si es una tarea rara o única, y no puede recordar cómo escribir un comando sustituto y una expresión regular para realizar la tarea, pero sí recuerda cómo grabar y ejecutar una macro.
Para unir líneas con una coma, escriba qjgJi,Escqpara grabar la macro en el registro
j
. Entonces puede ejecutar la macro con @j. Puede volver a ejecutar la macro con @@, lo que ahorra al escribir al ejecutarla varias veces seguidas; incluso puede mantener presionada la tecla @hasta llegar al final de las líneas que desea unir. También puede usar un prefijo numérico @jo @@repetirlo varias veces. Esto deja el espacio inicial y final intacto, por lo que habrá espacios antes o después de la coma si el texto original tenía espacios allí.Para unir con una coma y un espacio, inserte Spaceentre ,y Esccuando grabe la macro.
También puede usarlo en Jlugar de gJcuando graba la macro, que generalmente unirá líneas con una coma y un espacio. Sin embargo, si la línea actual tiene espacios en blanco al final, la coma aparecerá después del espacio en blanco sin un espacio a continuación. También, que no incluye el espacio si la siguiente línea comienza con
)
, y pone dos espacios después de la coma sijoinspaces
se establece y los extremos de la línea de corriente con.
,!
o?
. Estas advertencias se describen a continuación:help J
.fuente