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

Nat*_*ong 17 vim

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

let g:ctrlp_custom_ignore = '\v[\/]\.(git|hg|svn)$'
Run Code Online (Sandbox Code Playgroud)

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

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

Nat*_*ong 20

使用自定义列表命令

Ctrlp 可让您告诉它使用什么命令来获取文件夹中的文件列表。所以如果你想排除任何命名的东西beets.txt,你可以这样做:

let g:ctrlp_user_command = 'find %s -type f | grep -v "beets.txt"'
Run Code Online (Sandbox Code Playgroud)

这是全局的,但它开始指向答案:提供您自己的 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'
  \ }
Run Code Online (Sandbox Code Playgroud)

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

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

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


ada*_*rsh 11

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

.git/
.hg/
.svn/
Run Code Online (Sandbox Code Playgroud)

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

添加 Silver Searcher 作为后端,在您的 .vimrc

let g:ctrlp_user_command = 'ag %s -l --nocolor --hidden -g ""'
Run Code Online (Sandbox Code Playgroud)


19W*_*S85 6

指定文件中有意未跟踪的文件

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

node_modules/
\.log$
...
Run Code Online (Sandbox Code Playgroud)

还有我的 ctrlp 配置:

let g:ctrlp_user_command = 'find %s -type f | grep -v "`cat .ctrlpignore`"'
Run Code Online (Sandbox Code Playgroud)

也许它.gitignore本身可以用来忽略 ctrlp 中的文件,而不需要创建一个新文件来做几乎相同的事情。