2011-07-23 17 views
6

我正在寻找一个如何在vim脚本中使用findfile函数来递归搜索文件,特别是使用通配符的示例。Vim findfile函数的用法?

每当我包含通配符作为第一个函数参数的一部分时,这似乎不起作用。

例如,下面的目录结构:

~/MyProject/ 
    Test.sln 
    src/ 
     Test.cs 

如果我运行下面的功能,同时编辑同PWD集的文件test.cs中到〜/ MyProject的/ src目录

function! Test() 
    let a = findfile("*.sln", ".;") 
    echo a 
endfunction 

findfile似乎不会返回任何内容。但是,如果我修改函数删除widcard如下:

function! Test() 
    let a = findfile("Test.sln", ".;") 
    echo a 
endfunction 

它做什么,我所期望的。

我已经在ubuntu和windows上测试过了,我在两者上看到了相同的行为。我在这里做错了什么,或者findfile不支持通配符?缺乏对通配符的支持似乎是一个相当奇怪的遗漏。看来我在这里一定是做错了事。

+0

:帮助文件搜索使我认为它试图支持globbing,但这在实践中似乎是错误的。这是vim中的一个bug吗? –

+0

从'vim' [documentation](http://vimdoc.sourceforge.net/htmldoc/editing.html#file-searching):*'\ *'的用法很简单:**它匹配0个或更多字符**。在搜索模式中,这将是“。\ *”。请注意,“。”不用于文件搜索* –

回答

5

如果您使用通配符我觉得​​3210和/或globpath()功能是你在找什么。见:h glob():h globpath()

+0

我认为你是正确的,它看起来像findfile不支持通配符,glob是我正在寻找。我采取了这种方法,并编写了一个循环遍历父目录,直到找到所需的东西。这就是我需要的,谢谢! – actf

+2

@actf您是否愿意发布您的最终解决方案?谢谢! – Thomas

0

一种方式与外部(快)做find

function! Test() 
    let l:list=system("find .. -maxdepth 1 -name \*.sln") 
    echo l:list 
endfunction 
+0

我很欣赏答案,但我认为这只适用于* .sln文件位于父目录中的情况。我专门寻找一种解决方案,它将缓存目录结构,直到找到一个匹配的文件(这是我认为findfile的行为方式)。例如,如果我正在编辑目录〜/ MyProject/src/innersrc中的一个文件,我不认为这个解决方案会起作用。 – actf

+0

@actf我看到了,你认为循环发现有什么,'''然后是'../ ..',直到你找到它。或者例如试验'expand('%:p:h')'可以得到当前文件的完整路径。 –

+0

是的,我认为这是最好的方法。它看起来像获得工作目录,然后循环通过父目录和通过glob()通配符搜索做我所需要的。 – actf