问题描述
我正在尝试使用来自 this video 的提示自定义我的 vimrc。我将这两行添加到我的 vimrc 中:
set path+=**
set wildmenu
...启用模糊文件搜索。但是,当我尝试点击选项卡以显示结果时,出现了一些问题:
- 如果我尝试
:find *foo
(或:find *.foo
w/.foo
文件类型),当我点击 Tab 并且一切都冻结后,命令行将卡住为:find *foo ...
。 - 如果我执行
:find fo
并按 Tab 键尝试自动补全文件名,命令行也会同样卡住。 - 唯一不冻结的情况是,如果我在与 vimrc 相同的目录中打开 vim(对我来说它是 ~/vimfiles),这里的匹配项将显示在 Wildmenu 中,但如果我向上打开任何文件在我的 vimfiles 目录中,它会显示混乱的字符。
- 如果我向下搜索具有确切名称
:find foo.foo
的文件,搜索确实有效,那么foo.foo
将正确打开。但我无法以同样的方式向上搜索。
知道我能做什么/应该知道什么吗?如果相关,我在 Windows 上。谢谢。
编辑:经过更多测试后,我发现了以下内容:
- 当我从 vimfiles 执行
:find *foo
时,它实际上并没有产生所有可能的模糊结果 - 在一个非常小的目录中进行测试,模糊搜索实际上确实有效,我意识到在较大的目录中它也可以工作,但最多需要 30 分钟 ~ 1 小时,具体取决于关于目录大小。
那么对于较大的目录是否不使用它?
此外,有没有办法在冻结的情况下中断/中断命令的执行?
解决方法
...启用模糊文件搜索
那不是“模糊搜索”。
.foo
文件类型
.foo
是扩展名,而不是“文件类型”。
那么对于较大的目录是否不使用它?
是的。 set path+=**
表示当你要求 Vim 执行 :find *foo
时,它会在工作目录下的每个目录中搜索名称中带有 foo
的文件,这会比树慢变大。请注意,这里有两个瓶颈,它们合谋减慢了速度:
- Vim 用于搜索文件的搜索算法被描述为“深度优先”。这意味着(大致)在切换到下一个目录之前必须完全探索一个目录,如果您有一些非常深的目录,这可能会花费大量时间。
- 构建“wildmenu”的效率不高,而且在非常大的列表中会很困难。
您有几种方法可以改进:
- 将您的
:help 'path'
设置为不包含**
的合理值。该选项是白名单,而不是垃圾箱。 - 使用更智能的查询。
- 设置合理的
:help 'wildignore'
以减轻野生菜单的工作量。
请参阅 this gist 以详细了解情况。
此外,有没有办法在冻结的情况下中断/中断命令的执行?
是的,参见:help <C-c>
。