Vimの検索の一致をどのようにリストできますか?


回答:


3
    " put in your ~/.vimrc file
    " START search related configs and helps
    "
    " ignore case when searching
    set ignorecase

    " search as characters are entered, as you type in more characters, the search is refined
    set incsearch

    " highlight matches, in normal mode try typing * or even g* when cursor on string
    set hlsearch

    " yank those cheat commands, in normal mode type q: than p to paste in the opened cmdline
    " how-to search for a string recursively
    " :grep! "\<doLogErrorMsg\>" . -r
    "
    " how-to search recursively , omit log and git files
    " :vimgrep /srch/ `find . -type f \| grep -v .git \| grep -v .log`
    " :vimgrep /srch/ `find . -type f -name '*.pm' -o -name '*.pl'`
    "
    " how-to search for the "srch" from the current dir recursively in the shell
    " vim -c ':vimgrep /srch/ `find . -type f \| grep -v .git \| grep -v .log`'
    "
    " how-to highlight the after the search the searchable string
    " in normmal mode press g* when the cursor is on a matched string

    " how-to jump between the search matches - open the quick fix window by
    " :copen 22

    " how-to to close the quick fix window
    " :ccl

    " F5 will find the next occurrence after vimgrep
    map <F5> :cp!<CR>

    " F6 will find the previous occurrence after vimgrep
    map <F6> :cn!<CR>

    " F8 search for word under the cursor recursively , :copen , to close -> :ccl
    nnoremap <F8> :grep! "\<<cword>\>" . -r<CR>:copen 33<CR>

    " omit a dir from all searches to perform globally
    set wildignore+=**/node_modules/**

    " use perl regexes - src: http://andrewradev.com/2011/05/08/vim-regexes/
    noremap / /\v
    "
    " STOP  search related configs and helps

1
私はあなたのF5-F8アイデアがたくさん好きです。ここにそれらのコマンドのいくつかの視覚化/出力があるといいでしょう。F8はどのように機能するように設計されていますか?現在のディレクトリのみを検索しますか?--dirの省略はカスタムnode_modulesです--なぜですか?--perl正規表現はVimのデフォルト機能をどのように変更しますか?--以下は、.texファイルの検索をどのように設計したかです。askubuntu.com/a/789769/25388それを改善する方法をあなたから学ぶとよいでしょう。あまり直感的ではないので、自分でもロジックを忘れてしまいました。
レオ・レオポルド・ヘルツ준 영

node_modules ...それは単なる一例です...あなたはフロントエンドを開発する場合は、NPMのモジュールからjsのコードの多くを含むディレクトリである
Yordanゲオルギエフ

1
.vimrcのバックアップを作成してそれらの設定を追加し、それらを:so%でロードしてから、コマンドで「ヘルプ」を実行してみてください... vimは困難です-何千回も繰り返す必要がありますが、一度それらを習得すれば、グレッドの新しいUI IDE機能を指す@everyoneが笑うでしょう...
Yordan Georgiev

225
:g//p

より長い形で:

:global/regular-expression/print

パターン/正規表現を省略すると、Vimは以前の検索語を再利用します。

トリビア:grepのツールは、このコマンドシーケンスにちなんで命名されました。


18
:g//-p(rint)はデフォルトのアクションなので、省略してもかまいません。
デケガード

6
:g/さらに短いです!
Sparhawk 2016年

2
grepのように、ここにコンテキストを表示することは可能--context 9ですか?
Vitaly Zdanevich 2017年

@VitalyZdanevich試し:%s/regular-expression//gn てみてくださいこれらの線に沿って何かが生成されます:X matches on Y lines
Alexej Magura

@AlexejMaguraつまり、文字列の前後に数行を表示するにはどうすればよいですか?
Vitaly Zdanevich

50

あなたも行うことができます:

g/pattern/#

必要なパターンと行番号を印刷します。


2
良いですね。ただし、すでに行番号が有効になっている場合#は必要ありません。デフォルトで行番号が表示されます
Pavan Manjunath '25

44

このリストを見て一致間をすばやくジャンプする場合は、使用を検討してください

:vimgrep example %

または

:grep example %

これはあなたが使用できるように試合のすべてと、「エラーリスト」を移入します:copenクイックフィックスバッファ内のリストにそれらのすべてを、プレスのようなその試合、または使用コマンドにジャンプする特定の行に入力:cnし、:cp前後に行くことに。

詳細な説明については、同様の質問への私の返信を参照しください


これはE499: Empty file name for '%' or '#', only works with ":p:h"MacVim 8.1に与える
リンカーンベルジソン

35

新しいものを学んだ:Location List
入力:lvim foo %fooて現在のファイルを検索し、含まfooれるすべての一致をロケーションリストに入力します。
入力:lopenして、通常どおり完全にナビゲートできるクイックフィックスウィンドウでロケーションリストを開きます。/ toを
使用してリスト全体を表示します(最良のエクスペリエンスを得るにはtpope / unimpairedマッピングを使用します):lnext:lprevious


2
いいヒント!これにより、カーソルの下の単語を自動的に展開し、1回のスイープでlopenするこのマッピングを作成しました:nnoremap <leader> f:lvim / <cr> = expand( "<cword>")<cr> /%<cr>: lopen <CR>
ヨルゲン

16

別の可能性は、インクルードファイル検索コマンドを使用することです。

[I

これにより、カーソルの下にある単語のすべての出現がリストされます。ただし、現在のファイルに含まれているすべてのファイルも検索されるため、必要以上の数になる可能性があります。

ただし、このコマンドの良い点は、検索結果の表示には、各一致の行番号に加えて、一致数のカウントも表示されることです。

:help include-search

多くのバリアントを表示します。

についてのメモ

:g//p

これはさらに削減することができます

:g//

他の人が言ったように、p(rint)がデフォルトのアクションだからです。


[Igrepのように、コンテキストで結果を取得することは可能--context 9ですか?
Vitaly Zdanevich 2017年

10

あなたは素敵な得ることができquickfix、あなたの現在の検索パターンを形成試合でウィンドウを

:vim // %
:copen

以前に複雑な検索パターンを作成した場合に非常に便利です。 /pattern

編集:これは、すべての開いているバッファでも機能することがわかりました

:bufdo vimgrepadd // %
:copen

10

を使用:set hlsearchすると、すべての一致が黄色で強調表示され、ファイルを簡単にスキャンして一致を探すことができます。それはあなたが望むものではないかもしれませんが、検索した後、:g // pはリストされた一致を与えます


2
「:hlsearch」ではなく「:set hlsearch」にしてください。
あまりにも多くのPHP

:nohlハイライトが不要になった場合は、マップしてハイライトをクリアすることも役立ちます。
Kos

9

これについて詳しく説明するには...の代わりに

/example
:g//p

直接書くこともできます

:g/example/p

または、p(rint)が:g(lobal)コマンドのデフォルトアクションであるため、これは次のように短縮できます。

:g/example

そして、p(rint)の代わりに、d(elete)などの他のアクションが可能です。:help:globalを参照してください


6
g/pattern

がある場合:set number、上記のコマンドは行番号も表示します。

していない場合は:set number

g/pattern/#

行番号が表示されます。


0

このためのコードを書きました。これは実際にの問題を回避しますvimgrep。名前のないファイルでも機能します。そして、それは使いやすいです。

function! Matches(pat)
    let buffer=bufnr("") "current buffer number
    let b:lines=[]
    execute ":%g/" . a:pat . "/let b:lines+=[{'bufnr':" . 'buffer' . ", 'lnum':" . "line('.')" . ", 'text': escape(getline('.'),'\"')}]"
    call setloclist(0, [], ' ', {'items': b:lines}) 
    lopen
endfunction

パターンで呼び出すと、すべての一致を含むロケーションウィンドウが開きます。

これはコマンドかもしれません

command! -nargs=1 Mat call Matches(<f-args>)

だからあなたがしなければならないすべてはタイプすることです :Mat pattern

また、次のマッピングを使用して、現在のビジュアル選択の一致を取得します。

vnoremap Y "xy:call Matches(@x)<CR>

-1

Ctrl-fですべての検索結果を一覧表示します。

nmap <C-f> :vimgrep /<C-r>//g %<CR> \| !:copen <Enter>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.