Ось як я це зробив би. Додайте це до свого.vimrc
vnoremap if [[O][
Пояснення: vnoremap означає зіставити ліву частину if
в праву частину, [[mO][
поки ви перебуваєте у візуальному режимі. if
означає у функції , хоча ви можете перейменувати це, якщо хочете. [[
переходить до початку функції. O
переміщується до іншого кінця вашого візуально вибраного тексту, а потім ][
переміщується до кінця функції.
Отже, якщо ви хочете здійснити пошук у функції, тепер v
перейдіть у візуальний режим за допомогою та виберіть всю функцію за допомогою if
. Тепер вийдіть із візуального режиму за допомогою <esc>
та виконайте пошук за допомогою /\%V
. \%V
обмежує ваш пошук раніше вибраним текстом. Якщо ви не хочете вдарити <esc>/\%V
, можете також додати це до свого .vimrc
:
vnoremap / <esc>/\%V
Тоді ваша послідовність натискань клавіш виглядатиме так:
vif/foo<enter>
і це знайде всі виникнення foo в поточній функції.
Єдиним недоліком цього методу є те, що він очікує, що брекети відкривання та закриття мають обидва відступи. Якщо ви регулярно працюєте з кодом, у якого цього немає, наприклад
int foo() {
bar()
}
тоді ця трохи складніша версія буде працювати:
vnoremap if ][ma%O'a
Це очікує, що на фіксації дужки буде 0 відступів. Якщо на вступній дузі є відступи, вона все ще спрацьовує, хоча і не має позначки. Якщо ви регулярно використовуєте позначку "a", ви можете перемістити це, наприклад
vnoremap if ][mb%O'b
vnoremap if ][mc%O'c
...
lh#dev#find_function_boundaries
від lh-dev