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

5

Ao fazer o comando ci" Vim irá editar o texto dentro da próxima string citada na linha, mesmo que o cursor esteja fora das aspas. No entanto, ao fazer ci( , ele só funciona se o cursor estiver dentro dos parênteses.

Por quê? Pode ci( ser feito para pular para a primeira ocorrência de ( como ci" ?

Texto de exemplo (usando a sintaxe de Erlang) onde estou brincando :

    ?assertEqual({200, "OK"}, status(FirstResponse)),
%   ^
%   Here I'm expecting  ci(  to jump in to the parenthesis ( ci"  works)
    
por Adam Lindberg 07.09.2011 / 10:23

3 respostas

5

Após uma rápida olhada na documentação ( help v_aquote , help v_iquote ), estou inclinado a dizer que isso é um erro em ci" , em vez de uma deficiência em ci( . O comportamento ci( observado é consistente com ci{ e ci[ .

Dito isso, você pode obter o comportamento desejado de ci( com esse mapeamento:

nnoremap ci( f(ci(

--- EDIT ---

--- (Esta questão foi migrada para superusuário, da qual não sou membro)

A função / mapeamento a seguir tem um comportamento diferente dependendo se um ( precedente é detectado. Ele resolve o problema (a) (b) com meu mapeamento original (como apontado nos comentários). Ainda pode não ser perfeito embora ...

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>
    
por 07.09.2011 / 11:47
4

O motivo é: brackes, colchetes angulares e chaves vão por pares. Portanto, eles podem aninhar-se.

Aspas simples e duplas geralmente não podem ser aninhadas (exceto em scripts bash com sintaxe "$("something")" , portanto, é permitido encontrar um objeto de texto mesmo se o cursor não estiver dentro dele, porque não pode haver nenhum objeto externo.

    
por 07.09.2011 / 12:03
1

Acho que " é o único objeto de texto que funciona dessa maneira, ou seja, selecione o próximo padrão correspondente na linha.

A ajuda pode explicar por que:

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 pesquisando desde o início da linha . Portanto, não importa onde você esteja na linha. (No entanto, não parece funcionar quando o cursor está após o texto citado)

    
por 07.09.2011 / 11:49

Tags