Почему ci "может находиться за пределами указанной области, а ci (работает только в скобках?

27

При использовании ci"курсора не обязательно находиться в области двойных кавычек.

|String somestring = "some text";

Предполагая, что труба - это позиция курсора, она ci"перейдет в указанную область.

С другой стороны, при использовании ci(курсор должен быть внутри скобок для работы и не будет перемещать курсор внутри них.

В чем причина такой разницы в поведении? Я предполагаю, что есть способ сопоставить ключи так, чтобы это поведение присутствовало. Есть ли какие-либо недостатки в этом?

грабитель
источник

Ответы:

25

Основное отличие здесь заключается в том, что операторы в скобках (нацеленные на ci() могут быть вложенными, а строки в кавычках (намеченные ci") - нет.

Если ваш курсор находится вне какого-либо выражения в скобках, он все равно может быть внутри другого. Например ( *отмечает позицию курсора):

$foo = array(
    'x' => ar*ray(1, 2, 3),
);

Строка, в которой находится курсор, содержит (1, 2, 3), но курсор также находится внутри большего array(...)блока. В этом случае более крупная является подходящей целью для ci(.

Если ваш курсор находится за пределами какой-либо строки в кавычках, так как они не могут быть вложенными, совершенно разумно ничего не делать. Итак, Vim использует преимущество и находит первую строку в кавычках в строке.

tommcdo
источник
10

Котировка семейство текстовых объектов ( i', i", a'и a") отличаются от остальных текстовых объектов в том , что они смотрят только на текущей строке. В связи с этим был сделан выбор не требовать, чтобы курсор находился в кавычках. Вместо этого Vim будет искать вперед в строке, чтобы найти строку в кавычках, когда курсор уже не внутри нее.

Существует обсуждение вокруг некоторых патчей, которые позволили бы реализовать это поведение прямого поиска и для текстовых объектов на основе блоков.

jamessan
источник
8

Другие ответы объясняли, почему это происходит. Вот хороший способ обойти это.

wellle / target.vim . Я только недавно нашел этот плагин, и я думаю, что он сильно недооценен. Это обеспечивает новый текстовый объект: din(Мнемоника:. (Г) далить (я) Nside (п) доб «(» Это совместимо с другими операторами и несколькими различными объектами, такими как an(, in", il((внутри последней скобкой)

Он также переопределяет поведение по умолчанию, i(поэтому сначала проверяется, находится ли курсор в скобках, а затем, если нет, он работает так же, как in(. Это поведение может быть включено или выключено. Например:

def foo(bar):
^cursor here

Печатание ci(действует так же, как cin(, так как курсор не в скобках.

def foo( ):
        ^Cursor here, and in insert mode

Это также принимает количество:

def foo(bar):           #Define function foo(bar)
^cursor here

Набрав c2in(:

def foo(bar):           #Define function foo( )
                                             ^cursor here

Это также обеспечивает новый объект, «аргумент». Например, danaозначает «Удалить вокруг следующего аргумента». Это также принимает количество. Например:

def foo(arg1, arg2, BADarg3):
^ cursor here

Набрав d3ana:

def foo(arg1, arg2):
                  ^ cursor here

У этого плагина есть много других функций, но они являются основными.

DJMcMayhem
источник
1
Ницца! Это хорошее дополнение. Возможно, мне придется это проверить.
Похититель
Отличный ответ 10/10, но я должен дать ему 9/10, потому что примеры - питон
Downgoat