Vim搜索类

3
如何定义一个vim函数,使其在调用时使用以下命令:
Foo

它通过vimgrep搜索

\s*class Foo

或者

\s*struct Foo

这是一个简易版的cscope/ctag工具,我希望能够输入类名并搜索该类。

如果这很容易实现,那么是否有一种方法可以让它查找光标下的单词作为要搜索的名称?

谢谢!

2个回答

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')

但是使用内置的<cword>功能似乎更加容易。


2

:h expand()函数中检查<cword>

fun! MySearch()
  exe 'vimgrep /\s*class '.expand('<cword>').'/ *'
endfun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接