From 64dca5ec7961cbd4a5a7da460890e70ae8716db4 Mon Sep 17 00:00:00 2001 From: Kien N Date: Sun, 18 Dec 2011 09:58:44 +0700 Subject: [PATCH] Custom ignore and default command options * Extend jump-to-open-buffer to use when jump_to_buffer = 2. Only works for buffers opened in another tab. Suggested by @hail2u. * Add g:ctrlp_default_cmd, option to reuse the default mapping for a different command. Close #57. * Add g:ctrlp_custom_ignore. Close #58. --- autoload/ctrlp.vim | 198 ++++++++++++++++++++++------------------- autoload/ctrlp/dir.vim | 12 ++- doc/ctrlp.txt | 38 +++++--- plugin/ctrlp.vim | 7 +- 4 files changed, 146 insertions(+), 109 deletions(-) diff --git a/autoload/ctrlp.vim b/autoload/ctrlp.vim index 7f2aa3f5..8d5f7831 100644 --- a/autoload/ctrlp.vim +++ b/autoload/ctrlp.vim @@ -11,13 +11,14 @@ fu! s:opts() let opts = { \ 'g:ctrlp_by_filename': ['s:byfname', 0], \ 'g:ctrlp_clear_cache_on_exit': ['s:clrex', 1], + \ 'g:ctrlp_custom_ignore': ['s:usrign', ''], \ 'g:ctrlp_dont_split': ['s:nosplit', ''], \ 'g:ctrlp_dotfiles': ['s:dotfiles', 1], \ 'g:ctrlp_extensions': ['s:extensions', []], \ 'g:ctrlp_follow_symlinks': ['s:folsym', 0], \ 'g:ctrlp_highlight_match': ['s:mathi', [1, 'Identifier']], \ 'g:ctrlp_lazy_update': ['s:lazy', 0], - \ 'g:ctrlp_jump_to_buffer': ['s:jmptobuf', 1], + \ 'g:ctrlp_jump_to_buffer': ['s:jmptobuf', 2], \ 'g:ctrlp_match_window_bottom': ['s:mwbottom', 1], \ 'g:ctrlp_match_window_reversed': ['s:mwreverse', 1], \ 'g:ctrlp_max_depth': ['s:maxdepth', 40], @@ -126,23 +127,67 @@ fu! ctrlp#reset() unl! s:cline endf " * Files() {{{1 +fu! s:Files() + let [cwd, cache_file] = [getcwd(), ctrlp#utils#cachefile()] + if g:ctrlp_newcache || !filereadable(cache_file) || !s:caching + let lscmd = s:lsCmd() + " Get the list of files + if empty(lscmd) + cal s:GlobPath(cwd, [], 0) + el + sil! cal ctrlp#progress('Indexing...') + try | cal s:UserCmd(cwd, lscmd) | cat | retu [] | endt + en + " Remove base directory + cal ctrlp#rmbasedir(g:ctrlp_allfiles) + let read_cache = 0 + el + let g:ctrlp_allfiles = ctrlp#utils#readfile(cache_file) + let read_cache = 1 + en + if len(g:ctrlp_allfiles) <= s:compare_lim + cal sort(g:ctrlp_allfiles, 'ctrlp#complen') + en + cal s:writecache(read_cache, cache_file) + retu g:ctrlp_allfiles +endf + fu! s:GlobPath(dirs, allfiles, depth) let entries = split(globpath(a:dirs, s:glob), "\n") - if !s:folsym - let entries = filter(entries, 'getftype(v:val) != "link"') + if s:usrign != '' + cal filter(entries, 'v:val !~ s:usrign') en - let g:ctrlp_allfiles = filter(copy(entries), '!isdirectory(v:val)') - let ftrfunc = s:dotfiles ? 'ctrlp#dirfilter(v:val)' : 'isdirectory(v:val)' - let alldirs = filter(entries, ftrfunc) + let [dirs, g:ctrlp_allfiles] = s:DirAndFile(copy(entries)) cal extend(g:ctrlp_allfiles, a:allfiles, 0) let depth = a:depth + 1 - if !empty(alldirs) && !s:maxfiles(len(g:ctrlp_allfiles)) && depth <= s:maxdepth + if !empty(dirs) && !s:maxf(len(g:ctrlp_allfiles)) && depth <= s:maxdepth sil! cal ctrlp#progress(len(g:ctrlp_allfiles)) - cal s:GlobPath(join(alldirs, ','), g:ctrlp_allfiles, depth) + cal s:GlobPath(join(dirs, ','), g:ctrlp_allfiles, depth) en endf -fu! s:UserCommand(path, lscmd) +fu! s:DirAndFile(entries) + let items = [[], []] + for each in a:entries + let etype = getftype(each) + if etype == 'dir' + if s:dotfiles | if match(each, '[\/]\.\{,2}$') < 0 + cal add(items[0], each) + en | el + cal add(items[0], each) + en + el + if s:folsym + cal add(items[1], each) + el | if etype != 'link' + cal add(items[1], each) + en | en + en + endfo + retu items +endf + +fu! s:UserCmd(path, lscmd) let path = a:path if exists('+ssl') && &ssl let [ssl, &ssl, path] = [&ssl, 0, tr(path, '/', '\')] @@ -158,29 +203,21 @@ fu! s:UserCommand(path, lscmd) en endf -fu! s:Files() - let [cwd, cache_file] = [getcwd(), ctrlp#utils#cachefile()] - if g:ctrlp_newcache || !filereadable(cache_file) || !s:caching - let lscmd = s:lscommand() - " Get the list of files - if empty(lscmd) - cal s:GlobPath(cwd, [], 0) - el - sil! cal ctrlp#progress('Waiting...') - try | cal s:UserCommand(cwd, lscmd) | cat | retu [] | endt +fu! s:lsCmd() + let cmd = s:usrcmd + if type(cmd) == 1 + retu cmd + elsei type(cmd) == 3 && len(cmd) >= 2 && !empty(cmd[0]) && !empty(cmd[1]) + let rmarker = cmd[0] + " Find a repo root + cal s:findroot(getcwd(), rmarker, 0, 1) + if !exists('s:vcsroot') || ( exists('s:vcsroot') && empty(s:vcsroot) ) + " Try the secondary_command + retu len(cmd) == 3 ? cmd[2] : '' en - " Remove base directory - cal ctrlp#rmbasedir(g:ctrlp_allfiles) - let read_cache = 0 - el - let g:ctrlp_allfiles = ctrlp#utils#readfile(cache_file) - let read_cache = 1 - en - if len(g:ctrlp_allfiles) <= s:compare_lim - cal sort(g:ctrlp_allfiles, 'ctrlp#complen') + let s:vcscmd = s:lash == '\' ? 1 : 0 + retu cmd[1] en - cal s:writecache(read_cache, cache_file) - retu g:ctrlp_allfiles endf fu! s:Buffers() "{{{1 let allbufs = [] @@ -669,19 +706,19 @@ fu! ctrlp#acceptfile(mode, matchstr, ...) let filpath = s:itemtype ? matchstr : getcwd().s:lash.matchstr cal s:PrtExit() let bufnum = bufnr(filpath) - if s:jmptobuf && bufnum > 0 && (md == 'e' || md == 't') + if s:jmptobuf && bufnum > 0 && md =~ 'e\|t' let [jmpb, bufwinnr] = [1, bufwinnr(bufnum)] - let buftab = s:jmptobuf > 1 ? s:buftab(bufnum) : [0, 0] + let buftab = s:jmptobuf > 1 ? s:buftab(bufnum, md) : [0, 0] let j2l = a:0 ? a:1 : str2nr(matchstr(s:tail(), '^ +\zs\d\+$')) en " Switch to existing buffer or open new one - if exists('jmpb') && buftab[0] - exe 'tabn' buftab[1] - exe buftab[0].'winc w' - if j2l | cal s:j2l(j2l) | en - elsei exists('jmpb') && bufwinnr > 0 + if exists('jmpb') && bufwinnr > 0 && md != 't' exe bufwinnr.'winc w' if j2l | cal s:j2l(j2l) | en + elsei exists('jmpb') && buftab[0] + exe 'tabn' buftab[0] + exe buftab[1].'winc w' + if j2l | cal s:j2l(j2l) | en el " Determine the command to use let cmd = md == 't' || s:splitwin == 1 ? 'tabe' @@ -692,8 +729,31 @@ fu! ctrlp#acceptfile(mode, matchstr, ...) en endf +fu! s:SpecInputs() + let str = join(s:prompt, '') + let type = s:itemtype > 2 ? + \ g:ctrlp_ext_vars[s:itemtype - ( g:ctrlp_builtins + 1 )][3] : s:itemtype + if str == '..' && type =~ '0\|dir' + cal s:parentdir(getcwd()) + cal s:SetLines(s:itemtype) + cal s:PrtClear() + retu 1 + elsei ( str == '/' || str == '\' ) && type =~ '0\|dir' + cal s:SetWD(2, 0) + cal s:SetLines(s:itemtype) + cal s:PrtClear() + retu 1 + elsei str == '?' + cal s:PrtExit() + let hlpwin = &columns > 159 ? '| vert res 80' : '' + sil! exe 'bo vert h ctrlp-mappings' hlpwin '| norm! 0' + retu 1 + en + retu 0 +endf + fu! s:AcceptSelection(mode) - if a:mode == 'e' | if s:specinputs() | retu | en | en + if a:mode == 'e' | if s:SpecInputs() | retu | en | en " Get the selected line let matchstr = matchstr(getline('.'), '^> \zs.\+\ze\t*$') if empty(matchstr) | retu | en @@ -885,10 +945,6 @@ fu! ctrlp#progress(len) redr endf " Paths {{{2 -fu! ctrlp#dirfilter(val) - retu isdirectory(a:val) && match(a:val, '[\/]\.\{,2}$') < 0 ? 1 : 0 -endf - fu! s:ispathitem() let ext = s:itemtype - ( g:ctrlp_builtins + 1 ) if s:itemtype < 3 || ( s:itemtype > 2 && g:ctrlp_ext_vars[ext][3] == 'dir' ) @@ -1051,14 +1107,14 @@ fu! s:vacantdict(dict) retu filter(range(1, max(keys(a:dict))), '!has_key(a:dict, v:val)') endf " Buffers {{{2 -fu! s:buftab(bufnum) - for nr in range(1, tabpagenr('$')) - let buflist = tabpagebuflist(nr) - if match(buflist, a:bufnum) >= 0 - let [buftabnr, tabwinnrs] = [nr, tabpagewinnr(nr, '$')] - for ewin in range(1, tabwinnrs) - if buflist[ewin - 1] == a:bufnum - retu [ewin, buftabnr] +fu! s:buftab(bufnum, md) + for tabnr in range(1, tabpagenr('$')) + if tabpagenr() == tabnr && a:md == 't' | con | en + let buflist = tabpagebuflist(tabnr) + if index(buflist, a:bufnum) >= 0 + for winnr in range(1, tabpagewinnr(tabnr, '$')) + if buflist[winnr - 1] == a:bufnum + retu [tabnr, winnr] en endfo en @@ -1136,29 +1192,6 @@ fu! s:sanstail(str) retu str endf " Misc {{{2 -fu! s:specinputs() - let str = join(s:prompt, '') - let type = s:itemtype > 2 ? - \ g:ctrlp_ext_vars[s:itemtype - ( g:ctrlp_builtins + 1 )][3] : s:itemtype - if str == '..' && type =~ '0\|dir' - cal s:parentdir(getcwd()) - cal s:SetLines(s:itemtype) - cal s:PrtClear() - retu 1 - elsei ( str == '/' || str == '\' ) && type =~ '0\|dir' - cal s:SetWD(2, 0) - cal s:SetLines(s:itemtype) - cal s:PrtClear() - retu 1 - elsei str == '?' - cal s:PrtExit() - let hlpwin = &columns > 159 ? '| vert res 80' : '' - sil! exe 'bo vert h ctrlp-mappings' hlpwin '| norm! 0' - retu 1 - en - retu 0 -endf - fu! s:lastvisual() let cview = winsaveview() let [ovreg, ovtype] = [getreg('v'), getregtype('v')] @@ -1228,7 +1261,7 @@ fu! s:matchtab(item, pat) retu match(split(a:item, '\t\+[^\t]\+$')[0], a:pat) endf -fu! s:maxfiles(len) +fu! s:maxf(len) retu s:maxfiles && a:len > s:maxfiles ? 1 : 0 endf @@ -1248,23 +1281,6 @@ fu! s:insertcache(str) cal insert(data, str, pos) cal s:writecache(0, ctrlp#utils#cachefile()) endf - -fu! s:lscommand() - let cmd = s:usrcmd - if type(cmd) == 1 - retu cmd - elsei type(cmd) == 3 && len(cmd) >= 2 && !empty(cmd[0]) && !empty(cmd[1]) - let rmarker = cmd[0] - " Find a repo root - cal s:findroot(getcwd(), rmarker, 0, 1) - if !exists('s:vcsroot') || ( exists('s:vcsroot') && empty(s:vcsroot) ) - " Try the secondary_command - retu len(cmd) == 3 ? cmd[2] : '' - en - let s:vcscmd = s:lash == '\' ? 1 : 0 - retu cmd[1] - en -endf " Extensions {{{2 fu! s:tagfiles() retu filter(map(tagfiles(), 'fnamemodify(v:val, ":p")'), 'filereadable(v:val)') diff --git a/autoload/ctrlp/dir.vim b/autoload/ctrlp/dir.vim index 46e4403f..91aa7a95 100644 --- a/autoload/ctrlp/dir.vim +++ b/autoload/ctrlp/dir.vim @@ -17,6 +17,7 @@ let s:ars = [ \ 's:maxfiles', \ 's:compare_lim', \ 's:glob', + \ 's:usrign', \ ] let s:dir_var = ['ctrlp#dir#init('.join(s:ars, ', ').')', 'ctrlp#dir#accept', @@ -30,9 +31,12 @@ let s:id = g:ctrlp_builtins + len(g:ctrlp_ext_vars) fu! s:globdirs(dirs, depth) let entries = split(globpath(a:dirs, s:glob), "\n") if !s:folsym - let entries = filter(entries, 'getftype(v:val) != "link"') + cal filter(entries, 'getftype(v:val) != "link"') en - let ftrfunc = s:dotfiles ? 'ctrlp#dirfilter(v:val)' : 'isdirectory(v:val)' + if s:usrign != '' + cal filter(entries, 'v:val !~ s:usrign') + en + let ftrfunc = s:dotfiles ? 's:dirfilter(v:val)' : 'isdirectory(v:val)' let alldirs = filter(entries, ftrfunc) cal extend(g:ctrlp_alldirs, alldirs) let depth = a:depth + 1 @@ -43,6 +47,10 @@ fu! s:globdirs(dirs, depth) en endf +fu! s:dirfilter(val) + retu isdirectory(a:val) && match(a:val, '[\/]\.\{,2}$') < 0 ? 1 : 0 +endf + fu! s:max(len, max) retu a:max && a:len > a:max ? 1 : 0 endf diff --git a/doc/ctrlp.txt b/doc/ctrlp.txt index c2f99234..be41992b 100644 --- a/doc/ctrlp.txt +++ b/doc/ctrlp.txt @@ -23,9 +23,9 @@ CONTENTS *ctrlp-contents* =============================================================================== 1. Intro *ctrlp-intro* -Full path fuzzy file, buffer and MRU file finder with an intuitive interface. +Full path fuzzy file, buffer, mru and tag finder with an intuitive interface. Written in pure Vimscript for MacVim and Vim version 7.0+. Has full support for -Vim’s |regexp| as search pattern, built-in MRU monitoring, project’s root +Vim’s |regexp| as search pattern, built-in MRU files monitoring, project’s root finder, and more. To enable optional extensions (tag, quickfix, dir...), see |ctrlp-extensions|. @@ -40,8 +40,13 @@ Use this option to change the mapping to invoke |CtrlP| in |Normal| mode: > let g:ctrlp_map = '' < + *'g:ctrlp_cmd'* +Set the default opening command to use when pressing the above mapping: > + let g:ctrlp_cmd = 'CtrlP' +< + *'g:loaded_ctrlp'* -Use this option to disable the plugin completely: > +Use this to disable the plugin completely: > let g:loaded_ctrlp = 1 < @@ -72,9 +77,10 @@ Set the maximum height of the match window: > < *'g:ctrlp_jump_to_buffer'* -Set this to 0 to disable the jump-to-open-buffer feature. Set to 2 to also jump -tab if the selected buffer’s opened in another tab: > - let g:ctrlp_jump_to_buffer = 1 +Set this to 0 to disable the jump-to-open-buffer feature. +Set to 2 to also jump tab if the selected buffer’s opened in another tab. +Set to 1 to only jump to it if it’s opened in the current tab: > + let g:ctrlp_jump_to_buffer = 2 < *'g:ctrlp_working_path_mode'* @@ -192,21 +198,24 @@ MRU entries: > Set this to 0 if you don’t want |CtrlP| to search for dotfiles and dotdirs: > let g:ctrlp_dotfiles = 1 < -You can also use |'wildignore'| to exclude anything from the search. -e.g. exclude version control directories from the results: > +You can use |'wildignore'| to exclude anything from the search. +e.g. exclude version control directories: > set wildignore+=*/.git/*,*/.hg/*,*/.svn/* " Linux/MacOSX set wildignore+=.git\*,.hg\*,.svn\* " Windows < -Note: the `*/` in front of each dotfile glob is required for the dotfiles -search feature to work correctly along side with |wildignore|. If you’ve -disabled dotfiles search (set |g:ctrlp_dotfiles| to 0), then you can ignore -this. +Note: the `*/` in front of each glob is required. Other note: |wildignore| influences the result of |expand()|, |globpath()| and |glob()| which many plugins use to find stuff on the system (e.g. fugitive.vim looks for .git/, some other plugins look for external exe tools on Windows). So be a little mindful of what you put in your |wildignore|. + *'g:ctrlp_custom_ignore'* +In addition to |'wildignore'|, use this for files and directories you want only +|CtrlP| to not show. Use |regexp| to specify the pattern: > + let g:ctrlp_custom_ignore = '' +< + *'g:ctrlp_highlight_match'* Use this to enable/disable highlighting of the matched patterns and to specify the highlight group that’ll be used: > @@ -491,7 +500,7 @@ d) Type exactly two dots '..' at the start of the prompt and press enter to go backward in the directory tree by 1 level. If the parent directory is large, this might be slow. -e) Similarly submit '/' or '\' to find and go to the project’s root. If the +e) Similarly, submit '/' or '\' to find and go to the project’s root. If the project is large, using a VCS listing command to look for files might help speeding up the intial scan (see |g:ctrlp_user_command| for more details). @@ -590,6 +599,9 @@ Special thanks:~ =============================================================================== CHANGELOG *ctrlp-changelog* + + New options: |g:ctrlp_cmd|, + |g:ctrlp_custom_ignore| + Before 2011/11/30~ + New features: Tag, Quickfix and Directory extensions. diff --git a/plugin/ctrlp.vim b/plugin/ctrlp.vim index a0bf585c..e3b354d7 100644 --- a/plugin/ctrlp.vim +++ b/plugin/ctrlp.vim @@ -11,21 +11,22 @@ en let [g:loaded_ctrlp, g:ctrlp_lines, g:ctrlp_allfiles] = [1, [], []] if !exists('g:ctrlp_map') | let g:ctrlp_map = '' | en +if !exists('g:ctrlp_cmd') | let g:ctrlp_cmd = 'CtrlP' | en com! -na=? -comp=custom,ctrlp#cpl CtrlP cal ctrlp#init(0, ) com! CtrlPBuffer cal ctrlp#init(1) com! CtrlPMRUFiles cal ctrlp#init(2) -com! ClearCtrlPCache cal ctrlp#clr() +com! ClearCtrlPCache cal ctrlp#clr() com! ClearAllCtrlPCaches cal ctrlp#clra() -com! ResetCtrlP cal ctrlp#reset() +com! ResetCtrlP cal ctrlp#reset() com! CtrlPCurWD cal ctrlp#init(0, 0) com! CtrlPCurFile cal ctrlp#init(0, 1) com! CtrlPRoot cal ctrlp#init(0, 2) -exe 'nn ' g:ctrlp_map ':CtrlP' +exe 'nn ' g:ctrlp_map ':'.g:ctrlp_cmd.'' cal ctrlp#mrufiles#init()