Как настроить ctrlp для корректной работы с ag вне git-репо?

Я использую ag с 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 папка внутри него. Тем не менее, я получаю пустой список файлов (без результатов) всякий раз, когда запускаю Vim из каталога, который не является корнем git-проекта. Чтобы уточнить, с помощью следующей иерархии папок:

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 репо?

2 ответа

Решение

PEBCAK. CtrlP а также Ag оба делают то, что они должны. у меня есть .git папка в моем домашнем каталоге, для резервного копирования файлов точек и несколько других шансов и завершений. .gitignore настроен на игнорирование ~/Documents/кроме всего прочего. Поэтому в любое время я бегу CtrlP из подпапки ~/Documents/он не находит файлов (так как он находится в домашнем каталоге git repo, но все файлы игнорируются). Вот почему CtrlP становится пустым; запустить его за пределами ~/Documents/ работает как положено.

Тем не менее, я до сих пор не уверен, почему .git репо в домашнем каталоге не облажается ag в командной строке внутри подпапки ~/Documents/; это происходит только в Vim с CtrlP, (Опять же, я подтвердил, что CtrlP использует команду ag %s -l --no-color -g ""Любые мысли по этому поводу приветствуются. Я также не уверен, как решить эту проблему, за исключением удаления репозитория git в моем домашнем каталоге (возможно, путем жесткой ссылки на файлы точек в ~ в мерзавца защищен dotfiles каталог).

Ctrlp не находит никаких файлов, если вы находитесь за пределами Git-репозитория с настройками, которые вы опубликовали.

При следующей настройке ctrlp использует git ls-files чтобы получить список файлов, если вы находитесь в репозитории Git, в противном случае 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 Более подробная информация.

Другие вопросы по тегам