在Vim中find一个文件(通过recursion目录search)

有没有什么办法在Vim中recursionsearch文件(需要时使用通配符)? 如果不是本地的,有没有可以处理这个插件?

您可以使用:edit命令使用通配符。 所以,

 :e **/test/Suite.java 

将打开test / Suite.java,无论它在当前目录层次结构中。 这适用于制表符完成,因此您可以在打开文件之前使用[制表符]展开通配符。 另请参阅wildmode选项,以便浏览所有可能的扩展。

另一个诀窍是使用

 :r! find . -type f 

将当前目录中所有文件的列表加载到缓冲区中。 然后,您可以使用所有常用的vim文本处理工具来导航/sorting/修剪列表,而CTRL+W gf可以在新窗格中的光标下打开文件。

有一个find命令。 如果将**添加到path中,则可以recursionsearch。

 :set path 

会告诉你你当前的path,添加**做类似的事情

 :set path=.,/usr/include,,** 

**之前我从最初的位置复制:set path

那么你可以input

 :find myfile.txt 

它神奇地打开!

如果将set命令添加到.vimrc中,它将确保您将来可以执行recursionsearch。 它似乎没有search点目录(例如.ssh)

我build议ctrlp.vim 。 这是一个非常好的插件,适合在大型项目中工作。 它通过文件名或完整pathsearch,正则expression式search,项目根目录的自动检测(带有.git | hg | svn | bzr | _darcs文件夹的目录),个性化文件名排除等等。

只需按<cp> ,它会打开一个非常直观的窗格,您可以在其中search您想要的内容:

在这里输入图像说明

一次可以select和打开多个文件。 它还接受附加的任意命令,如跳转到某一行,string出现或任何其他Vim命令。

回购: https : //github.com/kien/ctrlp.vim

vim作为内build的find命令(:help find)但是只能打开第一个find的文件。 然而,你可以使用这个惊人的插件: FuzzyFinder ,它可以完成你想要的任何事情,甚至更多

Command-T让你只需input一些字母就能快速find文件。 您也可以在新标签中打开文件,但需要使用ruby支持编译vim。

vim在名为grep,lgrep,vimgrep或lvimgrep的命令中可以执行此操作

这里是如何使用它们的教程http://vim.wikia.com/wiki/Find_in_files_within_Vim#Recursive_Search

你也可以像这样执行一个像vim这样的外部命令,如find或者grep

 :!find ... 

您可以使用 ! 运行shell命令:

 :! find . -name *.xml 

您可以使用以下方式浏览文件系统:ex . ,但我不知道如何recursionsearch(我是一个Vim新手 – 我只用了十年)。

有一些stream行的文件浏览器插件:

  • NERD树
  • 强大的探险家
  • vtreexplorer

参见SuperUser上的这个线程 。

我很惊讶没有人提到Unite.vim呢。

查找文件(模糊或其他)只是它可以为开发人员做的冰山一angular。 它已经build立了对aggit和其他各种程序/ utilities / vim插件的支持。 学习曲线可能有点陡峭,但我无法想象我的生活没有它。 用户群很大,并且错误被立即修复。

类似Quickfix的结果浏览

用法:

 Find my.regex 

结果:

  • 一个新标签打开
  • 每行包含一个匹配grep -E正则expression式的相对path
  • 击中:
    • <enter><Cw>gf在新选项卡中打开当前行上的文件
    • gf打开当前选项卡上的文件并丢失文件列表

find所有文件:

 Find 

替代方法:

  • Gfind my.regex :只searchGit跟踪的文件( git ls-files )。 无组织要求:
  • Gtfind my.regex :和Gfind一样,但是从git顶层search而不是当前目录
  • 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> <CW>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>')) 

根据你的情况(也就是说,假设下面的命令只能find一个文件),也许可以使用如下命令:

 :e `locate SomeUniqueFileName.java` 

这将导致Vim在当前标签(e命令)中打开一个作为运行结果的文件(在本例中),

 locate SomeUniqueFileName.java 

请注意,这里的魔术是围绕命令的反引号,它将shell命令的输出转换为可在Vim命令中使用的文本。

你可以用这个插件在你的“path”中recursion地find文件。 它也支持文件名的标签填写。

你不需要一个只为这个function的插件,下面的代码片段就足够了。

 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>