繁体   English   中英

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

[英]vim find command: how to list all matched files

:vim的find命令只匹配一个文件。 如果匹配的文件越多,则会显示“文件名太多”的消息。 是否有任何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在工作目录下递归查找文件。

set wildignorecase

告诉Vim忽略完成的情况:find foo将匹配foo.txtFoo.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>

以下是它的外观:

:找

我使用以下自定义命令查找* .g文件中的所有待办事项,并将它们列在quickfix窗口中。 然后我可以在quickfix窗口中按Enter键跳转到它们之间。

command! Td noautocmd vimgrep /TODO\|FIXME/j *.g | cw

findfile函数可以返回一个列表,因此只需在自定义命令中调用它即可。

这是一个快速的单行程序,它将显示路径的结果列表,并提示您想要哪一个(“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: 

输入所需的编号,然后按ENTER键。 或者只需按ENTER键即可获得最后一个。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM