Vimで(再帰的なディレクトリ検索を介して)ファイルを検索する


84

Vimでディレクトリを再帰的に検索して(必要に応じてワイルドカードを使用して)ファイルを検索する方法はありますか?ネイティブでない場合、これを処理できるプラグインはありますか?



@E_Joviはどういう意味ですか?
CiroSantilli郝海东冠事病六四事件法轮功2016

@CiroSantilli巴拿馬文件六四天法轮功私はあなたの名前を意味します。これは中国で禁じられている何かを表しています。
e_Jovi 2016

1
@E_Joviしかし、吊とはどういう意味ですか?私の中国人を改善するためだけに:
CiroSantilli郝海东冠状病六四天法轮功2016

2
@CiroSantilli巴拿馬文件六四天法轮功表彰用語として、他のほとんどの人ができないことを意味します。この場合、あなたの名前は歴史の真実を伝えていると思いますが、ほとんどの中国人は政府の行動のためにそれを行うことができません、軽蔑的な用語として、それは人が人への敬意の欠如を示す方法で話したり行動したりすることを表します。
e_Jovi 2016

回答:


108

:editコマンドでワイルドカードを使用できます。そう、

:e **/test/Suite.java

現在のディレクトリ階層のどこにあっても、test /Suite.javaが開きます。これはタブ補完で機能するため、ファイルを開く前に[tab]を使用してワイルドカードを展開できます。代わりに、考えられるすべての拡張機能を参照する方法については、ワイルドモードオプションも参照してください。

別のトリックは使用することです

:r! find . -type f

現在のディレクトリ内のすべてのファイルのリストをバッファにロードします。次に、通常のすべてのvimテキスト操作ツールを使用して、リストをナビゲート/並べ替え/トリミングCTRL+W gfし、新しいペインのカーソルの下にあるファイルを開くことができます。


1
+1編集コマンドでワイルドカードを試したことはありません。これは、ワイルドモードでも非常にうまく機能します。したがって、:e ** / Suite <tab>と入力すると、すべてのファイルに可能なファイルのリストが表示されます
mb14 2010

