Как настроить 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
Более подробная информация.