¿Cómo eliminar contenido hacia atrás hasta "=" en la línea anterior?


9

Yo uso un ejemplo de código javascript:

1        var a = 1;
2        var b = |{};

El cursor está en la posición de |(en el carácter "{" cuando la forma del cursor está bloqueada), descubro que se me adebe asignar un objeto, por lo que quiero modificarlo como se muestra a continuación:

1        var a = {};

Entonces, quiero saber cuando el cursor está en "{", ¿cómo eliminar rápidamente todo el contenido antes de "{" hasta el espacio en blanco después del signo "=" en la línea 1?

En otros editores normales, solo presionaré la tecla de retroceso para eliminar el código. Pero no sé cómo lograr esto en vim.


También puede presionar iy usar la tecla de retroceso. Ningún cuerpo te disparará por eso. Yo creo que.
elyashiv

1
pero la tecla de retroceso no eliminará el carácter de la línea de arriba
Aaron Shen

3
@AaronShen Eso depende de su configuración de 'retroceso'. Si se incluye eola continuación, la tecla de retroceso será eliminar los saltos de línea. También startdeberá ser incluido en la configuración. (Ver :help backspace) Sin embargo, ¡no uses este método! Hay varios métodos mucho más rápidos detallados en las respuestas a continuación.
Rico

Respuestas:


20

No estoy seguro si entiendo totalmente la pregunta, pero si desea eliminar hasta que solo lo haya hecho var a = {};, podría, desde la posición del cursor, usard?1Enter

dhace un movimiento y puede darle un patrón de búsqueda /para una búsqueda hacia adelante o ?hacia atrás.

Aquí hay un pequeño gif que demuestra esto:

ingrese la descripción de la imagen aquí


1
Probablemente valga la pena mencionar que debes golpear Enterdespués de escribir d?1.
Rich

@Rich realmente gracias, he actualizado la respuesta para incluir eso.
akshay

1
¿Qué fuente está usando ese shell?
Chris Burt-Brown

@ ChrisBurt-Brown: Terminus
akshay

10

Si está utilizando vim (y no vi clásico), en su ejemplo podría hacer vkd(o vkx).

  • v lo pondrá en modo 'visual' (select)
  • k subirá una línea para colocar el cursor en el '1', seleccionando la parte que desea eliminar
  • do xeliminará la selección

5

Eliminar arriba

Para este ejemplo específico, dgkes una de las formas más rápidas de hacerlo.

El dcomando, como explicó Akshay , puede ser seguido por un movimiento, eliminando todos los caracteres entre donde comienza el cursor y hacia dónde lo lleva el movimiento.

En su código, desea eliminar todo entre la posición del cursor y la misma columna una fila más arriba, por lo que mover el cursor hacia arriba con el gkmovimiento (que cuando se usa con un operador no es lineal) logrará su objetivo.

EDITAR: BobH señala en los comentarios que este método solo funciona cuando 'wrap'está configurado. Como tal, a menos que siempre tenga un conjunto de ajustes, probablemente sea mejor usar dvko vkd, como lo sugieren las otras respuestas en esta página.

Eliminar palabras al revés

También puede usar: d5bo d4B, que eliminará 5 palabras o 4 PALABRAS al revés, respectivamente. ( 1;es una PALABRA, pero dos palabras regulares).


¿Por qué dk eliminará completamente la línea actual y la línea superior
Aaron Shen

@AaronShen Nope. Intentalo.
Rico

1
@ Rich si eso funciona para usted, entonces tiene una configuración que permite ese movimiento de eliminación. Lo acabo de probar vim -u NONE -U NONEy elimina ambas líneas.
Vitor

@Vitor Tienes razón. Tratando de averiguar qué configuración lo hace, ahora.
Rico

1
Por cierto, resulta que, gksegún las características, aparentemente requiere :set wrap(algo crípticamente). No pude entender por qué esto aparentemente estaba funcionando para todos los demás, pero no para mí, cuando la ayuda gktambién parecía implicar que debería funcionar. La única pista era que el significado principal de gktenía que ver con las líneas envueltas. Una vez que traté de configurar wrap (tipo capricho), listo, funcionó.
BobH

1

Todavía no puedo comentar, así que necesito hacer una nueva respuesta. Las claves d kproporcionadas por Rich no funcionan para mí, incluso cuando se utiliza la opción no compatible. Una razón podría ser que el movimiento kse considera linealmente por vim, en cuyo caso se eliminan ambas líneas. De :help d:

Una excepción para el comando d {motion}: si el movimiento no es en línea, el inicio y el final del movimiento no están en la misma línea, y solo hay espacios en blanco antes del inicio y después del final del movimiento, la eliminación se convierte en en línea Esto significa que la eliminación también elimina la línea de espacios en blanco que puede esperar que permanezca. Use el | o_v | operador para forzar el movimiento a ser característico

También muestra el remedio: se usa dvkpara forzar que el movimiento tenga carácter. Esto hace el truco para mí.

No sabía antes, así que aquí está :help o_v:

v

Cuando se usa después de un operador, antes del comando de movimiento: fuerce al operador a trabajar en forma de caracteres, también cuando el movimiento es en línea. Si el movimiento fue lineal, se convertirá en exclusivo. Si la moción ya era de carácter, alternar inclusivo / exclusivo. Esto se puede usar para hacer un movimiento exclusivo inclusivo y un movimiento inclusivo exclusivo


Lo 'no compatible' era un arenque rojo completo. Me equivoqué cuando estaba probando porque soy un idiota.
Rich

También podemos usar dgk, donde gk también es exclusivo y no lineal.
MS.Kim
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.