Подтвердить что ты не робот

Почему ci "и ci (, ci {.... ведут себя по-другому?

Мы все знаем, что ci" ci' ci( ci[.... Очень удобно в повседневном редактировании. Я нашел что-то странное и проверил помощь, не понял почему.

скажем, у меня есть файл:

foo "target"
foo 'target'
foo (target)
foo {target}
foo [target]
foo <target>

если мой указатель на начало каждой строки (на 'f'), тогда я набираю ci ", ci ', ci (...

cix работает только с кавычками (одиночными или двойными), не работает для скобок. почему они ведут себя по-другому?

(dix, vix то же самое)

проверено с помощью --noplugin, vim 7.3

спасибо.

Обновление

Спасибо @romainl за ответ. У меня все еще есть сомнения относительно "обработки пар в vim"

проверьте этот пример:

foo "targ\"eti\" some\"thing else "

Если у меня есть строка, как указано выше, я набираю ci", независимо от того, что курсор находится в начале или между кавычками, он отлично работает, кажется, что у vim есть идея "пары"?

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

foo "target x some"thing else "
foo (target x some(thing else )

У меня выше двух строк, если (курсор в x) я набираю ci" и ci(, ничего не произошло со 2-й строкой, но первая строка была изменена на:

foo "I"thing else " (I is cursor)
4b9b3361

Ответ 1

ci( соответствует ci[, ci{ и cit и всем остальным <action>i<something>. Только ci' и ci" работают так же, как и они. Выбросы - это цитаты, а не скобки.

Vim не считает, что кавычки попадают парами, в то время как скобки выполняются. Он имеет внутреннюю логику для сопоставления пар, которые работают с фактическими парами, но не с кавычками, следовательно, разница в поведении.

Вы не первый, кто пожалуется на это несоответствие: это одно из решений, возможно, вы можете найти других.

изменить

У меня нет глубоких знаний о внутренностях Vim, к сожалению, поэтому я могу только делать предположения, здесь.

Если вы попросите Vim сделать ci", он сделает все возможное, чтобы найти пару двойных кавычек, но двойные кавычки не идут по парам: нет способа сказать, является ли " закрывающим или открытием один против скобок. Из-за этого, Vim должен сделать некоторые выборы. ИМО, выбор, который будет иметь наибольший смысл, учитывая, как работают другие члены семьи, будет предполагать, что курсор находится между кавычками и выбирается с первого справа на первый слева. Я могу только предположить, что этот метод каким-то образом оказался неправильным или не работал по какой-то причине и что другой метод (текущий) преобладал.

Другим объяснением может быть то, что механизм i<something> каким-то образом привязан к определенной подсистеме (может быть, такой же, как showmatch?), которая не может правильно обрабатывать кавычки.

В любом случае, как и вы, я нахожу это несоответствие странным, и я каким-то образом усвоил его и выровнил свое использование <action>i", как работают другие. Для того, чтобы фактически сделать 2t"ci" или какой-то вариант вместо ci"!! Я знаю неэффективно.

Вы читали :h a'? Я полностью забыл, где я получил свое "ограниченное понимание" проблемы, но она была там! В нем говорится:

"Работает только в одной строке. Когда курсор начинается с цитаты, Vim выяснит, какие цитаты пары образуют строку, ища с начала строки".

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

Для меня это очень похоже на ошибку или ограничение, замаскированное под функцию.

Если вам все еще интересно, я предлагаю вам задать еще один вопрос о vim-dev.