如何在Vim中自动完成文件路径,就像在zsh中一样?

时间:2013-03-23 00:19:06

标签: vim autocomplete zsh

在Zsh中,我可以使用带斜杠的文件名完成来定位源代码树深处的文件。例如,如果我输入:

 vim s/w/t/u/f >TAB<

zsh将模式替换为:

 vim src/wp-contents/themes/us/functions.php

我想要的是能够在Vim命令行以相同的方式定位文件,以便输入

 :vi s/w/t/u/f >TAB<

将自动填充至:

 :vi src/wp-contents/themes/us/functions.php

我试图解析Vim docs for wildmode,但我不知道有什么设置会给我这个。它为单个文件名进行自动完成,但不对文件路径进行自动完成。 Vim原生支持吗?或者我如何自定义文件的自动完成算法?

感谢您的任何建议! -mykle -

2 个答案:

答案 0 :(得分:9)

我找不到一个插件来做这个,所以我写了一个。它被称为vim-zsh-path-completion。虽然通过<C-s>而不是<Tab>,但它可以满足您的需求。您可以将其与<Tab>一起使用,以便更好地控制匹配的内容。

它有bug,但是对于没有空格/特殊字符的基本路径,它应该有效。我认为它在当前状态下有用是有用的。我希望找出错误并清理代码,但我想我现在就开始征求反馈。

感谢您的想法!

原始(错误)答案,但有一些关于Vim野外模式的有用信息。

将以下内容放入.vimrc

set wildmenu
set wildmode=list:longest

这将完成<Tab>上最长的唯一匹配,包括附加/并在适当的位置下降到目录中。如果有多个匹配项,则会显示到目前为止您输入的匹配项列表。然后,您可以再次输入更多字符和<Tab>来完成。

我更喜欢以下设置,该设置完成<Tab>上的第一个唯一匹配,然后再次点击<Tab>时会弹出一个菜单,您可以使用箭头键导航并按Enter键选择:

set wildmode=list:longest,list:full

结帐:help wildmenu:help wildmode。您可能还希望将wildignore设置为完成时要忽略的模式列表。我有我的:

set wildignore=.git,*.swp,*/tmp/*

答案 1 :(得分:6)

默认情况下,Vim没有这样的功能。最接近的内置功能是wildmenu / wildmode组合,但它仍然非常不同。

A quick look at the script section of vim.org没有返回任何东西,但我看起来并不太远:你应该进一步挖掘。也许它就在那里,某处。

您是否尝试过Command-T,LustyExplorer,FuzzyFinder,CtrlP或众多类似插件之一?

我使用CtrlP,可以在文件路径或文件名上进行模糊匹配。在文件路径上完成后,我可以使用下面的密钥序列打开src/wp-contents/themes/us/functions.php(假设functions.phpus下唯一以f开头的文件):

,f " my custom mapping for the :CtrlP command
swtuf<CR>

修改

在考虑可能的解决方案时,我担心我有点近视。我专注于你的确切要求,但是当打开文件时,Vim有很酷的技巧!

:e[dit]命令接受两种类型的通配符:*类似于您在shell中使用的***表示“任何子目录”。

所以完全有可能这样做:

:e s*/w*/t*/u*/f*<Tab>

或类似的东西:

:e **/us/f<Tab>

甚至:

:e **/fun<Tab>

结合Jim的答案中的wildmode设置,我认为你在这里有一个非常强大的文件导航工具。