9

我使用agwith ,如此ctrlp建议:

if executable('ag')
  set grepprg=ag\ --nogroup\ --nocolor
  let g:ctrlp_user_command = 'ag %s -l --nocolor -g ""'
  let g:ctrlp_use_caching = 0
else
  let g:ctrlp_custom_ignore = '\.git$\|\.hg$\|\.svn$'
  let g:ctrlp_user_command = ['.git', 'cd %s && git ls-files . --cached --exclude-standard --others']
endif

如果我从一个项目文件夹中运行 vim,并且其中有一个文件夹,.git这将非常有用。但是,每当我从一个不是 git 项目根目录的目录运行 Vim 时,我都会得到一个空文件列表(没有结果)。为了澄清,使用以下文件夹层次结构:

Proj1/ # ctrlp works; finds foo.js and bar.js (unless they are .gitignored)
  .git/
  bin/
    foo.js
    bar.js

Proj2/ # ctrlp doesn't work; has empty file list
  bin/
    foo.py
    bar.py

当我从同一目录中的命令行运行它时,实际的ag命令 ,工作正常(它会找到所有文件)。ag %s -l --nocolor -g ""

这是我的全部ctrlp配置:

map <c-p> :CtrlP<cr>
map <c-t> :CtrlPTag<cr>
let g:ctrlp_dotfiles            = 1
let g:ctrlp_show_hidden         = 1
let g:ctrlp_cmd                 = 'CtrlPMixed'       " search anything (in files, buffers and MRU files at the same time.)
let g:ctrlp_cmd                 = 'CtrlP'
let g:ctrlp_working_path_mode   = 'ra'               " search for nearest ancestor like .git, .hg, and the directory of the current file
let g:ctrlp_match_window        = 'top,order:ttb'
let g:ctrlp_max_height          = 12                 " maxiumum height of match window
let g:ctrlp_switch_buffer       = 'et'               " jump to a file if it's open already
let g:ctrlp_use_caching         = 1                  " enable caching
let g:ctrlp_clear_cache_on_exit = 0                  " speed up by not removing clearing cache evertime
let g:ctrlp_mruf_max            = 250                " number of recently opened files

if exists('g:ctrlp_user_command')
    unlet g:ctrlp_user_command
end

if exists('g:ctrlp_custom_ignore')
    unlet g:ctrlp_custom_ignore
end

if executable('ag')
  set grepprg=ag\ --nogroup\ --nocolor
  let g:ctrlp_user_command = 'ag %s -l --nocolor -g ""'"
  let g:ctrlp_use_caching = 0
else
  let g:ctrlp_custom_ignore = '\.git$\|\.hg$\|\.svn$'
  let g:ctrlp_user_command = ['.git', 'cd %s && git ls-files . --cached --exclude-standard --others']
endif

let g:ctrlp_prompt_mappings = {
    \ 'AcceptSelection("e")': ['<c-t>'],
    \ 'AcceptSelection("t")': ['<cr>', '<2-LeftMouse>'],
  \ 'ToggleType(1)':        ['<c-u>', '<c-up>'],
  \ 'ToggleType(-1)':       ['<c-y>', '<c-down>'],
  \ 'PrtExit()':            ['<c-l>', '<esc>', '<c-c>', '<c-g>'],
  \ 'PrtSelectMove("j")':   ['<c-n>', '<down>'],
  \ 'PrtSelectMove("k")':   ['<c-p>', '<up>'],
  \ 'PrtHistory(-1)':       ['<c-j>'],
  \ 'PrtHistory(1)':        ['<c-k>'],
  \ }

let g:ctrlp_buftag_types = {
    \ 'coffee'     : '--language-force=coffee --coffee-types=cmfvf'
\ }

我怎样才能ctrlp/ag在 git repo 之外正常工作?

4

2 回答 2

3

佩卡克。CtrlP并且Ag都在做他们应该做的事情。我的主目录中有一个.git文件夹,用于备份点文件和其他一些零碎的东西。.gitignore设置为忽略~/Documents/,除其他外。因此,每当我CtrlP从 的子文件夹运行时~/Documents/,它都找不到文件(因为它位于主目录 git repo 中,但所有文件都被忽略)。这就是为什么CtrlP会出现空白;~/Documents/按预期在工作之外运行它。

但是,我仍然不确定为什么主目录中的repo 不会在 ;的子文件夹中的命令行上.git搞砸。它只发生在 Vim 中。(再次,我已经确认正在使用 command 。)欢迎对此提出任何想法。除了删除我的主目录中的 git repo(可能通过将点文件硬链接到受 git 保护的目录中)之外,我也不确定如何解决这个问题。ag~/Documents/CtrlPCtrlPag %s -l --no-color -g ""~dotfiles

于 2017-04-04T16:52:58.547 回答
0

如果您在具有您发布的设置的 Git 存储库之外,ctrlp 不会找到任何文件。

使用以下设置,git ls-files如果您在 Git 存储库中,ctrlp 使用检索文件列表,否则 ctrlp 使用ag.

let g:ctrlp_user_command = {
    \ 'types': {
      \ 1: ['.git', 'cd %s && git ls-files']
      \ },
    \ 'fallback': 'ag %s -l --nocolor -g ""'
    \ }

查看:h g:ctrlp_user_command更多详细信息。

于 2017-03-24T08:58:25.507 回答