vim的find命令只匹配一个文件。如果匹配的文件越多,它就会显示消息"文件名太多" 。 是否有任何vim命令可以通过使用通配符或正则表达式查找文件,并允许用户在这些匹配的文件之间导航?
答案 0 :(得分:8)
你好像混淆了Vim的命令行完成和:find
命令本身。
:find
只接受一个单独的文件名(或解析为单个文件名的内容)作为参数,但是命令行完成允许您完成该单个参数,允许您通过 all path
中符合当前模式的文件。
这种混乱使得你真正想要的东西不明显:
:find
打开以编辑与您的模式匹配的每个文件?前者在设计上是不可能的,但您可以使用:new
命令(:help :new
):
:new *.foo
当然,后者是可能的。为此,您需要在~/.vimrc
中至少设置几个选项:
set wildmenu
set wildmode=list:full
有关如何自定义wildmenu的行为,请参阅:help wildmode
。这些设置当然适用于其他命令::edit
,:split
,:buffer
......
一些建议:
set path+=**
让Vim在工作目录下递归查找文件。
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>
以下是它的外观:
答案 1 :(得分:1)
我使用以下自定义命令查找* .g文件中的所有待办事项,并将它们列在quickfix窗口中。然后我可以通过在quickfix窗口中按 Enter 跳转到它们之间。
command! Td noautocmd vimgrep /TODO\|FIXME/j *.g | cw
答案 2 :(得分:1)
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键即可获取最后一个。