¿Cómo seleccionar entre paréntesis (o comillas o ...) en Vim?

220

Estoy seguro de que solía haber un complemento para este tipo de cosas, pero ahora que lo necesito, parece que no puedo encontrarlo (naturalmente), así que solo preguntaré agradable y simple.

¿Cuál es la forma más fácil de seleccionar entre paréntesis, comillas o, en general, una lista de caracteres coincidentes?

   write ( *, '(a)' ) 'Computed solution coefficients:'

Por ejemplo, aquí me gustaría seleccionar (a), o Computed solution coefficients:.

No me interesan las líneas múltiples, solo los casos que ocurren en una línea.

Torre
fuente

Respuestas:

277

Use la tecla de navegación que desee ingresar entre paréntesis, luego puede usar cualquiera yi(o yi)copiar todo dentro de los pares coincidentes. Esto también funciona con corchetes (p yi]. Ej. ) Y llaves. Además de y, también puede eliminar o cambiar el texto (por ejemplo ci), di]).

Intenté esto con comillas dobles y simples y parece que también funciona allí. Para sus datos, hago:

write (*, '(a)') 'Computed solution coefficients:'

Mueva el cursor a C, luego escriba yi'. Mueva el cursor a una línea en blanco, presione py obtenga

Computed solution coefficients:

Como se señaló CMS , esto funciona para la selección del modo visual, así - el uso justo vi), vi}, vi', etc.

Tim Whitcomb
fuente
1
Generalmente busco una forma de seleccionar todo entre caracteres coincidentes predefinidos (normalmente solo comillas simples y dobles, y corchetes de todo tipo).
Rook
2
¿Qué quieres decir con palabras separadas? Lo probé en "[x, y, z]" y seleccionó "x, y, z"
Tim Whitcomb
44
Haga caso omiso del último comentario: descubrió cuál era el problema. Funciona como un encanto :-)
Rook
parece funcionar con comillas, así como yi"seleccionar todas las comillas
stefanB
ci(o lo ci)hace por lo que estaba buscando. Gracias. Todavía no entiendo completamente el icaso, pero a quién le importa mientras funcione, ¿verdad? :)
justnorris
279

Para seleccionar entre comillas simples, generalmente hago un vi' ("seleccionar comillas simples internas").

Dentro de un bloque de paréntesis, uso vib ("seleccionar bloque interno")

Dentro de un bloque de llaves puede usar viB("mayúscula B")

Para hacer las selecciones "inclusivas" (seleccione también las comillas, paréntesis o llaves) puede usar en alugar de i.

Puede leer más sobre las selecciones de objetos de texto en el manual o :help text-objectsen vim.

CMS
fuente
gracias por ese consejo, he estado buscando y pidiendo algo similar y no estaba satisfecho con mis resultados. Increíble.
alfredodeza
Este consejo es muy simple y fácil de comprometer dentro de mi memoria cerebral y muscular. Gracias.
Ghazaly
Este es un consejo muy útil. No más torpezas con pulsaciones de teclas adicionales. Gracias por el enlace.
Rai
27

Este método de selección está integrado y bien cubierto en la ayuda de Vim. Cubre etiquetas XML y más.

Ver :help text-objects.

Miguel
fuente
1
: los objetos de texto de ayuda se acercan a las cosas útiles ... al menos podría mencionar algunos de los más comunes, como un "y un (cuando está en modo visual.)
Stobor
2
(También, 1 porque a pesar de ser un usuario vim desde hace mucho tiempo, yo no sabía acerca de estos!)
Stobor
@Stobor. Cheers arregló esa referencia
michael
21

Para seleccionar dentro de comillas simples use vi'.

Para seleccionar dentro del uso de paréntesis vi(.

Canopus
fuente
3
Nota: ci'o ci(para cambiar en lugar de seleccionar visualmente. Pero hace exactamente lo que quería. Gracias :)
justnorris
El segundo solo funciona cuando está dentro de ese bloque (), así que generalmente lo hago %vi(o%vib
816-8055
7

Use las flechas o hjklpara llegar a una de las expresiones entre paréntesis, luego vpara seleccionar el modo visual (es decir, seleccionar), luego %para saltar al otro paréntesis.

Stobor
fuente
55
(aunque no hace citas, desafortunadamente ...)
Stobor
3

Escriba una función Vim en .vimrc usando la searchpairfunción incorporada:

searchpair({start}, {middle}, {end} [, {flags} [, {skip}
            [, {stopline} [, {timeout}]]]])
    Search for the match of a nested start-end pair.  This can be
    used to find the "endif" that matches an "if", while other
    if/endif pairs in between are ignored.
    [...]

( http://vimdoc.sourceforge.net/htmldoc/eval.html )

Adrian Panasiuk
fuente
2

Añadiría un detalle a la respuesta más votada:

Si está utilizando gvim y desea copiar al portapapeles, use

"+<command>

Para copiar todo el contenido entre corchetes (o parens o corchetes)

Por ejemplo: "+yi}copiará en el portapapeles todo el contenido entre las llaves que está el cursor.

yuriploc
fuente
2
Esto es completamente ortogonal al problema y no debería ser una respuesta. Puede escribir esto en cada pregunta sobre la que pregunte y.
tubería
Esta es una adición a la respuesta, no una respuesta en sí misma.
yuriploc
Entonces debería ser una edición de esa respuesta, esta publicación tal cual no responde la pregunta.
tubería
Este es un anuncio para NO usar gvim :) ¿Quién necesita dos pulsaciones de teclas adicionales en su vida?
Paul Parker
1

He hecho un complemento vim-textobj-quotes: https://github.com/beloglazov/vim-textobj-quotes

Proporciona objetos de texto para los pares de comillas más cercanos de cualquier tipo. Usar solo iqo aqle permite operar sobre el contenido de comillas simples ('), dobles (") o hacia atrás (`) que actualmente rodean el cursor, están delante del cursor o detrás (en ese orden de preferencia) En otras palabras, salta hacia adelante o hacia atrás cuando es necesario para llegar a las comillas.

Es más fácil de entender mirando ejemplos (el cursor se muestra con |):

  1. Antes: foo '1, |2, 3' bar; después de presionar diq:foo '|' bar
  2. Antes: foo| '1, 2, 3' bar; después de presionar diq:foo '|' bar
  3. Antes: foo '1, 2, 3' |bar; después de presionar diq:foo '|' bar
  4. Antes: foo '1, |2, 3' bar; después de presionar daq:foo | bar
  5. Antes: foo| '1, 2, 3' bar; después de presionar daq:foo | bar
  6. Antes: foo '1, 2, 3' |bar; después de presionar daq:foo | bar

Los ejemplos anteriores se proporcionan para comillas simples, el complemento funciona exactamente de la misma manera para las comillas dobles (") y las comillas posteriores (`).

También se puede utilizar cualquier otro operador: ciq, diq, yiq, viq, etc.

Por favor, eche un vistazo a la página de github vinculada anteriormente para obtener más detalles.

Anton Beloglazov
fuente
-6

Un simple mapa de teclas en vim resolvería este problema. map viq F "lvf" hh Este comando anterior asigna viq a las teclas para buscar entre comillas. Reemplace "con cualquier carácter y cree sus mapas de teclas. Pegue esto en vimrc durante el inicio y debería poder usarlo siempre.


fuente