24

我想将 ag (silver searcher) 与 ctrlp 和 vim 一起使用。我的 .vimrc 中有这个:

if executable("ag")
    set grepprg=ag\ --nogroup\ --nocolor
    let g:ctrlp_user_command = 'ag %s -l --nocolor -g ""'
endif

let g:ctrlp_show_hidden = 1

set wildignore+=*/tmp/*,*.so,*.swp,*.zip,*/.tmp/*,*/.sass-cache/*,*/node_modules/*,*.keep,*.DS_Store,*/.git/*

我希望 ctrlp 包含隐藏文件,但这些文件是隐藏的。如果我添加-u到 ag 命令,它会显示所有隐藏文件,但不尊重 wildignore 或 .gitignore。是否有可能让它尊重这些?

4

1 回答 1

40

如果您通过ctrlp_user_command多个选项使用自定义查找器,包括ctrlp_show_hidden ctrlp_custom_ignore和 vim 的wildignore模式,则 CtrlP 不使用(请参阅文档)。

g:ctrlp_show_hidden

...

注意:当使用 |g:ctrlp_user_command| 定义的命令时不适用 正在使用。

g:ctrlp_custom_ignore

...

注意#1:默认情况下,|wildignore| 和 |g:ctrlp_custom_ignore| 仅适用于 |globpath()| 用于扫描文件,因此这些选项在使用 |g:ctrlp_user_command| 定义的命令时不适用 正在使用。

所以你只能任由你的搜索工具摆布,在这种情况下,就是 ag。幸运的是,您可以做几件事来获得您想要的行为。

要显示隐藏的点文件,但仍尊重ignore文件,请使用--hiddenag 选项:

let g:ctrlp_user_command = 'ag %s -l --nocolor --hidden -g ""'

现在要定义要忽略的模式,您可以使用 ag 自己的忽略文件.agignore。这可以是每个目录,也可以是 ag 在每次运行时检查的全局目录。你把它放在你的 home dir~/.agignore中。

我知道让 vimwildignore处理模式会很好,但是当.agignore你在 cli 中使用 ag 时,你会得到这些限制的好处。如果您想搜索所有文件,只需使用ag -u您提到的命令绕过任何ignore文件。

作为最后的花絮,您可以使用字典格式来定义g:ctrlp_user_command其中包含ignore将使 CtrlP 使用wildignore模式的键。但是,我从未尝试过此操作,并且文档指出了潜在的性能损失。如果您不喜欢我提出的其他解决方案,您可以尝试此方法(请参阅文档)。

注意#3:除非 |Dictionary| 使用格式并定义 'ignore' 并将其设置为 1,|wildignore| 和 |g:ctrlp_custom_ignore| 使用这些自定义命令时,选项不适用。当不存在时,'ignore' 默认设置为 0,以保留使用外部命令的性能优势。

于 2013-09-03T20:38:54.553 回答