3

で呼び出されたときにvim関数を定義するにはどうすればよいですか?

Foo

vimgrepを介して検索します

\s*class Foo

また

\s*struct Foo

[これは貧乏人のcscope/ctagです。クラス名を入力して、クラスを検索できるようにしたい。]

これが簡単な場合、検索する名前としてその「単語」を使用するようにカーソルの下を見るように指示する方法はありますか?

ありがとう!

4

2 に答える 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」は、「通常モード」でキーシーケンスをマップして何かを実行します。この場合、定義した関数を呼び出します。^ 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>機能を使用する方が簡単なようです。

于 2010-02-15T09:20:22.800 に答える
2

チェック<cword>イン:h expand()機能。

fun! MySearch()
  exe 'vimgrep /\s*class '.expand('<cword>').'/ *'
endfun
于 2010-02-15T09:25:22.777 に答える