在Vim中查找文件(通过递归目录搜索)

时间:2010-08-24 08:32:07

标签: vim

有没有办法在Vim中以递归方式搜索文件(在需要时使用通配符)?如果不是本地的,是否有可以处理此问题的插件?

16 个答案:

答案 0 :(得分:91)

您可以将通配符与:edit命令一起使用。所以,

:e **/test/Suite.java

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

另一个技巧是使用

:r! find . -type f

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

答案 1 :(得分:40)

有一个find命令。如果您在路径中添加**,则可以递归搜索。

:set path

将显示您当前的路径,通过执行类似

的操作添加**
:set path=.,/usr/include,,**

我从**

复制:set path之前的位

然后你可以输入

:find myfile.txt

它会神奇地打开!

如果将set命令添加到.vimrc,它将确保您将来可以进行递归搜索。它似乎不搜索点目录(例如.ssh)

答案 2 :(得分:17)

我建议ctrlp.vim。它是一个非常好的插件,非常适合在大型项目中工作。它具有按文件名或完整路径搜索,正则表达式搜索,自动检测项目根目录(具有.git | hg | svn | bzr | _darcs文件夹的文件夹),个性化文件名排除等等。

只需按<c-p>,它就会打开一个非常直观的窗格,您可以在其中搜索您想要的内容:

enter image description here

可以一次选择并打开多个文件。它还接受其他任意命令,例如跳转到某一行,字符串出现或任何其他Vim命令。

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

答案 3 :(得分:6)

vim作为内置查找命令(:help find)但只打开第一个找到的文件。但是你可以使用这个神奇的插件:FuzzyFinder,你可以做任何你想做的事情,甚至更多

答案 4 :(得分:3)

Command-T只需输入一些字母即可让您快速找到文件。您也可以在新选项卡中打开该文件,但需要使用ruby支持编译vim。

答案 5 :(得分:2)

你可以用!运行shell命令:

:! find . -name *.xml

答案 6 :(得分:2)

您可以使用:ex .浏览文件系统,但我不知道如何递归搜索(我是Vim新手 - 我一直使用它只有十年)。

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

另见this thread on SuperUser

答案 7 :(得分:1)

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

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

你也可以通过像这样执行它来使用像vim中的find或grep这样的外部命令

:!find ...

答案 8 :(得分:1)

类似Quickfix的结果浏览

用法:

Find my.regex

结果:

  • 新标签页打开
  • 每一行包含与grep -E正则表达式
  • 匹配的相对路径
  • 击:
    • <enter><C-w>gf在新标签页中打开当前行的文件
    • gf打开当前标签上的文件并丢失文件列表

改为查找所有文件:

Find

替代方法:

代码:

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>'))

答案 9 :(得分:1)

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

查找文件(模糊或其他)只是它可以为开发人员做些什么的冰山一角。它内置了对aggit以及其他无数程序/实用程序/ vim插件的支持。学习曲线可能有点陡峭,但我无法想象没有它的生活。用户群很大,并且会立即修复错误。

答案 10 :(得分:1)

根据您的情况(即,假设以下命令只能找到单个文件),可能使用如下命令:

:e `locate SomeUniqueFileName.java`

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

locate SomeUniqueFileName.java

请注意,这里的魔法就是命令的反引号,它会将shell命令的输出转换为Vim命令中可用的文本。

答案 11 :(得分: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>

答案 12 :(得分:1)

Command-t在我最喜欢的一个vim插件中,它是基于ruby的插件,上面与FZF.集成

通过使用Comamnd-T和FZF,您可以使用极快的“模糊”机制进行搜索:

  • 打开文件和缓冲区
  • 跳转到标签和帮助
  • 运行命令或以前的搜索和命​​令
  • 用最少的击键次数。

如你所见

enter image description here

我总是通过打开一个新终端搜索命令历史记录并点击:

CTRL+R

除了通过在任何终端选项卡中写入来递归搜索所有文件夹:

fzf

此外,您可以在vim

内写字
:CommandT 

非常强大而且快速。

答案 13 :(得分:1)

运行:

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

Vim将在反引号中运行shell命令,将文件列表放入arglist并打开第一个文件。 然后,您可以使用:args查看arglist(即列出找到的文件),并使用:n:N向前和向后浏览arglist中的文件。 参见https://vimhelp.org/editing.txt.html#%7Barglist%7Dhttps://vimhelp.org/editing.txt.html#backtick-expansion

答案 14 :(得分:0)

您可以使用此plugin在“路径”中递归查找文件。它也支持文件名的制表符完成。

答案 15 :(得分:0)

ag工具和相应的Ag vim插件可以完美解决此问题:

要使用某种模式查找文件,请使用:

AgFile! pattern

它将打开快速修复窗口,其中包含您可以选择的结果。

您可以添加vim键盘绑定以使用所选单词作为模式来调用此命令。

nnoremap <silent> <C-h> :AgFile! '<C-R><C-W>'<CR>
vnoremap <silent> <C-h> y :AgFile! '<C-R>"'<CR>