Al ejecutar el comando, ci"
Vim editará el texto dentro de la siguiente cadena entre comillas en la línea, incluso si el cursor está fuera de las comillas. Sin embargo, al hacerlo, ci(
solo funciona si el cursor está situado dentro de los paréntesis.
¿Por qué? ¿Se puede ci(
hacer saltar a la primera aparición de (
como ci"
lo hace?
Texto de ejemplo(usando la sintaxis de Erlang) donde estoy jugando:
?assertEqual({200, "OK"}, status(FirstResponse)),
% ^
% Here I'm expecting ci( to jump in to the parenthesis ( ci" works)
Respuesta1
Después de un vistazo rápido a la documentación ( help v_aquote
, help v_iquote
), me inclino a decir que esto es un error en ci"
, más que una deficiencia en ci(
. El ci(
comportamiento observado es consistente con ci{
y ci[
.
Dicho esto, puedes obtener el comportamiento deseado ci(
con este mapeo:
nnoremap ci( f(ci(
--- EDITAR ---
--- (Esta pregunta se ha migrado al superusuario, del cual no soy miembro)
La siguiente función/mapeo tiene un comportamiento diferente dependiendo de si (
se detecta un precedente. Resuelve el (a) (b)
problema con mi mapeo original (como se señala en los comentarios). Aunque puede que todavía no sea perfecto...
function New_cib()
if search("(","bn") == line(".")
sil exe "normal! f)ci("
sil exe "normal! l"
startinsert
else
sil exe "normal! f(ci("
sil exe "normal! l"
startinsert
endif
endfunction
nnoremap ci( :call New_cib()<CR>
nnoremap cib :call New_cib()<CR>
Respuesta2
La razón es que los brackets, escuadras y tirantes van por parejas. Por tanto, pueden anidar.
Las comillas simples y dobles generalmente no pueden anidarse (excepto en scripts bash con "$("something")"
sintaxis, por lo que se permite buscar un objeto de texto incluso si el cursor no está dentro de él, porque no puede haber ningún objeto externo).
Respuesta3
Creo que "
son los únicos objetos de texto que funcionan de esa manera, es decir, seleccionan el siguiente patrón coincidente en la línea.
La ayuda podría explicar por qué:
a" *v_aquote* *aquote*
a' *v_a'* *a'*
a` *v_a`* *a`*
"a quoted string". Selects the text from the previous
quote until the next quote. The 'quoteescape' option
is used to skip escaped quotes.
Only works within one line.
When the cursor starts on a quote, Vim will figure out
which quote pairs form a string by searching from the
start of the line.
Any trailing white space is included, unless there is
none, then leading white space is included.
When used in Visual mode it is made characterwise.
Repeating this object in Visual mode another string is
included. A count is currently not used.
Aparentemente Vim intenta averiguar el texto citado porbuscando desde el inicio de la línea. Por lo tanto, no importa en qué punto de la línea se encuentre. (Sin embargo, no parece funcionar cuando el cursor está después del texto citado)