在Vim的Ctrlp插件有办法全球忽略某些文件夹名称。例如:
let g:ctrlp_custom_ignore = '\v[\/]\.(git|hg|svn)$'
但是,我有一个特定于一个项目的忽略规则。我想要更像.gitignore
文件的东西。
有没有办法在不修改我的全局配置的情况下忽略特定项目中的特定文件夹?
在Vim的Ctrlp插件有办法全球忽略某些文件夹名称。例如:
let g:ctrlp_custom_ignore = '\v[\/]\.(git|hg|svn)$'
但是,我有一个特定于一个项目的忽略规则。我想要更像.gitignore
文件的东西。
有没有办法在不修改我的全局配置的情况下忽略特定项目中的特定文件夹?
Answers:
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
上面的命令对我有用。)
如果您将Silver Searcher后端用于CtrlP(速度要快得多),只需将.agignore
文件添加到项目目录中,格式与相同.gitignore
:
.git/
.hg/
.svn/
或者,保留一个全局~/.agignore
文件。
将Silver Searcher作为后端添加到您的 .vimrc
let g:ctrlp_user_command = 'ag %s -l --nocolor --hidden -g ""'
if executable("ag") let g:ctrlp_user_command = 'ag %s -l --nocolor --depth 8 -g ""' endif
。如果在编辑主文件夹中的文件时意外打到ctrl-p,则深度限制很有用。我发现隐藏的标志将包括文件中的.git /
为了使用类似文件.gitignore
(基于Nathan grep解决方案)解决此问题,我创建了一个名为的文件,.ctrlpignore
并放置了应忽略的模式,以行分隔:
node_modules/
\.log$
...
而我的ctrlp配置:
let g:ctrlp_user_command = 'find %s -type f | grep -v "`cat .ctrlpignore`"'
也许它.gitignore
本身可以用于忽略ctrlp中的文件,而无需创建新文件即可执行几乎相同的操作。
正如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
.....
注意:
grep -F
将解释模式,例如。'./.tmp',作为固定字符串,如果您不希望滤除'./ptmp'。仍然存在一些琐碎的错误:'./.tmp'也会过滤掉'./.tmp2'。算了,我不喜欢\.
g:ctrlp_custom_ignore
如果g:ctrlp_user_command
设置,将被忽略。这些可以更复杂地完成g:ctrlp_user_command
也可以用白名单代替黑名单。如果在单独的脚本中实现,则更加方便