diff --git a/autoload/ctrlp.vim b/autoload/ctrlp.vim index 740f297..57f8232 100644 --- a/autoload/ctrlp.vim +++ b/autoload/ctrlp.vim @@ -92,7 +92,7 @@ endfunc "}}} " * ListAllFiles {{{ -func! s:List(dirs, allfiles, depth) +func! s:GlobPath(dirs, allfiles, depth) " Note: wildignore is ignored when using ** let glob = s:dotfiles ? '.*\|*' : '*' let entries = split(globpath(a:dirs, glob), '\n') @@ -107,28 +107,36 @@ func! s:List(dirs, allfiles, depth) else let dirs = join(alldirs, ',') sil! cal s:progress(len(g:ctrlp_allfiles)) - cal s:List(dirs, g:ctrlp_allfiles, depth) + cal s:GlobPath(dirs, g:ctrlp_allfiles, depth) + endif +endfunc + +func! s:UserCommand(path, lscmd) + if exists('+ssl') && &ssl + let ssl = &ssl + let &ssl = 0 + endif + let g:ctrlp_allfiles = split(system(printf(a:lscmd, shellescape(a:path))), '\n') + if exists('+ssl') && exists('ssl') + let &ssl = ssl + cal map(g:ctrlp_allfiles, 'substitute(v:val, "\\", "/", "g")') + endif + if exists('s:vcscmd') && s:vcscmd + cal map(g:ctrlp_allfiles, 'substitute(v:val, "/", "\\", "g")') endif endfunc func! s:ListAllFiles(path) let cache_file = ctrlp#utils#cachefile() if g:ctrlp_newcache || !filereadable(cache_file) || !s:caching + let lscmd = s:lscommand() " Get the list of files - if empty(g:ctrlp_user_command) - cal s:List(a:path, [], 0) + if empty(lscmd) + cal s:GlobPath(a:path, [], 0) else sil! cal s:progress(escape('Waiting...', ' ')) try - if exists('+ssl') && &ssl - let ssl = &ssl - let &ssl = 0 - endif - let g:ctrlp_allfiles = split(system(printf(g:ctrlp_user_command, shellescape(a:path))), '\n') - if exists('+ssl') && exists('ssl') - let &ssl = ssl - cal map(g:ctrlp_allfiles, 'substitute(v:val, "\\", "/", "g")') - endif + cal s:UserCommand(a:path, lscmd) catch retu [] endtry @@ -792,13 +800,19 @@ endfunc "}}} " * SetWorkingPath {{{ -func! s:FindRoot(curr, mark, depth) +func! s:FindRoot(curr, mark, depth, ...) let depth = a:depth + 1 if !empty(globpath(a:curr, a:mark)) || depth > s:maxdepth - sil! exe 'chd!' a:curr + if exists('a:1') && !empty(a:1) + let s:vcsroot = depth <= s:maxdepth ? a:curr : '' + else + sil! exe 'chd!' a:curr + endif else let parent = substitute(a:curr, '[\/]\zs[^\/]\+[\/]\?$', '', '') - if parent != a:curr | cal s:FindRoot(parent, a:mark, depth) | endif + if parent != a:curr + cal s:FindRoot(parent, a:mark, depth, a:1) + endif endif endfunc @@ -1269,6 +1283,25 @@ func! s:insertcache(str) cal ctrlp#utils#writecache(data) endif endfunc + +func! s:lscommand() + let usercmd = g:ctrlp_user_command + if type(usercmd) == 1 + retu usercmd + elseif type(usercmd) == 3 && len(usercmd) >= 2 + \ && !empty(usercmd[0]) && !empty(usercmd[1]) + let rmarker = usercmd[0] + " Find a repo root if existed + cal s:FindRoot(getcwd(), rmarker, 0, 1) + if !exists('s:vcsroot') || ( exists('s:vcsroot') && empty(s:vcsroot) ) + " Try the secondary_command if defined + retu len(usercmd) == 3 && !empty(usercmd[2]) ? usercmd[2] : '' + else + let s:vcscmd = s:lash == '\' ? 1 : 0 + retu usercmd[1] + endif + endif +endfunc "}}} "}}} diff --git a/doc/ctrlp.txt b/doc/ctrlp.txt index 79e5b8b..54455e9 100644 --- a/doc/ctrlp.txt +++ b/doc/ctrlp.txt @@ -221,17 +221,20 @@ Use %s in place of the target directory: > Examples: > let g:ctrlp_user_command = 'find %s -type f' " MacOSX/Linux let g:ctrlp_user_command = 'dir %s /-n /b /s /a-d' " Windows - - " Use version control commands. Remember to set |g:ctrlp_working_path_mode| - " to 2 and |g:ctrlp_root_markers| to ['.git/'] or ['.hg/'] - let g:ctrlp_user_command = 'cd %s && git ls-files' - let g:ctrlp_user_command = 'hg --cwd %s locate -I .' < You can also use 'grep', 'findstr' or something else to filter the results. Examples: > let g:ctrlp_user_command = 'find %s -type f | grep (?!tmp/.*)' let g:ctrlp_user_command = 'dir %s /-n /b /s /a-d | findstr .*\.py$' < +Use version control listing commands: > + let g:ctrlp_user_command = [marker, command, secondary_command] +< +If the secondary_command is empty or not defined, globpath() will be used. +Examples: > + let g:ctrlp_user_command = ['.git/', 'cd %s && git ls-files'] + let g:ctrlp_user_command = ['.hg/', 'hg --cwd %s locate --fullpath -I .'] +< *'g:ctrlp_open_new_file'* Use this option to specify how the newly created file is to be opened when