Чому існує різниця між редагуванням всередині "і (у Vim?


5

При виконанні команди ci" Vim редагуватиме текст у наступному рядку на рядку, навіть якщо курсор знаходиться за межами лапок. Однак, коли робите ci( він працює тільки, якщо курсор знаходиться в дужках.

Чому? Можна ci( робиться, щоб перейти до першої події ( як ci" робить?

Зразок тексту (використовуючи синтаксис Erlang), де я граю:

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

Сподіваюся, ви не заперечуєте, але я відредагував ваше запитання, щоб включити лише відповідний рядок коду, який виявляє проблему.

@Prince: Більш актуальне зараз, спасибі!
Adam Lindberg

Відповіді:


5

Після швидкого перегляду документації ( help v_aquote, help v_iquote ), Я схильний сказати, що це помилка ci", а не дефіцит в Росії ci(. Спостерігається ci( поведінка відповідає ci{ і ci[.

При цьому можна отримати бажану поведінку ci( з цим відображенням:

nnoremap ci( f(ci(

--- EDIT ---

--- (Це питання було перенесено на користувача, я якого я не є членом)

Наступна функція / відображення відрізняється поведінкою залежно від того, чи є попередній ( виявлено. Він вирішує (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>

2
Це має один недолік, коли команда знаходиться в одній дужці, команда переходить до наступного: (|a) (b) де | - позиція курсора. Так що це свого роду порушує поведінку ci( у цьому конкретному випадку.
Adam Lindberg

@Adam: дуже хороший момент, спасибі. Я думав, що рішення полягало в пошуку вперед для закриваючої дужки: f)ci(, але в оригінальному запиті буде вибрано неправильні дужки. Схоже, що потрібне більш складне загальне рішення.

@Prince: На жаль. :-(
Adam Lindberg

Я позначу це як прийняте, оскільки у нього є часткове рішення, яке може працювати для когось. +1 для навчання f(.
Adam Lindberg

Я не впевнений, чому це було переміщено до superuser, але я зареєструвався і редагував свою відповідь, щоб включити більш повне рішення.
Prince Goulash

4

Причина полягає в тому, що дужки, кутові дужки і брекети йдуть парами. Тому вони можуть гніздитися.

Одномісні та подвійні лапки взагалі не можуть вкладатись (за винятком скриптів bash з "$("something")" синтаксис, тому дозволено знаходити текстовий об'єкт, навіть якщо курсор не знаходиться всередині нього, оскільки не може бути будь-якого зовнішнього об'єкта.


2
Незважаючи на те, що корисною властивістю буде, якщо не буде знайдено зовнішньої області, можна вибрати наступну на рядку?
Adam Lindberg

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.

Мабуть, Вим намагається з'ясувати цитований текст пошук від початку рядка . Так що не має значення, де ви знаходитесь на лінії. (Однак це не спрацьовує, коли курсор розташований після наведеного тексту)


1
Я все ще вважаю, що це помилка ci" тому що курсор не починається на цитаті, тому випадок, наведений у документації, не застосовується.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.