6
複雑なディレクトリ構造を持つ大きなファイルコレクションには十分注意してください。このコマンドは、vimを非常に長い間ハングさせる可能性があります。私のコードベースでは、すでに20分を検索しています。問題を複雑にしているのは、それを止める方法がないということです。通常のCtrl + CとCtrl + Breakを試しました。Procmonは、vimがまだ私のファイルを検索していることを示しています。したがって、解決策はすべての人に適しているわけではありません:(
evpo 2015

1
@evpo私も同じ問題を抱えていました。検索のパスの最初の部分を指定してフォルダーの数を減らすことで解決しました:e dir / ** /File.java。その後、1秒もかかりませんでした。
user79878 2017年

1
どうして私はこれについて知らなかったのですか?私はvimを20年以上使用しています。ただ素晴らしい👏🏼👏🏼👏🏼–
ブラッドリー

1
OMGこれは素晴らしいです!
Funkodebat

50

検索コマンドがあります。に**(を参照:help starstar)を追加すると、'path'再帰的に検索できます。

:set path

あなたの現在のパスを表示し、**次のようなことをして追加します

:set path+=**

次に入力するだけです

:find myfile.txt

そしてそれは魔法のように開きます!

setコマンドを.vimrcに追加すると、将来的に再帰検索を実行できるようになります。ドットディレクトリ(たとえば.ssh)を検索していないようです


1
ファイル名が非常に長い場合、この方法はあまり快適ではありませんか、それともそうmy*.txtですか?
Shrikant Sharat 2010

1
はい、*ワイルドカードを使用できます。を参照してください:h find

12
次のようにしてパスに追加することもできます:set path+=**
alanboy 2013

同様のロジックをvimrcに追加することに危険はありますか?cc @alanboy
iamnotsam

21

ctrlp.vimをお勧めします。これは非常に優れたプラグインであり、大規模なプロジェクト内で作業するのに理想的です。ファイル名またはフルパスによる検索、regexp検索、プロジェクトルートの自動検出(.git | hg | svn | bzr | _darcsフォルダーを持つもの)、パーソナライズされたファイル名の除外などがあります。

を押すだけで<c-p>、非常に直感的なペインが開き、必要なものを検索できます。

ここに画像の説明を入力してください

一度に複数のファイルを選択して開くことができます。また、特定の行へのジャンプ、文字列の出現、その他のVimコマンドなど、追加の任意のコマンドも受け入れます。

リポジトリ:https//github.com/kien/ctrlp.vim


5
kien /ctrlp.vimはメンテナンスされていないようです。コンセンサスを使用することがあるようですctrlpvim / ctrlp.vimフォーク、積極的に維持されるように思われる: github.com/ctrlpvim/ctrlp.vim
ダミアンÓCeallaigh

4
fzfはctrlpと非常によく似ています。それはより速く、結果をより良くソートします。Vimの外部でも機能しますが、Vimのサポートが組み込まれています:github.com/junegunn/fzf
still_dreaming_1

6

組み込みの検索コマンド(:help find)としてのvimですが、最初に見つかったファイルのみを開きます。しかし、あなたはこの驚くべきプラグインを使うことができます:あなたが望むすべてとさらに多くをするFuzzyFinder



3

Command-Tを使用すると、文字を入力するだけでファイルをすばやく見つけることができます。新しいタブでファイルを開くこともできますが、rubyをサポートしてコンパイルされたvimが必要です。


そしてctrlp.vimも。
クリス


2

私のお気に入りのvimプラグインの1つであるCommand-tは、FZFとの統合を超えるルビーベースのプラグインです。

Comamnd-TとFZFを使用すると、次のような非常に高速な「ファジー」メカニズムで検索を実行できます。

  • ファイルとバッファを開く
  • タグにジャンプしてヘルプ
  • 実行中のコマンド、または以前の検索とコマンド
  • 最小限のキーストロークで。

ご覧のように

ここに画像の説明を入力してください

私は常に新しいターミナルを開いてコマンド履歴を検索し、次のように押します。

CTRL+R

ターミナルタブに書き込むことにより、すべてのフォルダを再帰的に検索することに加えて、

fzf

また、中に書くことができます vim

:CommandT 

本当にパワフルで速い。


あなたも、ちょうどFZFプラス関連Vimのプラグインは、コマンド・トンを必要としないgithub.com/junegunn/fzf.vim
icc97

1
これを育ててくれてありがとう。バンドルと一緒にインストールしますが、そこにあることを知りません。ゆっくりと、しかし着実に、私はVSCodeを残しています:)。CLIヒーローであることは素晴らしいです!
ベニヤミンリマント

1

vimには、これを実行できるgrep、lgrep、vimgrep、またはlvimgrepという名前のコマンドが組み込まれています。

これらの使用方法に関するチュートリアルは次の とおりですhttp://vim.wikia.com/wiki/Find_in_files_within_Vim#Recursive_Search

このように実行することで、vimからfindやgrepなどの外部コマンドを使用することもできます。

:!find ...

grep、lgrep、vimgrep、またはlvimgrepはどのようにこれを行うことができますか?彼らはファイルではなくファイルを検索します。
kroiz 2017

たとえば、:grep test * / .java
Nikolaus Gradwohl 2017

これは、ファイル名.javaでtestという単語を検索しませんか?説明してもらえますか?私はそれを動かすことができませんでした。
kroiz 2017

@ kroiz、yes:grep test */.javatestすべての.javaファイルで単語を検索します。シェルコマンドを:!find使用しfindてファイルを検索します。findあなたはPCREまたは拡張正規表現とそれを組み合わせる場合は、シェルコマンドは、かなり強力です
alpha_989

1

Unite.vimについてまだ誰も言及していないことに驚いています。

ファイルを見つけることは(あいまいであろうとなかろうと)、開発者にとって何ができるかという氷山の一角にすぎません。それはのためのサポートが組み込まれておりaggitおよび他のプログラム/ユーティリティ/ vimのプラグインの無数。学習曲線は少し急になる可能性がありますが、それなしでは私の人生を想像することはできません。ユーザーベースは大きく、バグはすぐに修正されます。


