При использовании ci"курсора не обязательно находиться в области двойных кавычек.
|String somestring = "some text";
Предполагая, что труба - это позиция курсора, она ci"перейдет в указанную область.
С другой стороны, при использовании ci(курсор должен быть внутри скобок для работы и не будет перемещать курсор внутри них.
В чем причина такой разницы в поведении? Я предполагаю, что есть способ сопоставить ключи так, чтобы это поведение присутствовало. Есть ли какие-либо недостатки в этом?
cursor-motions
cursor-movement
грабитель
источник
источник
Ответы:
Основное отличие здесь заключается в том, что операторы в скобках (нацеленные на
ci(
) могут быть вложенными, а строки в кавычках (намеченныеci"
) - нет.Если ваш курсор находится вне какого-либо выражения в скобках, он все равно может быть внутри другого. Например (
*
отмечает позицию курсора):Строка, в которой находится курсор, содержит
(1, 2, 3)
, но курсор также находится внутри большегоarray(...)
блока. В этом случае более крупная является подходящей целью дляci(
.Если ваш курсор находится за пределами какой-либо строки в кавычках, так как они не могут быть вложенными, совершенно разумно ничего не делать. Итак, Vim использует преимущество и находит первую строку в кавычках в строке.
источник
Котировка семейство текстовых объектов (
i'
,i"
,a'
иa"
) отличаются от остальных текстовых объектов в том , что они смотрят только на текущей строке. В связи с этим был сделан выбор не требовать, чтобы курсор находился в кавычках. Вместо этого Vim будет искать вперед в строке, чтобы найти строку в кавычках, когда курсор уже не внутри нее.Существует обсуждение вокруг некоторых патчей, которые позволили бы реализовать это поведение прямого поиска и для текстовых объектов на основе блоков.
источник
Другие ответы объясняли, почему это происходит. Вот хороший способ обойти это.
wellle / target.vim . Я только недавно нашел этот плагин, и я думаю, что он сильно недооценен. Это обеспечивает новый текстовый объект:
din(
Мнемоника:. (Г) далить (я) Nside (п) доб «(» Это совместимо с другими операторами и несколькими различными объектами, такими какan(
,in"
,il(
(внутри последней скобкой)Он также переопределяет поведение по умолчанию,
i(
поэтому сначала проверяется, находится ли курсор в скобках, а затем, если нет, он работает так же, какin(
. Это поведение может быть включено или выключено. Например:Печатание
ci(
действует так же, какcin(
, так как курсор не в скобках.Это также принимает количество:
Набрав
c2in(
:Это также обеспечивает новый объект, «аргумент». Например,
dana
означает «Удалить вокруг следующего аргумента». Это также принимает количество. Например:Набрав
d3ana
:У этого плагина есть много других функций, но они являются основными.
источник