【问题标题】:vim find command: how to list all matched filesvim find 命令:如何列出所有匹配的文件
【发布时间】:2014-07-21 12:10:45
【问题描述】:

vim 的 :find 命令只匹配一个文件。如果有更多文件匹配,它会给出消息“文件名太多”。 vim 有没有可以通过通配符或正则表达式查找文件,并允许用户在匹配的文件之间导航的命令?

【问题讨论】:

  • 内部命令更好,而不是插件。
  • 您可以使用globpath() 函数获取文件列表。列出当前工作目录中的所有 python 文件::echo globpath(".", "*.py") 然后您可以显示该列表并让用户更具体,或者如果您喜欢,让他们选择一个数字来选择哪个文件。另一件要研究的是browse confirm e,它是一个文件浏览器;不太熟悉它,但可能在它附近的某个地方有类似您所追求的东西。
  • 有什么方便简单的命令吗?
  • 我不知道;这不是我个人想要在 vim 中做的那种事情。你可以用 vimscript 写一些东西,但这对我来说更像是 shell 的工作。我会编写一个外部脚本或程序来执行此操作,然后如果我想要类似的东西从 vim 调用它。
  • 好吧,我只是用谷歌搜索了它。尝试输入:e e 和一个空格),然后按 control+d。它将列出当前目录中的所有文件。然后输入一个 shell glob(例如*.py)。它将列出所有.py 文件。输入一个完整的文件名,它会打开它。

标签: file vim find


【解决方案1】:

您似乎混淆了 Vim 的命令行补全和 :find 命令本身。

:find 仅接受一个文件名(或解析为单个文件名的文件名)作为参数,但让您完成该单个参数的命令行完成允许您通过 all 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>

这是它的外观:

【讨论】:

  • 如果不清楚...使用建议的 'wildmode' 和 'wildmenu' 设置,您现在可以点击 &lt;Tab&gt; 而不是 &lt;Enter&gt; 循环浏览所有列表匹配不完整的:find 命令。
【解决方案2】:

我使用以下自定义命令查找 *.g 文件中的所有待办事项,并在快速修复窗口中列出它们。然后我可以通过在 quickfix 窗口中按 Enter 来跳转。

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

【讨论】:

    【解决方案3】:

    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 以获取最后一个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-09
      • 2021-07-18
      • 2014-12-26
      • 2013-09-22
      • 2020-05-06
      • 2015-03-29
      • 1970-01-01
      • 2010-09-09
      相关资源
      最近更新 更多