Вот взлом от новичка 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
Это должно найти слово под курсором при вводе \ fi.
Расшифровка кода:
Если вы обычно вызываете vimgrep в функции и он не находит никаких результатов, он выдает ошибку, которая выглядит довольно уродливо, поэтому я обернул ее внутри блока try / catch / 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')
Но было бы проще использовать встроенную функцию .