有没有办法在Vim中以递归方式搜索文件(在需要时使用通配符)?如果不是本地的,是否有可以处理此问题的插件?
答案 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>
,它就会打开一个非常直观的窗格,您可以在其中搜索您想要的内容:
可以一次选择并打开多个文件。它还接受其他任意命令,例如跳转到某一行,字符串出现或任何其他Vim命令。
答案 3 :(得分:6)
vim作为内置查找命令(:help find)但只打开第一个找到的文件。但是你可以使用这个神奇的插件:FuzzyFinder,你可以做任何你想做的事情,甚至更多
答案 4 :(得分:3)
Command-T只需输入一些字母即可让您快速找到文件。您也可以在新选项卡中打开该文件,但需要使用ruby支持编译vim。
答案 5 :(得分:2)
你可以用!运行shell命令:
:! find . -name *.xml
答案 6 :(得分:2)
您可以使用:ex .
浏览文件系统,但我不知道如何递归搜索(我是Vim新手 - 我一直使用它只有十年)。
有一些流行的文件浏览器插件:
答案 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
替代方法:
Gfind my.regex
:仅搜索Git跟踪文件(git ls-files
)。逃犯请求:https://github.com/tpope/vim-fugitive/issues/132#issuecomment-200749743 Gtfind my.regex
:与Gfind
类似,但是从git顶层搜索而不是当前目录Locate somefile
:locate
版本代码:
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。
查找文件(模糊或其他)只是它可以为开发人员做些什么的冰山一角。它内置了对ag
,git
以及其他无数程序/实用程序/ 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,您可以使用极快的“模糊”机制进行搜索:
如你所见
我总是通过打开一个新终端搜索命令历史记录并点击:
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%7D和https://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>