Вот как бы я это сделал. Добавьте это к вашему.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 отступов. Если открывающая скобка имеет отступы, она все равно работает, хотя и занимает отметку. Если вы регулярно используете знак «а», вы можете переместить это, например,
vnoremap if ][mb%O'b
vnoremap if ][mc%O'c
...
lh#dev#find_function_boundaries
от lh-dev