Vim搜索课程

时间:2010-02-15 07:57:26

标签: c++ ctags vim

如何定义vim函数,以便在使用

调用时
Foo

它通过vimgrep搜索

\s*class Foo

\s*struct Foo

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

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

谢谢!

2 个答案:

答案 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
相关问题