vim find命令:如何列出所有匹配的文件

riv*_*ver 5 vim file find

:vim的find命令只匹配一个文件.如果匹配的文件越多,则会显示"文件名太多"的消息.是否有任何vim命令可以通过使用通配符或正则表达式查找文件,并允许用户在这些匹配的文件之间导航?

rom*_*inl 10

你好像混淆了Vim的命令行完成和:find命令本身.

:find只接受一个单独的文件名(或解析为单个文件名的东西)作为参数,但是允许您完成该单个参数的命令行完成允许您遍历匹配当前模式的所有文件path.

这种混乱使你真正想要的不明显:

  • 你想:find打开编辑与你的模式匹配的每个文件吗?
  • 或者您想要一个可供选择的比赛列表?

前者在设计上是不可能的,但您可以使用:new命令(:help :new):

:new *.foo
Run Code Online (Sandbox Code Playgroud)

当然,后者是可能的.为此,您需要在您的设置中至少设置几个选项~/.vimrc:

set wildmenu
set wildmode=list:full
Run Code Online (Sandbox Code Playgroud)

了解:help wildmode如何自定义wildmenu的行为.这些设置将其他命令的过程中工作::edit,:split,:buffer...

一些建议:

set path+=**
Run Code Online (Sandbox Code Playgroud)

让Vim在工作目录下递归查找文件.

set wildignorecase
Run Code Online (Sandbox Code Playgroud)

告诉Vim忽略完成的情况::find foo将匹配foo.txtFoo.txt.

set wildignore=*.foo,*.bar
Run Code Online (Sandbox Code Playgroud)

在完成时告诉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>
Run Code Online (Sandbox Code Playgroud)

以下是它的外观:

:找