如何定义vim函数,以便在使用
调用时Foo
它通过vimgrep搜索
\s*class Foo
或
\s*struct Foo
[这是穷人的cscope / ctag;我希望能够输入一个类名,并让它搜索该类。]
如果这很容易,有没有办法可以告诉它在我的光标下查看使用'word'作为搜索名称?
谢谢!
答案 0 :(得分: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
当您键入\ 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')
但是使用内置的&lt; cword&gt; 功能似乎更容易。
答案 1 :(得分:2)
检查<cword>
功能中的:h expand()
。
fun! MySearch()
exe 'vimgrep /\s*class '.expand('<cword>').'/ *'
endfun