Eliminar hasta el extremo derecho del bloque interno actual


21

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.


1
Estoy interesado en saber si hay una manera fácil de "eliminar la mitad izquierda / derecha del bloque interno / externo", como usted pidió. Pero como nota al margen, probablemente lo haría C);en este caso particular.
Shahbaz

1
A veces, el %movimiento puede hacer lo que estás buscando (es decir d%).
alxndr

Respuestas:


29

yo usaría

d])

lo que significa eliminar ( d) al siguiente ')' ( ])) no coincidente .

Ver :help ]).


5

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:

func1(x, func2(), y);
      ^^^^^^^^^^^^^

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)y oei)(ejemplos semi aleatorios).

" ()
onoremap oei) :normal! vi)o``<CR>
onoremap obi) :normal! vi)``<CR>

" []
onoremap oei] :normal! vi]o``<CR>
onoremap obi] :normal! vi]``<CR>

" {}
onoremap oei} :normal! vi}o``<CR>
onoremap obi} :normal! vi}``<CR>

" ""
onoremap oei" :normal! vi"o``<CR>
onoremap obi" :normal! vi"``<CR>

" ''
onoremap oei" :normal! vi'o``<CR>
onoremap obi" :normal! vi'``<CR>

44
Sería interesante crear un movimiento genérico que reutilice todos los objetos de texto ya definidos, combinados con la posición actual del cursor; por ejemplo, en lugar de ib, imba la derecha y iMba la izquierda, y así sucesivamente (automáticamente).
VanLaser

3

Para este caso específico lo haría dfy

Para el caso general:

  • dT( eliminar del cursor al inicio del bloque
  • vib seleccione el resto del bloque interior
  • p reemplace el bloque interno con lo que acaba de eliminar

Podrías convertirlo en un mapeo.

 :map K dt(vibp

3

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 ccomando combinado con el fmovimiento 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 que ccambia al modo de inserción.


Para explicar con ejemplos, para

func1(x|, func2(), y); 

el comando c2f))dará

func1(x)|;

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

<div| class="some-class">text</div>

el comando cf>>dará

<div>|text</div>

O al editar archivos csv como

2016-11-29,question,vi|.stackexchange.com,10435

el comando cf,,dará

2016-11-29,question,vi,|10435

A menudo uso esto para eliminar el resto de una cadena, de

printf("Hello world| - a boring example\n");

a

printf("Hello world\|n");

con cf\\

o de

print("Hello world| - a boring example");

a

print("Hello world"|);

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.


1
El problema con la cfsolució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 simplemente cf)porque hay otro )antes de que la )realidad se desea alcanzar (por ejemplo cuando se desea cambiar func(x|, g(x, x), x, x, g(x, x))a func(x)). Básicamente, quería saber si puedo evitar presionar .después cf).
Mateusz Piotrowski

Tenga en cuenta que también puede usar en tlugar de feliminar hasta pero sin incluir el carácter dado, por lo que para su primer ejemplo ( func1(x|, func2(), y);), podría usar d2t). 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.
Haegin

3

El complemento vim-ninja-feet podría ser lo que estás buscando. Por lo que entiendo, se hace d[y d]en "borrar desde el cursor al inicio / final del objeto de texto", por lo que d]i)debe ser "borrar hasta el final del paréntesis que rodean".

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.