¿Se puede tomar o eliminar entre paréntesis en vi / vim?

128

Dada esta línea de código en C:

printf("%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32)));

¿Hay alguna forma de eliminar o tirar del primer paréntesis en negrita a su paréntesis correspondiente? Pensé en df) , pero eso solo te llevará justo después del 9.0.

¿Hay una manera similar de hacer que vim tome todo entre llaves, independientemente de las nuevas líneas?

romandas
fuente

Respuestas:

167

Diversas mociones:%

El %comando salta a la coincidencia del elemento debajo del cursor. Coloque el cursor en el par de apertura (o cierre) y úselo y%para tirar o d%para borrar todo, desde el cursor al par correspondiente.

Esto funciona porque %es un "comando de movimiento", por lo que puede usarse en cualquier lugar donde vim espere dicho comando. De :help y:

["x]y{motion}       Yank {motion} text [into register x].  When no
                    characters are to be yanked (e.g., "y0" in column 1),
                    this is an error when 'cpoptions' includes the 'E'
                    flag.

De forma predeterminada, "elemento" incluye corchetes, llaves, parens, comentarios de estilo C y varias declaraciones de precompilador ( #ifdef, etc.).

Hay un complemento para "% de coincidencia extendido" que puede encontrar en la página de inicio de Vim .

Puede leer la documentación %y los comandos de movimiento relacionados ingresando :help various-motionsen modo comando.

seleccionar objeto

Hay otro conjunto de comandos de movimiento que puede usar en modo Visual para seleccionar varios objetos de texto.

Para resolver su problema específico, haría lo siguiente:

printf("%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32)));
                                   ^

Digamos que su cursor está posicionado en ^. Ingrese la siguiente secuencia para seleccionar la parte que está buscando:

v2a)

Primero vingresa al modo Visual, luego especifica que desea subir los 2niveles de los padres. Finalmente el a)selecciona "un bloque". Después de eso, puede usar do xeliminar, etc.

Si no desea incluir los elementos externos, puede usar "bloqueo interno" en su lugar:

v2i)

Consulte :help object-selectla lista completa de comandos relacionados.


fuente
¡Gracias! Sabía que% cambiaba entre elementos coincidentes; no sabía que también era útil dentro de los comandos. +1 y aceptado.
romandas 01 de
55
Interesante, siempre pensé que asignificaba "alrededor" en lugar de "a". Siente que complementa mejor "interior". Parece que no pasa un día sin aprender algo nuevo sobre Vim.
Andrew Marshall
217

