Cuando se usa ci"el cursor no tiene que residir en el área doblemente citada.
|String somestring = "some text";
Asumiendo que la tubería es la posición del cursor, ci"saltará al área citada.
Por otro lado, cuando se usa ci(, el cursor debe estar dentro de los paréntesis para funcionar y no moverá el cursor dentro de ellos.
¿Cuál es la razón de esta diferencia de comportamiento? Supongo que hay una manera de asignar las claves para que este comportamiento esté presente. ¿Hay algún inconveniente para hacer esto?
cursor-motions
cursor-movement
Saqueador
fuente
fuente
Respuestas:
La principal diferencia aquí es que las declaraciones entre paréntesis (dirigidas por
ci(
) pueden anidarse, mientras que las cadenas entre comillas (dirigidas porci"
) no.Si su cursor está fuera de una declaración entre paréntesis, aún podría estar dentro de otra. Por ejemplo (
*
marca la posición del cursor):La línea en la que está el cursor contiene
(1, 2, 3)
, pero el cursor también está dentro delarray(...)
bloque más grande . En este caso, el más grande es el objetivo apropiado paraci(
.Si su cursor está fuera de una cadena entre comillas, ya que no pueden anidarse, no hay nada perfectamente sensato que hacer. Entonces, Vim aprovecha y encuentra la primera cadena entre comillas en la línea.
fuente
La familia de cotización de los objetos de texto (
i'
,i"
,a'
, ya"
) son diferentes que el resto de los objetos de texto en que sólo se ven en la línea actual. Debido a esto, se tomó la decisión de no requerir que el cursor esté dentro de las comillas. En cambio, Vim buscará hacia adelante dentro de la línea para encontrar una cadena entre comillas cuando el cursor no esté dentro de una.Hay una discusión sobre algunos parches que permitirían implementar este comportamiento de búsqueda hacia adelante también para objetos de texto basados en bloques.
fuente
Las otras respuestas cubrieron por qué sucede esto. Aquí hay una buena manera de evitarlo.
Wellle / Target.vim . Hace poco encontré este complemento y creo que está extremadamente subestimado. Se proporciona un nuevo objeto de texto:
din(
Mnemonic:. (D) elete (i) nside (n) ext "(" Esto es compatible con otros operadores y varios objetos diferentes, tales comoan(
,in"
,il(
(en el interior último paréntesis)También anula el comportamiento predeterminado de
i(
modo que primero busca ver si el cursor está entre paréntesis, y luego, si no lo está, funciona de la misma manera quein(
. Este comportamiento se puede activar o desactivar. Por ejemplo:La escritura
ci(
funciona igual quecin(
, ya que el cursor no está entre paréntesis.Esto también acepta un recuento:
Escribiendo
c2in(
:Esto también proporciona un nuevo objeto, "argumento". Por ejemplo,
dana
significa "Eliminar alrededor del siguiente argumento". Esto también acepta un recuento. Por ejemplo:Escribiendo
d3ana
:Hay muchas otras características que tiene este complemento, pero estas son las básicas.
fuente