В vim ищите в обратном порядке соответствующие скобки / парены


10

Как многие из вас, вероятно, знают, вы можете использовать %поиск вперед в строке, чтобы найти следующую парную скобку / скобку / парен и перейти к соответствующему партнеру:

|a|rray[index] = value;
" |e| is the cursor; hit %:
array[index|]| = value;

Я надеюсь, что есть аналогичный ключ, который ищет в обратном направлении в строке, например:

array[index] = value|;|
" |;| is the cursor again, hit the key I'm looking for:
array|[|index] = value;

Большинство команд vim имеют как вперёд, так и вперёд, так что, похоже, так и должно быть. У него нет партнера? Если да, то , что , поскольку , как только это на спаренном характер , они будут действовать так же?


Следует отметить, что %не только выполняется поиск парных скобок в той же строке, но и дальше по файлу. Мне это особенно нравится для циклов и т. Д. На любом языке программирования.
— Бернхард

1
@Bernhard Да, но только когда он находит одну из фигурных скобок на линии.
— Кевин

Если вы не против аддон-скриптов, аддон matchit предоставляет g%команду, которая похожа на то, что вы ищете.
— jw013

Глупо, но ваш вопрос гласит, что вы хотите знать, почему нет партнера. Вы имеете в виду "есть какой-то партнер, о котором я не знаю?" :)
— rjewell

@ rjewell Хорошо, я разделил это, так что это больше технически не спрашивает это.
— Кевин

Ответы:


4

Если вы действительно хотите искать в обратном порядке общие совпадающие символы, вы можете использовать одну из этих vimспецифических команд:

  • [(... (перейти к предыдущему непревзойденному (персонажу)
  • [{... (перейти к предыдущему непревзойденному {персонажу)

Эти две команды имеют соответствующих партнеров по пересылке:

  • ])... (перейти к следующему непревзойденному )персонажу)
  • ]}... (перейти к следующему непревзойденному }персонажу)

Есть и другие похожие команды для #ifdefи для комментариев на C.

Вы можете найти больше vim, используя команду :help %.


Я знаю о них, проблема в том, что они находят несопоставленные пары, мне нужно найти подходящие пары.
— Кевин

@Kevin: я неправильно понял документы (вздох). Конечно, как только вы воспользуетесь %этим, вы пойдете в обе стороны - найти подходящего партнера. Также, если внутри блока, то вышеуказанные команды найдут соответствующее совпадение.
— Мэй

4

% найти подходящую скобку. Так что, если вы включены (или {он будет искать вперед.

Если вы находитесь на} или) он будет искать в обратном направлении.

% не направленный, он просто находит подходящую скобку.


Если я за одной стороной пары,% найдет своего партнера. Если я нахожусь в конце строки, она не найдет пару ранее на линии.
— Кевин

Разве это не должен быть выбран правильный ответ?
— Джек

2

Я только что попробовал :map ^] ^%%(с ^]= Ctrl+ v Ctrl+ 5здесь, как аналогия с %= Shift+ 5).

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


Это лучшее решение; это некрасиво и, вероятно, есть много возможностей для упрощения, но я думаю, что семантика совершенно правильная (не перемещает курсор, если нет открытой пары, и перемещается к первой открытой части перед текущей колонкой).

:map ^] ^[:call search("[({[]", "bes", line("."))^M

за

  • ^]= Ctrl+ v Ctrl+5
  • ^[= Ctrl+v Esc
  • ^M= Ctrl+v Return

Это не совсем то же самое, если на линии две не вложенные пары, но это, безусловно, лучшее предложение на данный момент, спасибо.
— Кевин

Это будет работать только внутри блока, верно? Если так, то [(будет работать так же хорошо и не требует map.
— Мэй

Да , должен быть блок, начинающийся с текущей строки. Хотя я нашел более полное решение, отредактируйте грядущее ...
— Бесполезно
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.