Vim的:find命令只能匹配一个文件。如果匹配到多个文件,它会给出"Too many file names"的提示。
是否有Vim的命令可以使用通配符或正则表达式来查找文件,并允许用户在匹配的文件之间进行导航?
您似乎将Vim的命令行补全和:find
命令本身混淆了。
:find
只接受一个单一的文件名(或解析为单一文件名的内容)作为参数,但是允许您完成单个参数的命令行补全会遍历匹配当前模式的path
中的所有文件。
这种混淆使您实际想要的内容不明显:
:find
打开正在匹配您模式的每个文件进行编辑?前者由于设计原因是不可能的,但是您可以使用:new
命令(:help :new
):
:new *.foo
当然,后者是可能的。为此,您需要在~/.vimrc
中设置至少几个选项:
set wildmenu
set wildmode=list:full
参见 :help wildmode
以了解如何自定义wildmenu的行为。当然,这些设置也适用于其他命令::edit
、:split
、:buffer
等等…
几个建议:
set path+=**
让Vim在path
中的其他目录下递归查找文件。请注意,**
非常贪婪,这意味着Vim将真正地在这些目录下到处寻找,这可能会非常昂贵和缓慢(考虑 node_modules
)。与Vim中的许多事物一样,path
值应具有上下文依赖性。
set wildignorecase
告诉Vim在自动完成时忽略大小写::find foo
将匹配foo.txt
和Foo.txt
。
set wildignore=*.foo,*.bar
告诉 Vim 在进行补全时忽略那些文件(可以是目录)。
最后,这里有一堆映射,让我在 Vim 中的生活如此轻松:
" regex completion instead of whole word completion
nnoremap <leader>f :find *
" restrict the matching to files under the directory
" of the current file, recursively
nnoremap <leader>F :find <C-R>=expand('%:p:h').'/**/*'<CR>
" same as the two above but opens the file in an horizontal window
nnoremap <leader>s :sfind *
nnoremap <leader>S :sfind <C-R>=expand('%:p:h').'/**/*'<CR>
" same as the two above but with a vertical window
nnoremap <leader>v :vert sfind *
nnoremap <leader>V :vert sfind <C-R>=expand('%:p:h').'/**/*'<CR>
这是它的外观:
<Tab>
键而不是 <Enter>
键即可循环浏览所有匹配项列表,以完成对 :find
命令的搜索。 - Benfindfile
函数可以返回一个列表,因此只需要在自定义命令中调用该函数即可。以下是一个快速的一行代码,它将显示从路径中获取的结果列表,并提示您选择其中一个("FF" == 查找文件):command! -nargs=1 FF let i=1|let mm=findfile(<q-args>, '', -1)|for f in mm| echo i.':'.f|let i+=1 |endfor|let choice=input('FF: ')|exec 'e ' . mm[choice-1]
例子:
:FF socket.h
1:/usr/include/bits/socket.h
2:/usr/include/asm/socket.h
3:/usr/include/asm-generic/socket.h
4:/usr/include/linux/socket.h
5:/usr/include/sys/socket.h
FF:
输入您想要的数字,然后按回车键。或者只需按回车键即可获取最后一个。
command! Td noautocmd vimgrep /TODO\|FIXME/j *.g | cw
globpath()
函数获取文件列表。要列出当前工作目录中的所有Python文件::echo globpath(".", "*.py")
,然后您可以显示该列表并让用户更具体地选择,或者如果您想要更高级一些,可以让他们选择一个数字来选择哪个文件。另一个要查看的东西是browse confirm e
,它是一个文件浏览器;我对它不太熟悉,但可能有类似于您需要的东西。 - scott_fakename:e
(e
和一个空格),然后按下控制键和字母d
。它会列出当前目录中的所有文件。然后输入一个 shell 通配符(例如*.py
),它会列出所有.py
文件。输入整个文件名,它就会打开它。 - scott_fakename