Насколько я знаю, это невозможно сделать. И вот почему:
Во-первых, вы должны искать между строками. Нет проблем, в vim добавление _ к символьному классу говорит ему включать новые строки. поэтому {_. *} будет соответствовать всему, что находится в скобках в нескольких строках.
Итак, теперь вам нужно сопоставить любой шаблон для заголовка функции (хрупкий, даже если он работает), и вот в чем проблема, независимо от того, какие строки находятся между ним и строкой поиска и, наконец, соответствует строке поиска. Таким образом, вы можете иметь регулярное выражение типа
/^\(void \+\a\+ *(.*)\)\_.*JOHN_DOE
Но что происходит, когда vim в первый раз находит заголовок функции и начинает сопоставлять. Затем соответствует каждому символу , пока не найдет JOHN_DOE. Который включает в себя все заголовки функций в файле.
Так что проблема в том, что, насколько я знаю, нет никакого способа сказать vim, что он соответствует каждому символу, кроме этого шаблона регулярного выражения. И даже если бы и было, регулярное выражение не является инструментом для этой работы. Это как открыть пиво молотком. Что мы должны сделать, это написать простой скрипт, который даст вам эту информацию, и у меня есть.
fun! FindMyFunction(searchPattern, funcPattern)
call search(a:searchPattern)
let lineNumber = line(".")
let lineNumber = lineNumber - 1
"call setpos(".", [0, lineNumber, 0, 0])
let lineString = getline(lineNumber)
while lineString !~ a:funcPattern
let lineNumber = lineNumber - 1
if lineNumber < 0
echo "Function not found :/"
endif
let lineString = getline(lineNumber)
endwhile
echo lineString
endfunction
Это должно дать вам желаемый результат, и гораздо проще поделиться, отладить и повторно использовать, чем выплевывать регулярные выражения из уст самого Ктулху.