В 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 имеют как вперёд, так и вперёд, так что, похоже, так и должно быть. У него нет партнера? Если да, то , что , поскольку , как только это на спаренном характер , они будут действовать так же?

Kevin
источник
Следует отметить, что %не только выполняется поиск парных скобок в той же строке, но и дальше по файлу. Мне это особенно нравится для циклов и т. Д. На любом языке программирования.
Бернхард
1
@Bernhard Да, но только когда он находит одну из фигурных скобок на линии.
Кевин
Если вы не против аддон-скриптов, аддон matchit предоставляет g%команду, которая похожа на то, что вы ищете.
jw013
Глупо, но ваш вопрос гласит, что вы хотите знать, почему нет партнера. Вы имеете в виду "есть какой-то партнер, о котором я не знаю?" :)
rjewell
@ rjewell Хорошо, я разделил это, так что это больше технически не спрашивает это.
Кевин

Ответы:

4

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

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

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

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

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

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

Mei
источник
Я знаю о них, проблема в том, что они находят несопоставленные пары, мне нужно найти подходящие пары.
Кевин
@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.
Мэй
Да , должен быть блок, начинающийся с текущей строки. Хотя я нашел более полное решение, отредактируйте грядущее ...
Бесполезно