2011-08-24 13 views
16

Decir que tengo esta línea de texto en vim:Borrar desde el cursor al final del paréntesis (etc.) en vim

(foo bar (baz) qux) 
    ^

y mi cursor se encuentra en el espacio entre foo y bar como se indica. A menudo me parece que, en situaciones como esta, quiero eliminar todo el lado derecho de la expresión entre paréntesis externa (es decir, a la derecha de mi cursor), dejando intacto el lado izquierdo. Es decir, me gustaría terminar con:

(foo) 

Por lo general, me gustaría lograr esto con dt) ("borrar hasta )"), pero la adición de un paréntesis anidado complica las cosas: que dejaría de comandos yo con (foo) qux). También podría usar d2t), pero preferiría no tener que contar manualmente el número de paréntesis anidados. También podría usar di), pero eso borra el entero dentro de los paréntesis, dejándome con ().

¿Hay un movimiento vim con la conciencia de balance del i- and a-modified motions pero que es relativo a la posición actual del cursor?

Respuesta

14

Puede usar el movimiento ]) con d.

d]) 
+0

No sabía sobre '])'; eso es ciertamente más simple que mi solución (pero la mía aún debería funcionar para las versiones de vi no vim). –

+0

@Keith Thompson: Su solución es ciertamente compatible con Vi, lo que es bueno.Mi temor con tu solución es que depende de 'F (' encontrar el apropiado '(' para saltar a. Creo que preferiría hacer 'df)' y repetir w/'.' y luego' a) ' . O 'mxF (' luego repite el movimiento 'F' con', 'hasta que el' ('correcto se encuentre luego' '% d'x'' –

+0

Sí, solo pensé en un caso en el que mi solución no funcionaría:' ((before) foo^(after)) '. La' F ('o'? ( 'encontrará la paren izquierda que precede a' before', no la más cercana que encierra la posición del cursor. (Recuerdo un ': set lisp 'comando de hace muchos años. Veo que todavía lo tiene. ¿Qué hace? Sí, debería RTFM.) –

3
mxF(%d`x 

Descomponiéndola:

mx 

Establecer una marca x (escoger cualquier letra usted tiene gusto)

F(

Encuentra ( carácter anterior

% 

Saltar a igualar )

d`x 

Borrar desde aquí para marcar x

que funcione para su caso específico; No estoy seguro de qué tan general es. Si el ( anterior no está en la línea actual, use ?(<return> en lugar de F(.

EDITAR:
no he mencionado d]) porque yo no sabía nada de él.

Mi solución no funcionará para este caso:

((before) foo (after)) 
      ^

porque salta de nuevo a la ( más cercana, no la más cercana encerrando(.

Cuestiones relacionadas