2010-02-15 81 views
3

如何定義一個VIM功能,這樣當有Vim的搜索

Foo 

稱它爲通過使用vimgrep搜索

\s*class Foo 

\s*struct Foo 

[這是窮人的cscope/ctag;我想要能夠鍵入類名,並讓它搜索類。]

如果這很容易,有沒有一種方法可以告訴它看我的光標下使用該'單詞'作爲要搜索的名稱?

謝謝!

+0

爲什麼不使用CTags? – Artyom 2010-02-15 08:52:07

回答

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 

這應搜索的單詞光標下,當你鍵入\網絡連接。

顯性化代碼:

如果你在一個函數調用正常使用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

檢查<cword>:h expand()功能。

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