5

При выполнении команды ci" Vim будет редактировать текст внутри следующей строки в кавычках в строке, даже если курсор находится вне кавычек. Однако при выполнении ci( это работает только в том случае, если курсор находится внутри скобок.

Зачем? Можно ли ci( перейти к первому появлению ( как это делает ci" ?

Пример текста (с использованием синтаксиса Эрланга), где я играю:

    ?assertEqual({200, "OK"}, status(FirstResponse)),
%   ^
%   Here I'm expecting  ci(  to jump in to the parenthesis ( ci"  works)

3 ответа3

5

После быстрого просмотра документации (help v_aquote , help v_iquote) я склонен сказать, что это ошибка в ci" , а не недостаток в ci( . Наблюдаемое ci( поведение согласуется с ci{ и ci[ .

Тем не менее, вы можете получить желаемое поведение ci( с этим отображением:

nnoremap ci( f(ci(

--- РЕДАКТИРОВАТЬ ---

--- (Этот вопрос был перенесен в superuser, членом которого я не являюсь)

Следующая функция / отображение имеет различное поведение в зависимости от того, обнаружено ли предыдущее ( . Это решает проблему (a) (b) с моим исходным отображением (как указано в комментариях). Это все еще не может быть идеальным, хотя ...

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>
4

Причина в том, что скобки, угловые скобки и скобки идут парами. Поэтому они могут гнездиться.

Одинарные и двойные кавычки, как правило, не могут быть вложенными (за исключением сценариев bash с синтаксисом "$("something")" , поэтому можно найти текстовый объект, даже если курсор не находится внутри него, потому что не может быть никакого внешнего объекта.

1

Я думаю, " это единственные текстовые объекты, которые работают таким образом, т.е. выберите следующий соответствующий шаблон в строке.

Помощь может объяснить, почему:

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.

Судя по всему, Vim пытается найти цитируемый текст, выполняя поиск в начале строки. Так что не имеет значения, где вы находитесь на линии. (Однако, кажется, что он не работает, когда ваш курсор находится после цитируемого текста)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .