如何定義一個VIM功能,這樣當有Vim的搜索
Foo
稱它爲通過使用vimgrep搜索
\s*class Foo
或
\s*struct Foo
?
[這是窮人的cscope/ctag;我想要能夠鍵入類名,並讓它搜索類。]
如果這很容易,有沒有一種方法可以告訴它看我的光標下使用該'單詞'作爲要搜索的名稱?
謝謝!
如何定義一個VIM功能,這樣當有Vim的搜索
Foo
稱它爲通過使用vimgrep搜索
\s*class Foo
或
\s*struct Foo
?
[這是窮人的cscope/ctag;我想要能夠鍵入類名,並讓它搜索類。]
如果這很容易,有沒有一種方法可以告訴它看我的光標下使用該'單詞'作爲要搜索的名稱?
謝謝!
下面是從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>功能。
檢查<cword>
在:h expand()
功能。
fun! MySearch()
exe 'vimgrep /\s*class '.expand('<cword>').'/ *'
endfun
爲什麼不使用CTags? – Artyom 2010-02-15 08:52:07