在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立了对ag
, git
和其他各种程序/ 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 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> <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>