Digamos que tengo un código como este ( |
representa la posición del cursor ):
func1(x|, func2(), y);
Me gustaría conseguir:
func1(x|);
¿Hay alguna forma de eliminar el código de la posición del cursor a la posición que precede al extremo derecho del bloque interno actual ?
Sé que puedo ir, dt).
pero me pregunto si hay una manera de mezclarlo con lo que di)
hace.
cursor-movement
cursor-motions
Mateusz Piotrowski
fuente
fuente
C);
en este caso particular.%
movimiento puede hacer lo que estás buscando (es decird%
).Respuestas:
yo usaría
lo que significa eliminar (
d
) al siguiente ')' (])
) no coincidente .Ver
:help ])
.fuente
Los movimientos van solo en una dirección, mientras que los objetos de texto van solo en dos direcciones.
Esto significa que no puede tener la mitad de un objeto de texto a menos que cree un operador personalizado pendiente de movimiento que use ese objeto de texto debajo del capó o imite su comportamiento.
En su ejemplo, el texto cubierto
i)
es bastante fácil de visualizar:pero, ¿cómo le dirías a Vim que opere desde el cursor hasta el final de ese texto? Sería necesario crear operadores personalizados como
obi)
yoei)
(ejemplos semi aleatorios).fuente
ib
,imb
a la derecha yiMb
a la izquierda, y así sucesivamente (automáticamente).Para este caso específico lo haría
dfy
Para el caso general:
dT(
eliminar del cursor al inicio del bloquevib
seleccione el resto del bloque interiorp
reemplace el bloque interno con lo que acaba de eliminarPodrías convertirlo en un mapeo.
fuente
Las otras respuestas existentes dependen de la definición de vim y la detección de un bloque. Mi estrategia para este tipo de eliminaciones es usar el
c
comando combinado con elf
movimiento y el carácter real para detenerme. Esto realmente eliminará el carácter de detención, pero dado que también fue la última tecla que presionó repetirlo dos veces tiene un costo próximo a cero, y eso lo insertará nuevamente ya quec
cambia al modo de inserción.Para explicar con ejemplos, para
el comando
c2f))
daráque al principio puede parecer menos elegante que algunas de las otras respuestas, sin embargo, tenga en cuenta que esta estrategia es universal y no depende de ninguna definición de bloque.
Por ejemplo con
el comando
cf>>
daráO al editar archivos csv como
el comando
cf,,
daráA menudo uso esto para eliminar el resto de una cadena, de
a
con
cf\\
o de
a
con
cf""
.Esto cambia la posición actual a un lugar ligeramente diferente al solicitado, y también cambia al modo de inserción. Pero quería compartir mi solución para eliminar el resto de cualquier cosa.
fuente
cf
solución es que tengo que especificar el carácter donde quiero dejar de eliminar. Las preguntas le pregunta qué hacer si no se puede hacer simplementecf)
porque hay otro)
antes de que la)
realidad se desea alcanzar (por ejemplo cuando se desea cambiarfunc(x|, g(x, x), x, x, g(x, x))
afunc(x)
). Básicamente, quería saber si puedo evitar presionar.
despuéscf)
.t
lugar def
eliminar hasta pero sin incluir el carácter dado, por lo que para su primer ejemplo (func1(x|, func2(), y);
), podría usard2t)
. Sin embargo, como menciona @MateuszPiotrowski, no es una solución general y requiere que sepas a qué personaje deseas eliminar. Sin embargo, como generalmente sabe qué personaje termina el bloque en el que se encuentra para un idioma determinado, eso no es tan malo.El complemento vim-ninja-feet podría ser lo que estás buscando. Por lo que entiendo, se hace
d[
yd]
en "borrar desde el cursor al inicio / final del objeto de texto", por lo qued]i)
debe ser "borrar hasta el final del paréntesis que rodean".fuente