2010-02-15 2 views
3

Как определить функцию ВИМ таким образом, что при вызове споиск Vim для класса

Foo 

он ищет через vimgrep для

\s*class Foo 

или

\s*struct Foo 

?

[Это cscope/ctag of poorman; Я хочу, чтобы иметь возможность вводить имя класса и искать его для класса.]

Если это не так, то я могу сказать, что он может подглядывать под моим курсором, чтобы использовать это слово имя для поиска?

Спасибо!

+0

Почему бы вам не использовать CTags? – Artyom

ответ

2

Вот хак от 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> особенность.

2

Проверьте <cword> в :h expand() функция.

fun! MySearch() 
    exe 'vimgrep /\s*class '.expand('<cword>').'/ *' 
endfun 
Смежные вопросы