3

如何定义一个 vim 函数,以便在调用时使用

Foo

它通过 vimgrep 搜索

\s*class Foo

或者

\s*struct Foo

?

[这是poorman的cscope/ctag;我希望能够输入一个类名,并让它搜索类。]

如果这很容易,有没有办法告诉它在我的光标下查看以使用该“单词”作为搜索的名称?

谢谢!

4

2 回答 2

2

签到功能<cword>:h expand()

fun! MySearch()
  exe 'vimgrep /\s*class '.expand('<cword>').'/ *'
endfun
于 2010-02-15T09:25:22.777 回答
2

这是来自 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>功能似乎更容易。

于 2010-02-15T09:20:22.800 回答