En vim, busque al revés llaves y parens coincidentes


9

Como la mayoría de ustedes probablemente sepa, puede usar %para buscar hacia adelante en la línea para encontrar el siguiente paréntesis / paréntesis / par y moverse a su compañero coincidente:

|a|rray[index] = value;
" |e| is the cursor; hit %:
array[index|]| = value;

Espero que haya una clave similar que busque hacia atrás en la línea, por ejemplo:

array[index] = value|;|
" |;| is the cursor again, hit the key I'm looking for:
array|[|index] = value;

La mayoría de los comandos vim tienen tanto hacia atrás como hacia adelante, por lo que parece que debería ser así. ¿No tiene pareja? Si es así, ¿es porque una vez que está en un personaje emparejado actuarían igual?


Cabe señalar que %no solo busca el par de paréntesis en la misma línea, sino más abajo en el archivo. Me gusta especialmente para bucles, etc. en cualquier lenguaje de programa de elección.
Bernhard

1
@Bernhard Sí, pero solo cuando encuentra una de las llaves en la línea.
Kevin

Si no se opone a los scripts de complementos, el complemento matchit proporciona un g%comando que parece similar a lo que está buscando.
jw013

Tonto, pero tu pregunta dice que quieres saber por qué no hay pareja. ¿Quieres decir "hay algún compañero que no conozca?" :)
rjewell

@rjewell OK, lo he dividido para que técnicamente ya no pregunte eso.
Kevin

Respuestas:


4

Si realmente desea buscar hacia atrás los caracteres coincidentes comunes, puede usar uno de estos vimcomandos específicos:

  • [(... (ir al (personaje anterior sin igual )
  • [{... (ir al {personaje anterior sin igual )

Estos dos comandos tienen socios de reenvío coincidentes:

  • ])... (ir al siguiente )personaje sin igual )
  • ]}... (ir al siguiente }personaje sin igual )

Hay otros comandos similares para #ifdefy para comentarios de C.

Puedes encontrar más cuando estás vimusando el comando :help %.


Sé de estos, el problema es que encuentran pares incomparables , necesito encontrar pares coincidentes .
Kevin

@Kevin: no entendí los documentos (suspiro). Por supuesto, una vez que lo ha usado, %entonces va en ambos sentidos: encontrar el compañero compatible. Además, si está dentro de un bloque, los comandos anteriores encontrarán la coincidencia adecuada.
Mei

3

% encuentra el soporte correspondiente. Entonces, si está activado (o {buscará hacia adelante.

Si está en un} o) buscará hacia atrás.

% no es direccional, solo encuentra el soporte correspondiente.


Si estoy detrás de un lado de un par,% encontrará a su pareja. Si estoy al final de una línea, no encontrará el par antes en la línea.
Kevin

¿No debería seleccionarse la respuesta correcta?
Jack

2

Acabo de intentarlo :map ^] ^%%(con ^]= Ctrl+ v Ctrl+ 5aquí, como analogía con %= Shift+ 5).

Funciona para el caso específico dado, pero como no busca hacia atrás desde el cursor, siempre seleccionará el primer paréntesis abierto en la línea y dejará el cursor al comienzo de la línea si no encuentra ninguna coincidencia. .


Esta es una mejor solución; es feo y probablemente haya mucho espacio para simplificar, pero creo que la semántica es correcta (no mueve el cursor si no hay un par abierto, y se mueve al primer par abierto antes de la columna actual).

:map ^] ^[:call search("[({[]", "bes", line("."))^M

para

  • ^]= Ctrl+ v Ctrl+5
  • ^[= Ctrl+v Esc
  • ^M= Ctrl+v Return

Esto no será lo mismo si hay dos pares no anidados en una línea, pero ciertamente es la mejor sugerencia hasta ahora, gracias.
Kevin

Esto solo funcionará dentro de un bloque, ¿verdad? Si es así, entonces [(funcionaría igual de bien y no requiere a map.
Mei

Tendría que haber un bloque que comience en la línea actual, sí. Sin embargo, he encontrado una solución más completa, la edición viene ...
Inútil
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.