で呼び出されたときに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
\ fiと入力すると、カーソルの下の単語が検索されます。
コードの説明:
関数で通常vimgrepを呼び出しても結果が見つからない場合は、かなり見苦しいエラーがスローされるため、try / catch/endtryブロック内にラップしました。エラーが発生した場合は、一致するものがなかったためと推測し、メッセージを表示してから一時停止して、すぐに消えないようにします。
「nmap」は、「通常モード」でキーシーケンスをマップして何かを実行します。この場合、定義した関数を呼び出します。^ MCtrl-V, Ctrl-M
を作成するには、行の最後に入力する必要があるため、returnキーを押すことをシミュレートします。
関数を変更して任意の引数を取る場合は、次のように変更できます。
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