2012-04-24 7 views
3

で新しいタブに一致するすべてのgrepの結果を表示する:は、私はVimの中で次の操作を行うためのホットキーをマップしようとしていますVimの

  1. マッチ現在のカーソル
  2. でマークされた電流c-単語がリストを生成しますすべての現在のプロジェクトでの発生
  3. オープンだから、結果

を示す新しいタブを見つけ、私はそれがCTAGSを使用する必要があり、一例はそうのような新しいタブで変数/関数の宣言を開きます:

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

それはCTRLヒットすると - \ を、新しいタブが変数の宣言で開かれた/機能カーソルがオンになっています。

私はマップしようとしているコマンドは以下の通りである:

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

私は、このコマンドを実行すると、新しいタブがテキストtext_i_want_to_findを含むすべての.cファイルのリストを示す開かれました。私はそれが今何をするかは異なる2つのことを行うために、これを修正する必要があります:

  1. ではなく、単に.c.cの拡張子を持つすべてのファイル、.h.cpp.mkを検索し、また「Makefileの」という名前のファイルを検索
  2. CTRL等カーソル下のCワード用
  3. 検索 - 手動でテキストを入力することとは対照的に、私は、上記に示した\マッピングtext_i_want_to_find

ここに私の.vimrcファイルのコードがあります。 CTRL - /が全くマッピングされていないと私は完全には分かりませんので、解決するためのもう一つの問題があります。

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

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


EDIT:

私に提供さ答えを確認した後、ここに私のコードの最終バージョンがあります:

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 + グラムにそれをマッピングされました。コロンコマンドのように呼び出すこともできます:

:SearchAll my_text_to_search_for 

これは他の人にも役立ちます。

答えて

4

もちろん、それは動作しません:あなたは:executeを忘れてしまった、あなたはキーワード文字(\>)が続くとし、任意の文字が付いていないexpand("<cword>")を探しているので、自分自身で:lvimgrepコマンドは、式を受け付けません。キーワード文字(\<.)に従わない。ここでは\(\)は役に立たない。その他の注意事項:

  1. map使用しないでください:あなたは、視覚とオペレータ待機モードや他のマッピングを使用する機能に取り組んでもないこのマッピングを必要としています。
  2. 一部のパターンは、*.[ch] *.cpp *.mk Makefileまたは*.{[ch],cpp,mk} Makefileにマージすることができます。
  3. <C-\>
  4. をマッピングすることができますが、ない <C-/>は(私は現在、願っていますが、それを固定には、実際の作業は行われません): \は0x5Cをして <C-\>ある0x5Cを-0x40の= 0x1cにはあります。しかし、 /は0x2Fと0x2F-0x40 <です。私のシステムでは、端末で <C-/>を押して <C-_>に変換すると、 <C-->も変わります。
  5. :splitコマンドは新しいタブを開きません。新しいウィンドウが開きます。これを行うには、:tabを前に付けます。
  6. :lvimgrepは結果を表示しません。 jフラグを削除しない限り、最初の結果にジャンプすることはありません。
  7. 最終的に忘れたのは<CR>:lw<CR>です。私は以下のように:lopenを使用しています。
  8. 最初に:または<C-\><C-n>の後に<C-u>を忘れた場合は、前にカウントを破棄する必要があります。
  9. <C-r>=expand("cword")<CR>、またはデフォルトのショートカット<C-r><C-w>があるため、いずれのマッピングにも実際に:executeは必要ありません。
  10. :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> 

と置き換えてください。

両方のマッピングを使用すると、<C-r>=escape(expand('<cword>'), '/\')<CR><C-r><C-w>を置き換えない場合は、'iskeyword'オプションでもない/\を持っていると仮定します。

+0

ありがとうございます。私は最終的にVim wikiで部分的な答えを見つけました:map : "grep -srnw --binary-files = without-match --exclude-dir = .git --exclude-from = exclude.list。 " expand( "")。 "" cwindow DevNull

+1

@Dogbert Vim wikiには、コード化されたアドバイスがたくさん含まれています。私は決して使っていません.Vimヘルプの知識は十分です。それらは役に立つかもしれませんが、*毎回vim wikiへのリンクを見ましたが、リンクをたどってもそのまま使用してはいけないコードを見ました。ほとんどのvimのヒントを打ち破る良いアドバイスがあります。 ':'と ';'を 'noremap:;'と 'noremap; : '。 //これらのマッピングは人々によって使用されます。なぜなら、シフトを省略することは ';'が依然として有効であるため、かなり高速化するからです。 – ZyX

関連する問題