如何定义一个 vim 函数,以便在调用时使用
Foo
它通过 vimgrep 搜索
\s*class Foo
或者
\s*struct Foo
?
[这是poorman的cscope/ctag;我希望能够输入一个类名,并让它搜索类。]
如果这很容易,有没有办法告诉它在我的光标下查看以使用该“单词”作为搜索的名称?
谢谢!
签到功能<cword>
。:h expand()
fun! MySearch()
exe 'vimgrep /\s*class '.expand('<cword>').'/ *'
endfun
这是来自 vim 新手的 hack,它似乎有效:
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')
但是使用内置的<cword>功能似乎更容易。