In 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 Так, але лише тоді, коли він знайде один із дужок на лінії.
Кевін

Якщо ви не проти скриптів Addon, matchit addon надає 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.