1

Quickfixのような結果ブラウジング

使用法:

Find my.regex

結果:

  • 新しいタブが開きます
  • 各行には、grep -E正規表現に一致する相対パスが含まれています
  • ヒット:
    • <enter>または<C-w>gf、現在の行のファイルを新しいタブで開く
    • gf 現在のタブでファイルを開き、ファイルリストを失うには

代わりにすべてのファイルを検索します。

Find

代替方法:

  • Gfind my.regex:Gitで追跡されたファイルのみを検索します(git ls-files)。逃亡者のリクエスト:https//github.com/tpope/vim-fugitive/issues/132#issuecomment-200749743
  • Gtfind my.regex:のようGfindですが、現在のディレクトリではなくgitトップレベルから検索します
  • Locate somefilelocateバージョン

コード:

function! Find(cmd)
  let l:files = system(a:cmd)
  if (l:files =~ '^\s*$')
    echomsg 'No matching files.'
    return
  endif
  tabedit
  set filetype=filelist
      set buftype=nofile
  " TODO cannot open two such file lists with this. How to get a nice tab label then?
  " http://superuser.com/questions/715928/vim-change-label-for-specific-tab
  "file [filelist]
  put =l:files
  normal ggdd
  nnoremap <buffer> <Enter> <C-W>gf
  execute 'autocmd BufEnter <buffer> lcd ' . getcwd()
endfunction
command! -nargs=1 Find call Find("find . -iname '*'" . shellescape('<args>') . "'*'")
command! -nargs=1 Gfind call Find('git ls-files | grep -E ' . shellescape('<args>'))
command! -nargs=1 Gtfind call Find('git rev-parse --show-toplevel && git ls-files | grep -E ' . shellescape('<args>'))
command! -nargs=1 Locate call Find('locate ' . shellescape('<args>'))

1

状況に応じて(つまり、次のコマンドで1つのファイルしか検出されないと仮定して)、次のようなコマンドを使用します。

:e `locate SomeUniqueFileName.java`

これにより、Vimは、現在のタブ(eコマンド)で、実行の結果であるファイル(この例では)を開きます。

locate SomeUniqueFileName.java

ここでの魔法はコマンドの周りのバックティックであり、シェルコマンドからの出力をVimコマンドで使用可能なテキストに変換することに注意してください。


1

この関数専用のプラグインは必要ありません。以下のコードスニペットで十分です。

function! FindFiles()
    call inputsave()
    let l:dir = input("Find file in: ", expand("%:p:h"), "dir")
    call inputrestore()
    if l:dir != ""
        call inputsave()
        let l:file = input("File name: ")
        call inputrestore()
        let l:nf = 'find '.l:dir.' -type f -iname '.l:file.' -exec grep -nH -m 1 ".*" {} \;'
        lexpr system(l:nf)
    endif
endfunction
nnoremap <silent> <leader>fo :call FindFiles()<CR>

使用方法の例を追加してください。
Vitaly Zdanevich

1

実行:

:args `find . -name '*xml'`

Vimはバッククォートでシェルコマンドを実行し、ファイルのリストをarglistに入れて、最初のファイルを開きます。次に、あなたが使用できる:args引数リスト(ファイルが見つからすなわちリスト)を表示し、:nかつ:N引数リスト内のファイルを前方とbacwardsナビゲートします。https://vimhelp.org/editing.txt.html#%7Barglist%7Dおよびhttps://vimhelp.org/editing.txt.html#backtick-expansionを参照してください



0

agツールと対応するAgvimプラグインは、この問題を完全に解決します。

いくつかのパターンを使用してファイルを見つけるには、次を使用します。

AgFile! pattern

クイックフィックスウィンドウが開き、結果を選択できます。

選択した単語をパターンとして使用してこのコマンドを呼び出すために、vimキーバインディングを追加できます。

nnoremap <silent> <C-h> :AgFile! '<C-R><C-W>'<CR>
vnoremap <silent> <C-h> y :AgFile! '<C-R>"'<CR>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.