Por que existe uma diferença entre editar dentro de "e (no Vim?

Por que existe uma diferença entre editar dentro de "e (no Vim?

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)

informação relacionada