我可以让Vim Ctrlp插件忽略一个项目中的特定文件夹吗?


17

Vim的Ctrlp插件有办法全球忽略某些文件夹名称。例如:

let g:ctrlp_custom_ignore = '\v[\/]\.(git|hg|svn)$'

但是,我有一个特定于一个项目的忽略规则。我想要更像.gitignore文件的东西。

有没有办法在不修改我的全局配置的情况下忽略特定项目中的特定文件夹?


您是否尝试了插件的问题跟踪器?
romainl 2013年

Answers:


20

使用自定义列表命令

Ctrlp可让您告诉它使用什么命令来获取文件夹中的文件列表。因此,如果您要排除任何名为的内容beets.txt,则可以执行以下操作:

let g:ctrlp_user_command = 'find %s -type f | grep -v "beets.txt"'

这是全局的,但它开始指向答案:提供您自己的shell命令。

更好的是,Ctrlp允许您提供带有标记的多个Shell命令,这意味着“如果您在根目录中看到此标记,请使用此命令”。

我在中找到了这一点:help ctrlp,并根据作者对某个问题的评论进行了稍微修改。

let g:ctrlp_user_command = {
  \ 'types': {
    \ 1: ['.git', 'cd %s && git ls-files --cached --exclude-standard --others'],
    \ 2: ['.hg', 'hg --cwd %s locate -I .'],
    \ },
  \ 'fallback': 'find %s -type f'
  \ }

这意味着:“如果.git在文件夹中看到,请使用git ls-files...。否则,如果看到.hg,请使用hg --cwd...,否则请使用常规find。”

因此,要忽略一个项目中的特定文件夹,请设计一个将忽略该文件夹的命令,然后在该项目中放置一个唯一标记,以使Ctrlp可以在此处使用特殊命令

(就我而言,我实际上是想忽略中的文件.gitignore,因此git ls-files上面的命令对我有用。)


太好了,非常感谢您的回答。
丹尼斯

git -C%s ls文件--cached --exclude-standard-其他人应该为git工作。
Arunprasad Rajkumar

11

如果您将Silver Searcher后端用于CtrlP(速度要快得多),只需将.agignore文件添加到项目目录中,格式与相同.gitignore

.git/
.hg/
.svn/

或者,保留一个全局~/.agignore文件。

将Silver Searcher作为后端添加到您的 .vimrc

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

1
感谢您发布此信息。要添加另一个数据点:我对此进行了修改 if executable("ag") let g:ctrlp_user_command = 'ag %s -l --nocolor --depth 8 -g ""' endif 。如果在编辑主文件夹中的文件时意外打到ctrl-p,则深度限制很有用。我发现隐藏的标志将包括文件中的.git /
埃里克·胡锦涛

6

指定文件中有意取消跟踪的文件

为了使用类似文件.gitignore(基于Nathan grep解决方案)解决此问题,我创建了一个名为的文件,.ctrlpignore并放置了应忽略的模式,以行分隔:

node_modules/
\.log$
...

而我的ctrlp配置:

let g:ctrlp_user_command = 'find %s -type f | grep -v "`cat .ctrlpignore`"'

也许它.gitignore本身可以用于忽略ctrlp中的文件,而无需创建新文件即可执行几乎相同的操作。


我添加了此代码段,但它破坏了总体ctrlp行为,如果我键入orderscontroller,它将仅找到_spec文件,而找不到实际的orders_controller.rb文件。
jedi

1

正如Wagner Andrade所说,单独使用.ctrlpignore将是一个好主意。

更健壮和方便的vim设置如下所示:

let g:ctrlp_user_command = 'cd %s;
  \ commonfilter="\.(jpg|bmp|png|jar|7z|zip|tar|gz|tgz|bz)$";
  \ if [ ! -r ".ctrlpignore" ]; then
  \   find . -type f | grep -Evi "$commonfilter";
  \ else
  \   find . -type f | grep -vF "$(cat .ctrlpignore)" | grep -Evi "$commonfilter";
  \ fi'

.ctrlpignore可以放在ctrlp可以识别为根目录的任何目录中。这是一个示例,每一行都以./

vim ~/.ctrlpignore

./Desktop
./R
./.vim
./.local/lib
.....

注意:

  1. grep -F将解释模式,例如。'./.tmp',作为固定字符串,如果您不希望滤除'./ptmp'。仍然存在一些琐碎的错误:'./.tmp'也会过滤掉'./.tmp2'。算了,我不喜欢\.

  2. g:ctrlp_custom_ignore如果g:ctrlp_user_command设置,将被忽略。这些可以更复杂地完成g:ctrlp_user_command

  3. 也可以用白名单代替黑名单。如果在单独的脚本中实现,则更加方便

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.