使用模糊搜索在Vim中打开文件

64

我想找到一种方法让Vim能够通过模糊搜索文件名的方式来打开文件。

基本上,我想定义一个项目,并有一个快捷键,让我能够输入一个文件名,在输入时它会匹配所有相关字母。

大多数编辑器都具备这样的功能,但我却不知道如何在Vim中实现。

请注意,我寻找的是一种不需要我知道文件在目录树中位置的解决方案。我只需要通过文件名来打开它,而不用管它在哪个目录下。

谢谢

4个回答

73

有两个极好的vim插件可以做到这一点。

ctrlp:

  • 纯VimL编写
  • 几乎在任何地方都能运行
  • 支持自定义查找器以提高性能
  • Vim中最受欢迎的模糊搜索插件

Command-T:

  • 使用C、VimL和Ruby编写
  • 开箱即用快速
  • 需要Vim支持+ruby
  • 建议使用Vim版本 >= 7.3

编辑:

我使用CtrlP作为我的自定义查找器,搭配ag使用,速度非常快(即使对于大型项目),而且非常便携。

使用agCtrlP的示例:

if executable('ag')
  " Use Ag over Grep
  set grepprg=ag\ --nogroup\ --nocolor

  " Use ag in CtrlP for listing files. Lightning fast and respects .gitignore
  let g:ctrlp_user_command = 'ag %s -l --nocolor -g ""'
endif

3
自从发布这个问题后,我转而使用ctrlp,和许多其他的Vim用户一样。我现在认为它是事实上的文件切换插件(Command-t紧随其后)。 - Edan Maor
3
使用自定义搜索命令(如ack或更好的ag(the silver searcher))与ctrlp一起使用,这将比使用命令行中的cfind命令快得多。即使启用了“cfind”命令,也是如此。就我的经验而言,使用watchman的速度有点慢。 - Jan Weitz
@hasen 使用 ag 比默认的 grep 更快。这只是在搜索文件时调用 ag 而不是调用 grep。 - Chris Knadler

4

Vim的CommandT功能与TextMate相似。我的工作流程如下:

1)打开MacVim

2):cd ~/my_project

3)(我已按照安装帮助中所述进行了映射)

4)使用C-v在垂直分割中打开文件,或者使用CR打开新的水平分割。

5)要关闭分割,请使用:bd(缓冲区删除)

6)要切换到另一个缓冲区,我安装了BufferExplorer,只需使用\be并选择即可。

这个工作流程与TextMate相似,需要一段时间来适应,我仍在学习中。


这太棒了。有没有像这样的插件,不需要Ruby和编译?经常使用Windows,那将是太神奇了。 - Andriy Drozdyuk

3

基本解决方案

只需将以下内容添加到您的 .vimrc 文件中即可:

nnoremap <C-p> :find ./**/*

现在按下Ctrl + p将允许您模糊查找当前工作目录及其子目录中的文件。使用Tab键循环浏览选项。

相关解决方案

对于那些想保持基本设置即无插件的人,这个有趣的视频展示了另一种在vim中实现模糊文件查找的方法。

他们实际上使用的是

set path+=**
set wildmenu

在他们的 .vimrc 文件中,可以使用以下命令在当前子目录中查找文件。

例如,通过执行命令 :find *Murph 并按下 Tab 键,可以找到子目录 code 中的文件 KilianMurphy2012Why.RKilianMurphy2014ROLE.R。我们可以使用 Tab 键在它们之间进行切换。第一种解决方案的优点是它还会显示相对路径。

请注意,您的当前工作目录很重要,并且您路径上的其他文件(:set path?)也会被此类型的解决方案找到。选项 wildmenu 可以添加可视化信息,但不是必需的。

如果想要添加一个键盘快捷键,请

nnoremap <C-p> :find *

将以下代码添加到您的 .vimrc 文件中。现在,您将能够在正常模式下通过 Ctrl+p 快速搜索项目/当前目录中的文件。
```vim set path+=** nnoremap :find * ```

2

我看了一下,但似乎它没有做我想要的事情(它似乎没有搜索目录中的所有文件)。难道我只是设置不正确吗? - Edan Maor
1
你可能是。通常情况下,目录中的所有文件及其子目录中的所有文件都会被包含在内。 - Ton van den Heuvel
另外:https://dev59.com/qXI-5IYBdhLWcg3wW3Cp#1897075 - Ton van den Heuvel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接