¿Qué hay de dibo di(?

Eliminará el bloque interno (...) donde está el cursor.

¡Me encantan los movimientos y selecciones de objetos de texto !

CMS
fuente
10
Afortunadamente, esta pregunta es el primer éxito cuando la busco en Google, no sé cuántas veces me ha salvado esta respuesta. Y siempre lo olvido ... :-(
Konrad Rudolph el
16
¿Es posible eliminar incluso los paréntesis? (sí, respondí mi propia pregunta: dab=> eliminar un bloque (incluidos sus paréntesis)
bantic
55
Yo voto Además, si desea corregir la palabra dentro del paréntesis, haga ciw .
Desarrollador Marius Žilėnas
55
+1! ¡Estaba alucinado cuando descubrí los movimientos de objetos de texto recientemente! no más intentar colocar el cursor en el lugar correcto para tirar del texto: D
verboze el
36

Para eliminar todo lo que está dentro de un par de paréntesis, siempre puede emitir di(y sus derivados.

Nota :

Como @porglezomb sugirió en su comentario, puede usar a("junto con") en lugar de i("dentro") para incluir los paréntesis. Entonces, el uso da(elimina todo lo que está dentro (e )incluye (y ).

Eliminar texto dentro del par de paréntesis externo inmediato:

Entonces, para esta línea de código

printf("%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32)));
                                ^       ^
                                |       |
                                 \_______\___---> Cursor range

suponiendo que su cursor está dentro del rango de cursor mencionado anteriormente, puede emitir los siguientes comandos:

di(   --> Deletes '5.0/9.0'
ci(   --> Substitutes '5.0/9.0'
yi(   --> Yanks '5.0/9.0'

Eliminar texto dentro del enésimo par de paréntesis externos:

Para agarrar todo dentro del par de paréntesis externos n-ésimo, solo agregue nantes del comando anterior. Entonces, con la misma posición del cursor que la anterior,

2di(   --> Deletes '(5.0/9.0) * (fahr-32)'
2ci(   --> Substitutes '(5.0/9.0) * (fahr-32)'
2yi(   --> Yanks '(5.0/9.0) * (fahr-32)'

3di(   --> Deletes '"%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32))'
3ci(   --> Substitutes '"%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32))'
3yi(   --> Yanks '"%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32))'
Kevin
fuente
3
Debería agregar una nota en la que se habla acomo contraparte i, ya que es probable que ayude a mucha gente.
porglezomp
@romandas esta debería ser la pregunta aceptada. Estaba buscando exactamente el mismo problema hoy y @Kevin es el único que está dando la respuesta correcta. Por supuesto, podría "hacer un mal uso" %de este problema, pero esto lleva más tiempo y, en mi opinión, solo debería usarse para escenarios más complejos. Eliminar algo dentro de un cierto alcance es exactamente para lo que diestá hecho el caso de uso .
daniel451
19

Puede usar d%para borrar y y%para tirar.

ahy1
fuente
3
% es el especificador de movimiento para "paréntesis, paréntesis o paréntesis coincidentes". Cualquier especificación de movimiento se puede combinar con d e y (y muchas otras cosas).
caos
10

Coloque el cursor en el primer paréntesis, luego presione v%yo v%d.

David Norman
fuente
3
¡Excelente! % salta al par coincidente. Así que incluso puedes usar d% e y%.
1
Tenga en cuenta también que 'd%' puede comenzar al principio del nombre de una función y eliminará toda la llamada a la función. También funciona para '{}', '[]' e incluso '<>' pares.
Jonathan Leffler
@Leffler, ¡Gracias por los consejos! Y es bueno saber que% funciona también en modo visual.
extraño
3

Prueba ci [block-surrounder]

En su caso, coloque el cursor en cualquier lugar entre los 2 paréntesis que resaltó y pruebe las teclas: ci (

Justin Nguyen
fuente
Casi. Al probar esto, parece que el cursor debe estar en el primer paréntesis, no entre ellos, y 'c' es el comando de cambio. Con el cursor en el paréntesis de apertura, 'di (' elimina el paréntesis de cierre correspondiente y 'yi (' yanks.
Richard Neish
Ci trabaja para mí todo el tiempo. Todo lo que necesito hacer es asegurarme de que el cursor esté entre esos paréntesis que rodean el bloque de texto que necesito eliminar.
Justin Nguyen
2

Como dice la respuesta de David Norman:

Coloque el cursor en el primer paréntesis, luego presione v%yo v%d.

Explicación de http://vimdoc.sourceforge.net/htmldoc/vimindex.html :

etiquetar acción de nota de char en modo Normal        
-------------------------------------------------- ----------------------------
| v | v iniciar el modo visual de carácter
|% | % 1 encuentra el siguiente paréntesis (rizado / cuadrado) en
                                       esta línea e ir a su partido, o ir a
                                       paréntesis de comentarios coincidentes, o vaya a coincidencia
| d | ["x] d {motion} 2 eliminar texto Nmove [en el búfer x]

Esto significa que seleccionará todo entre e incluyendo los dos corchetes ( %) mientras le muestra la selección visualmente ( v) y luego lo tirará / copiará yo eliminará / cortará d. (Al búfer predeterminado).

Puedes poner / pegar con p.

Hizo esta respuesta a "enseñarme a pescar" .

n611x007
fuente
nota: vimdoc.sourceforge.net está vinculado desde vim.org, que es el sitio oficial de vim a partir de 2015.
n611x007