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

在Vim中查找文件(通过递归目录搜索),vim,Vim,是否有任何方法可以在Vim中递归搜索目录中的文件(需要时使用通配符)?如果不是本机的,是否有插件可以处理此问题?vim在名为grep、lgrep、vimgrep或lvimgrep的命令中有bild可以处理此问题 下面是关于如何使用它们的教程 您还可以像这样执行vim中的find或grep这样的外部命令 :!find ... 你可以用!要运行shell命令,请执行以下操作: :! find . -name *.xml vim作为内置的find命令(:help find),但只打开找到的第一个

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

vim在名为grep、lgrep、vimgrep或lvimgrep的命令中有bild可以处理此问题

下面是关于如何使用它们的教程

您还可以像这样执行vim中的find或grep这样的外部命令

:!find ...

你可以用!要运行shell命令,请执行以下操作:

:! find . -name *.xml

vim作为内置的find命令(:help find),但只打开找到的第一个文件。然而,你可以使用这个惊人的插件:它可以做你想要的一切,甚至更多你可以用
:ex.
浏览文件系统,但我不知道如何递归搜索(我是一个Vim新手-我只使用了十年)

有几种流行的文件浏览器插件:


另请参见。

有一个查找命令。如果将
**
(请参阅
:help starstar
)添加到
的“路径”
,则可以递归搜索:

:set path
将显示当前路径,通过执行以下操作添加
**

:set path+=**
然后你就可以打字了

:find myfile.txt
它神奇地打开了


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

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

:e **/test/Suite.java
将打开test/Suite.java,无论它位于当前目录层次结构的何处。这与制表符完成一起工作,因此您可以在打开文件之前使用[tab]展开通配符。另请参见该选项,了解浏览所有可能扩展的方法

另一个技巧是使用

:r! find . -type f

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

您可以使用此工具在“路径”中递归查找文件。它还支持文件名的制表符填写。

只需键入一些字母,即可快速查找文件。您也可以在新选项卡中打开该文件,但它需要使用ruby支持编译的vim。

我推荐。这是一个非常好的插件,非常适合在大型项目中工作。它具有按文件名或完整路径搜索、regexp搜索、自动检测项目根目录(带有.git | hg | svn | bzr | u darcs文件夹的根目录)、个性化文件名排除等功能

只需按
,它将打开一个非常直观的窗格,您可以在其中搜索所需内容:

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


回复:

类似快速修复的结果浏览

用法:

Find my.regex
结果:

  • 将打开一个新选项卡
  • 每一行都包含一个与
    grep-E
    regex匹配的相对路径
  • 点击:
    • gf
      以在新选项卡中打开当前行上的文件
    • gf
      在当前选项卡上打开文件并丢失文件列表
改为查找所有文件:

Find
替代方法:

  • Gfind my.regex
    :仅搜索Git跟踪的文件(
    Git ls文件
    )。逃犯请求:
  • Gtfind my.regex
    :类似于
    Gfind
    ,但从git顶层而不是当前目录进行搜索
  • 定位某个文件
    定位
    版本
代码:

函数!查找(cmd)
设l:files=system(a:cmd)
如果(l:files=~'^\s*$)
echomsg“没有匹配的文件。”
返回
恩迪夫
选项卡编辑
设置filetype=filelist
设置buftype=nofile
“TODO无法用此打开两个这样的文件列表。那么如何获得一个好的选项卡标签?”?
" http://superuser.com/questions/715928/vim-change-label-for-specific-tab
“文件[文件列表]
put=l:文件
正常ggdd
nnoremap gf
执行“autocmd BufEnter lcd”.getcwd()
端功能
命令!-nargs=1 Find调用Find(“Find.-iname'*'”。shellescape(“”)。“*'”)
命令!-nargs=1 Gfind call Find('git ls files | grep-E'.shellescape(“”))
命令!-nargs=1 Gtfind call Find('git rev parse--show top-level&&git ls files|grep-E'.shellescape('')
命令!-nargs=1定位调用Find('Locate'.shellescape('')

我很惊讶还没有人提到


查找文件(模糊或其他方式)这只是它能为开发者做的事情的冰山一角。它内置了对
ag
git
,以及无数其他程序/实用程序/vim插件的支持。学习曲线可能有点陡峭,但我无法想象没有它我的生活。用户群很大,漏洞会立即修复。

取决于你的情况ion(也就是说,假设以下命令只找到一个文件),可以使用如下命令:

:e `locate SomeUniqueFileName.java`
这将导致Vim在当前选项卡(e命令)中打开一个运行结果文件(在本例中)


请注意,这里的神奇之处在于命令周围的反勾号,它将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>
function!FindFiles()
调用inputsave()
让l:dir=input(“在中查找文件:”,展开(“%:p:h”),“dir”)
调用inputrestore()
如果l:dir!“”
调用inputsave()
让l:file=input(“文件名:”)
调用inputrestore()
让l:nf='find'.l:dir.'-typef-iname'.l:file.'-execgrep-nH-m1'.*“{}\;'
lexpr系统(l:nf)
恩迪夫
端功能
nnoremap fo:callfindfiles()

ag工具和相应的ag vim插件完美地解决了这个问题:

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

AgFile! pattern
它将打开曲
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>
AgFile! pattern
nnoremap <silent> <C-h> :AgFile! '<C-R><C-W>'<CR>
vnoremap <silent> <C-h> y :AgFile! '<C-R>"'<CR>
:args `find . -name '*xml'`