![Por que existe uma diferença entre editar dentro de "e (no Vim?](https://rvso.com/image/1288688/Por%20que%20existe%20uma%20diferen%C3%A7a%20entre%20editar%20dentro%20de%20%22e%20(no%20Vim%3F.png)
Ao executar o comando, ci"
o Vim irá editar o texto dentro da próxima string citada na linha, mesmo que o cursor esteja fora das aspas. Porém, ao fazer ci(
isso só funciona se o cursor estiver situado entre parênteses.
Por que? Pode ci(
ser feito pular para a primeira ocorrência de (
como ci"
faz?
Texto de amostra(usando a sintaxe Erlang) onde estou brincando:
?assertEqual({200, "OK"}, status(FirstResponse)),
% ^
% Here I'm expecting ci( to jump in to the parenthesis ( ci" works)
Responder1
Após uma rápida olhada na documentação ( help v_aquote
, help v_iquote
), estou inclinado a dizer que isso é um bug do ci"
, e não uma deficiência do ci(
. O comportamento observado ci(
é consistente com ci{
e ci[
.
Dito isto, você pode obter o comportamento desejado ci(
com este mapeamento:
nnoremap ci( f(ci(
--- EDITAR ---
--- (Esta questão foi migrada para superusuário, do qual não sou membro)
A função/mapeamento a seguir tem um comportamento diferente dependendo se um anterior (
é detectado. Isso resolve o (a) (b)
problema do meu mapeamento original (conforme apontado nos comentários). Ainda pode não ser perfeito...
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>
Responder2
O motivo é: colchetes, colchetes angulares e colchetes vão aos pares. Portanto, eles podem nidificar.
Aspas simples e duplas geralmente não podem ser aninhadas (exceto em scripts bash com "$("something")"
sintaxe, portanto é permitido encontrar um objeto de texto mesmo que o cursor não esteja dentro dele, porque não pode haver nenhum objeto externo).
Responder3
Acho que "
são os únicos objetos de texto que funcionam dessa maneira, ou seja, selecione o próximo padrão correspondente na linha.
A ajuda pode explicar o porquê:
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 o Vim tenta descobrir o texto citado porpesquisando desde o início da linha. Portanto, não importa onde você está na linha. (No entanto, parece não funcionar quando o cursor está após o texto citado)