3

Vimで次のことを行うためにホットキーをマップしようとしています:

  1. カーソルによって現在マークされている現在の c-word に一致する
  2. 現在のプロジェクトで見つかったすべてのオカレンスのリストを生成します
  3. 結果を表示する新しいタブを開く

したがって、CTAGS を使用する 1 つの例では、次のように新しいタブで変数/関数の宣言を開きます。

map <C-\> :split<CR>:exec("tag ".expand("<cword>"))<CR>

CTRL-を押すと、カーソルが\置かれている変数/関数の宣言を含む新しいタブが開きます。

マップしようとしているコマンドを以下に示します。

:lvim /\<\(text_i_want_to_find\)\>/gj *.c
:lw

このコマンドを実行すると、新しいタブが開き.c、テキストを含むすべてのファイルのリストが表示されますtext_i_want_to_find。これを変更して、現在とは異なる 2 つのことを行う必要があります。

  1. だけでなく、、、、、の拡張子を持つすべてのファイルを検索し.c、「Makefile」という名前のファイルも検索します.h.cpp.mk.c
  2. CTRLテキストを手動で入力するのではなく、上に示した-\マッピングのように、カーソルの下の c-word を検索します。text_i_want_to_find

.vimrcマッピング用の私のファイル内のコードは次のとおりです。CTRL-をマッピングできるかどうかは完全にはわかりません/。そのため、解決すべき問題がもう 1 つあります。

map <C-/> :split<CR>:lvim /\<\(.expand("<cword>")\)\>/gj *.c *.h *.cpp *.mk Makefile

この Vim マッピングを修正するためのヒントはありますか?


編集:

提供された回答を確認した後、コードの最終バージョンを次に示します。

command! -nargs=1 SearchAll execute " grep -srnw --binary-files=without-match --exclude={*~,tags} --exclude-dir=.svn  . -e " . expand("<args>") . " " <bar> cwindow
map <C-g> :SearchAll <cword><CR>

CTRL+にマッピングしましたg。コロン コマンドのように呼び出すこともできます。

:SearchAll my_text_to_search_for

これが他の人にも役立つことを願っています!

4

1 に答える 1

4

もちろん、それは機能しません: を忘れました:execute:lvimgrepコマンド自体は式を受け入れないため、キーワード文字 ( ) が続かず、キーワード文字 ( ) に続かない文字が前にあるものを検索しexpand("<cword>")\>います\<.\(ここで\)は役に立たない。その他の注意事項:

  1. 使用しないでくださいmap: ビジュアルおよびオペレーター保留モードで動作するこのマッピングも、他のマッピングを使用する機能も必要ありません。
  2. 一部のパターンはマージできます:*.[ch] *.cpp *.mk Makefileまたは*.{[ch],cpp,mk} Makefile.
  3. <C-\>マッピングできますが、できません<C-/>(現在だけだといいのですが、実際の修正作業は行われていません):\は 0x5C で、<C-\>0x5C-0x40=0x1C です。しかし/、0x2F と 0x2F-0x40<0 です。私のシステムでは、ターミナルを押す<C-/>と に変換され<C-_>ます<C-->
  4. :splitコマンドは新しいタブを開くのではなく、新しいウィンドウを開きます。これを行うには、先頭に を付け:tabます。
  5. :lvimgrep結果は表示されません。jフラグを削除しない限り、最初の結果にジャンプすることもありません。
  6. <CR>finalと を忘れました:lw<CR>。以下で使用し:lopenますが、このコンテキストでは、まったく同じ結果が得られます。
  7. <C-u>after first:またはbeforeを忘れました<C-\><C-n>: count を破棄する必要があります。
  8. またはデフォルトのショートカット:executeがあるため、どちらのマッピングにも実際には必要ありません。<C-r>=expand("cword")<CR><C-r><C-w>
  9. 書いてはいけません:exec(str): は関数ではないので混乱を招き:executeます。を使用し:execute strます。

したがって、最終的なマッピングは次のとおりです。

nnoremap <C-\> :<C-u>tab split \| lvimgrep /\V\<<C-r><C-w>\>/gj *.{[ch],cpp,mk} Makefile \| lopen<CR>

. に置き換えます

nnoremap <C-\> :<C-u>lvimgrep /\V\<<C-r><C-w>\>/gj *.{[ch],cpp,mk} Makefile \| tab lopen<CR>

新しく開いたタブに現在のファイルを表示したくない場合。

どちらのマッピングも、を に置き換える場合、オプション/もオプションもないと仮定します。\'iskeyword'<C-r><C-w><C-r>=escape(expand('<cword>'), '/\')<CR>

于 2012-04-24T19:00:45.203 に答える