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

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

Vim Ctrlp 插件有一种方法可以全局忽略某些文件夹名称。例如:

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

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

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

答案1

使用自定义列表命令

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上述命令对我有用。)

答案2

如果您使用的是 CtrlP 的 Silver Searcher 后端(速度更快),只需将.agignore文件以与以下格式添加到您的项目目录中.gitignore

.git/
.hg/
.svn/

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

将 Silver Searcher 添加为后端.vimrc

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

答案3

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

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

node_modules/
\.log$
...

我的 ctrlp 配置:

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

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

答案4

使用ag,我能够设置如下系统:

    let g:ctrlp_user_command = '
      \ filter="jpg|bmp|png|jar|7z|zip|tar|gz|tgz|bz";
      \ if [ -f "bsconfig.json" ]; then
      \   subfilter="lib"
      \   filter="$filter|$subfilter"
      \ fi;
      \ if [ -f "Cargo.toml" ]; then
      \   subfilter="target"
      \   filter="$filter|$subfilter"
      \ fi;
      \ if [ -f "elm.json" ]; then
      \   subfilter="elm-stuff"
      \   filter="$filter|$subfilter"
      \ fi;
      \ if [ -f "package.json" ]; then
      \   subfilter="node_modules|*.min.js"
      \   filter="$filter|$subfilter"
      \ fi;
      \ ag %s -l --nocolor -g "" --ignore "\.($filter)$"
      \ '

它允许您根据启动 vim 的目录中的文件标记要忽略的某些文件。例如,在带有 的 JS 项目中package.json,我们希望忽略node_modules*.min.js,等等。这对我来说很有效,因为我不想.agignore在每个 JS 项目中重复相同的操作,并且我希望支持处理多种模式,例如同一目录中的 Elm 和 JS 项目。

相关内容