有什么方法可以在Vim中递归地在目录中搜索文件(需要时使用通配符)?如果不是本地的,是否有可以处理此问题的插件?
有什么方法可以在Vim中递归地在目录中搜索文件(需要时使用通配符)?如果不是本地的,是否有可以处理此问题的插件?
Answers:
您可以在:edit
命令中使用通配符。所以,
:e **/test/Suite.java
不管它在当前目录层次结构中的什么位置,都将打开test / Suite.java。此选项卡可使用制表符完成功能,因此您可以在打开文件之前使用[tab]扩展通配符。另请参阅wildmode选项,以浏览所有可能的扩展。
另一个技巧是使用
:r! find . -type f
将当前目录中所有文件的列表加载到缓冲区中。然后,您可以使用所有常用的vim文本操作工具来导航/排序/整理列表,并CTRL+W gf
在新窗格中的光标下方打开文件。
有一个find命令。如果将添加**
(请参阅:help starstar
),'path'
则可以递归搜索:
:set path
将显示您当前的路径,**
通过执行类似的操作来添加
:set path+=**
然后你可以输入
:find myfile.txt
它神奇地打开了!
如果将set命令添加到.vimrc中,将确保将来可以进行递归搜索。它似乎不搜索点目录(例如.ssh)
my*.txt
可以呢?
:h find
。
:set path+=**
我建议ctrlp.vim。这是一个非常好的插件,非常适合在大型项目中使用。它具有按文件名或完整路径进行搜索,正则表达式搜索,自动检测项目根目录(具有.git | hg | svn | bzr | _darcs文件夹的目录),个性化文件名排除项等等。
只需按<c-p>
,它将打开一个非常直观的窗格,您可以在其中搜索所需内容:
可以一次选择并打开多个文件。它还接受其他任意命令,例如跳转到特定行,出现字符串或任何其他Vim命令。
vim作为内置的查找命令(:help find),但仅打开第一个找到的文件。但是,您可以使用这个出色的插件:FuzzyFinder,它可以完成您想要的一切,甚至更多
vim在名为grep,lgrep,vimgrep或lvimgrep的命令中可以执行此操作
这是有关如何使用它们的教程 http://vim.wikia.com/wiki/Find_in_files_within_Vim#Recursive_Search
您也可以通过执行以下命令来使用vim的外部命令,例如find或grep
:!find ...
:grep test */.java
将test
在所有.java
文件中搜索单词。:!find
将使用find
shell命令查找文件。如果将find
shell命令与pcre或扩展的正则表达式结合使用,则shell命令非常强大
类似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-200749743Gtfind my.regex
:like 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>'))
根据您的情况(即假设以下命令仅找到一个文件),也许使用类似以下的命令:
:e `locate SomeUniqueFileName.java`
这将使Vim在当前选项卡(e命令)中打开一个运行后的文件(在此示例中),
locate SomeUniqueFileName.java
注意,这里的魔术是命令周围的反引号,它将把shell命令的输出转换成Vim命令中可用的文本。
您仅需要此功能的插件,下面的代码片段就足够了。
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>
跑:
: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
您可以使用此插件在“路径”中递归查找文件。它还支持文件名的制表符补全。