Вот хак от VIM новичка, который, кажется, работает:
function! SearchFunc()
let l:filenames = substitute(glob("*.c") . glob("*.cpp") . glob("*.h"), '\n', ' ', 'g')
try
execute 'vimgrep /^\s*\(struct\|class\)\s*' . expand("<cword>") . '/ ' . l:filenames
catch
echon 'No results found.'
sleep 800m
endtry
endfunction
nmap <Leader>fi :call SearchFunc()^M
Это должно искать слово под курсором при вводе \ ц.
Объясняя код:
Если вы звоните vimgrep обычно в функции и не находит никаких результатов, он выдает ошибку, которая выглядит довольно некрасиво, поэтому я завернула внутрь попробовать/поймать/endtry блок. Когда происходит ошибка, мы исходим из того, что не было совпадения, и мы выводим сообщение, а затем делаем паузу, чтобы она не сразу исчезла.
«nmap» отображает последовательность клавиш в «нормальном режиме», чтобы что-то сделать. В этом случае он вызывает функцию, которую мы только что определили. Вы должны ввести Ctrl-V, Ctrl-M
в конце строки, чтобы создать ^M, чтобы он имитировал нажатие на возврат.
Если вы хотите, чтобы изменить функцию, чтобы принимать какие-либо аргументы вы могли бы изменить это так:
function! SearchFunc(findme)
let l:filenames = substitute(glob("*.c") . glob("*.cpp") . glob("*.h"), '\n', ' ', 'g')
try
execute 'vimgrep /^\s*\(struct\|class\)\s*' . a:findme . '/ ' . l:filenames
catch
echon 'No results found.'
sleep 800m
endtry
endfunction
Тогда вы можете вызвать его, введя
:call SearchFunc('foo')
Но казалось бы проще просто использовать встроенный <cword> особенность.
Почему бы вам не использовать CTags? – Artyom