diff --git a/autoload/ctrlp.vim b/autoload/ctrlp.vim index e10a4f9..227ff99 100644 --- a/autoload/ctrlp.vim +++ b/autoload/ctrlp.vim @@ -24,7 +24,7 @@ fu! s:opts() \ 'g:ctrlp_match_window_bottom': ['s:mwbottom', 1], \ 'g:ctrlp_match_window_reversed': ['s:mwreverse', 1], \ 'g:ctrlp_max_depth': ['s:maxdepth', 40], - \ 'g:ctrlp_max_files': ['s:maxfiles', 20000], + \ 'g:ctrlp_max_files': ['s:maxfiles', 10000], \ 'g:ctrlp_max_height': ['s:mxheight', 10], \ 'g:ctrlp_max_history': ['s:maxhst', hst], \ 'g:ctrlp_open_multi': ['s:opmul', '1v'], @@ -66,7 +66,7 @@ fu! s:opts() \ 'PrtSelectMove("d")': [''], \ 'PrtHistory(-1)': [''], \ 'PrtHistory(1)': [''], - \ 'AcceptSelection("e")': ['', '', '<2-LeftMouse>'], + \ 'AcceptSelection("e")': ['', '<2-LeftMouse>'], \ 'AcceptSelection("h")': ['', '', ''], \ 'AcceptSelection("t")': ['', ''], \ 'AcceptSelection("v")': ['', ''], @@ -75,7 +75,7 @@ fu! s:opts() \ 'ToggleByFname()': [''], \ 'ToggleType(1)': ['', ''], \ 'ToggleType(-1)': ['', ''], - \ 'PrtExpandDir()': ['', ''], + \ 'PrtExpandDir()': [''], \ 'PrtInsert("w")': ['', ''], \ 'PrtInsert("s")': [''], \ 'PrtInsert("v")': [''], @@ -126,7 +126,7 @@ cal s:opts() let s:lash = ctrlp#utils#lash() " Limiters -let [s:compare_lim, s:nocache_lim, s:mltipats_lim] = [3000, 4000, 2000] +let [s:compare_lim, s:nocache_lim] = [3000, 4000] " Regexp let s:fpats = { @@ -298,20 +298,15 @@ endf fu! s:MatchIt(items, pat, limit, mfunc) let newitems = [] for item in a:items - if call(a:mfunc, [item, a:pat]) >= 0 | cal add(newitems, item) | en + try | if call(a:mfunc, [item, a:pat]) >= 0 | cal add(newitems, item) | en + cat | brea | endt if a:limit > 0 && len(newitems) >= a:limit | brea | en endfo retu newitems endf -fu! s:MatchedItems(items, pats, limit) - let [items, pats, limit] = [a:items, a:pats, a:limit] - " If items is longer than s:mltipats_lim, use only the last pattern - if len(items) >= s:mltipats_lim || ( exists('s:height') && s:height > 20 ) - let pats = [pats[-1]] - en - cal map(pats, 'substitute(v:val, "\\\~", "\\\\\\~", "g")') - if !s:regexp | cal map(pats, 'escape(v:val, ".")') | en +fu! s:MatchedItems(items, pat, limit) + let [items, pat, limit] = [a:items, a:pat, a:limit] let [type, ipt, mfunc] = [s:type(1), s:ispathitem(), 'match'] if s:byfname && ipt let mfunc = 's:matchfname' @@ -319,52 +314,37 @@ fu! s:MatchedItems(items, pats, limit) let types = { 'tabs': 's:matchtabs', 'tabe': 's:matchtabe' } if has_key(types, type) | let mfunc = types[type] | en en - " Loop through the patterns - for pat in pats - " If newitems is small, set it as items to search in - if exists('newitems') && len(newitems) < limit - let items = copy(newitems) - en - if empty(items) " End here - retu exists('newitems') ? newitems : [] - el " Start here, go back up if have 2 or more in pats - " Loop through the items - let newitems = s:MatchIt(items, pat, limit, mfunc) - en - endfo + let newitems = s:MatchIt(items, pat, limit, mfunc) let s:matches = len(newitems) retu newitems endf -fu! s:SplitPattern(str, ...) "{{{1 +fu! s:SplitPattern(str) "{{{1 let str = s:sanstail(a:str) if s:migemo && s:regexp && len(str) > 0 && executable('cmigemo') let str = s:migemo(str) en let s:savestr = str if s:regexp || match(str, '\\\(<\|>\)\|[*|]') >= 0 - let array = [s:regexfilter(str)] + let pat = s:regexfilter(str) el - let array = split(str, '\zs') + let lst = split(str, '\zs') if exists('+ssl') && !&ssl - cal map(array, 'substitute(v:val, "\\", "\\\\\\", "g")') + cal map(lst, 'escape(v:val, ''\'')') en - " Literal ^ and $ - for each in ['^', '$'] - cal map(array, 'substitute(v:val, "\\\'.each.'", "\\\\\\'.each.'", "g")') + for each in ['^', '$', '.'] + cal map(lst, 'escape(v:val, each)') endfo en - " Build the new pattern - let nitem = !empty(array) ? array[0] : '' - let newpats = [nitem] - if len(array) > 1 - for item in range(1, len(array) - 1) - " Separator - let sep = a:0 ? a:1 : '[^'.array[item-1].']\{-}' - let nitem .= sep.array[item] - cal add(newpats, nitem) - endfo + if exists('lst') + let pat = '' + if !empty(lst) + let pat = lst[0] + for item in range(1, len(lst) - 1) + let pat .= '[^'.lst[item - 1].']\{-}'.lst[item] + endfo + en en - retu newpats + retu escape(pat, '~') endf " * BuildPrompt() {{{1 fu! s:Render(lines, pat) @@ -392,8 +372,7 @@ fu! s:Render(lines, pat) let s:matched = copy(lines) cal map(lines, '"> ".v:val') cal setline(1, lines) - exe 'keepj norm!' s:mwreverse ? 'G' : 'gg' - keepj norm! 1| + exe 'keepj norm!' ( s:mwreverse ? 'G' : 'gg' ).'1|' cal s:unmarksigns() cal s:remarksigns() if exists('s:cline') && !exists('g:ctrlp_nolimit') @@ -408,7 +387,6 @@ endf fu! s:Update(str) " Get the previous string if existed let oldstr = exists('s:savestr') ? s:savestr : '' - let pats = s:SplitPattern(a:str) " Get the new string sans tail let notail = substitute(a:str, '\\\\', '\', 'g') let notail = substitute(notail, '\\\@= 0 || match(str, '\\\:\([^:]\|\\:\)*$') >= 0 ) + \ || match(str, '\(\\\(<\|>\)\|[*|]\)\|\(\\\:\([^:]\|\\:\)*$\)') >= 0 ) sil! cal s:Update(str) en sil! cal ctrlp#statusline() @@ -701,7 +680,7 @@ fu! s:PrtSwitcher() endf fu! s:SetWD(...) "{{{1 let pathmode = s:pathmode - if exists('a:1') && len(a:1) | if type(a:1) + if exists('a:1') && strlen(a:1) | if type(a:1) cal ctrlp#setdir(a:1) | retu el let pathmode = a:1 @@ -928,13 +907,14 @@ fu! s:comparent(s1, s2) endf fu! s:matchlens(str, pat, ...) - if empty(a:pat) || index(['^','$'], a:pat) >= 0 | retu {} | en + if empty(a:pat) || index(['^', '$'], a:pat) >= 0 | retu {} | en let st = exists('a:1') ? a:1 : 0 let lens = exists('a:2') ? a:2 : {} let nr = exists('a:3') ? a:3 : 0 - if match(a:str, a:pat, st) != -1 + if nr > 20 | retu {} | en + if match(a:str, a:pat, st) >= 0 let [mst, mnd] = [matchstr(a:str, a:pat, st), matchend(a:str, a:pat, st)] - let lens = extend(lens, { nr : [len(mst), mst] }) + let lens = extend(lens, { nr : [strlen(mst), mst] }) let lens = s:matchlens(a:str, a:pat, mnd, lens, nr + 1) en retu lens @@ -1149,10 +1129,7 @@ endf fu! s:highlight(pat, grp) cal clearmatches() if !empty(a:pat) && s:ispathitem() - let pat = substitute(a:pat, '\~', '\\~', 'g') - let pat = s:regexp - \ ? substitute(pat, '\\\@ \\zs', 'g') - \ : escape(pat, '.') + let pat = s:regexp ? substitute(a:pat, '\\\@ \\zs', 'g') : a:pat " Match only filename if s:byfname let pat = substitute(pat, '\[\^\(.\{-}\)\]\\{-}', '[^\\/\1]\\{-}', 'g') @@ -1362,7 +1339,7 @@ fu! s:migemo(str) let [tokens, str, cmd] = [split(str, '\s'), '', 'cmigemo -v -w %s -d %s'] for token in tokens let rtn = system(printf(cmd, shellescape(token), shellescape(dict))) - let str .= !v:shell_error && len(rtn) > 0 ? '.*'.rtn : token + let str .= !v:shell_error && strlen(rtn) > 0 ? '.*'.rtn : token endfo en retu str diff --git a/doc/ctrlp.txt b/doc/ctrlp.txt index ce81acd..d9ecca4 100644 --- a/doc/ctrlp.txt +++ b/doc/ctrlp.txt @@ -137,7 +137,7 @@ only need to keep the lines that you’ve changed the values (inside []): > \ 'PrtSelectMove("k")': ['', ''], \ 'PrtHistory(-1)': [''], \ 'PrtHistory(1)': [''], - \ 'AcceptSelection("e")': ['', '', '<2-LeftMouse>'], + \ 'AcceptSelection("e")': ['', '<2-LeftMouse>'], \ 'AcceptSelection("h")': ['', '', ''], \ 'AcceptSelection("t")': ['', ''], \ 'AcceptSelection("v")': ['', ''], @@ -146,7 +146,7 @@ only need to keep the lines that you’ve changed the values (inside []): > \ 'ToggleByFname()': [''], \ 'ToggleType(1)': ['', ''], \ 'ToggleType(-1)': ['', ''], - \ 'PrtExpandDir()': ['', ''], + \ 'PrtExpandDir()': [''], \ 'PrtInsert("w")': ['', ''], \ 'PrtInsert("s")': [''], \ 'PrtInsert("v")': [''], @@ -251,7 +251,7 @@ the highlight group that’ll be used: > *'g:ctrlp_max_files'* The maximum number of files to scan, set to 0 for no limit: > - let g:ctrlp_max_files = 20000 + let g:ctrlp_max_files = 10000 < *'g:ctrlp_max_depth'* @@ -693,50 +693,16 @@ Examples: > \ } < -=============================================================================== -EXTENDING *ctrlp-extending* - -Extending |CtrlP| is very simple. Simply create a vim file following a short -guidelines, place it in autoload/ctrlp/ and add its name to your .vimrc. - -To see how it works, get the sample.vim from the extensions branch on the main -git repository (https://github.com/kien/ctrlp.vim/tree/extensions), and place -it along with the parent directories somewhere in your runtimepath. Then put -this into your .vimrc: > - let g:ctrlp_extensions = ['sample'] -< -A new search type will show up the next time you open |CtrlP|. - -For more details, check out the comments inside sample.vim.~ - -=============================================================================== -USER-CONFIGURATION *ctrlp-user-config* - -Some miscellaneous configurations:~ - -+) |g:ctrlp_user_command| config that makes use of your |wildignore| setting: - https://github.com/kien/ctrlp.vim/issues/70 by Rich Alesi - =============================================================================== CREDITS *ctrlp-credits* -Developed by Kien Nguyen , initially based on the Command-T -and the LustyExplorer plugins. No code was taken from these plugins, but I did -clone the majority of their (awesome) interfaces and the way they work. +Developed by Kien Nguyen . -This was originally written as a module for a would-be larger plugin called -AutoDoc.vim which I’ve stopped developing because of lost of interest. I really -liked the way Command-T and LustyExplorer deal with user’s input, so I wrote a -pure Vimscript version of their prompt window, intended to use it for the -aforementioned plugin. - -Homepage: http://kien.github.com/ctrlp.vim +Project’s homepage: http://kien.github.com/ctrlp.vim Git repository: https://github.com/kien/ctrlp.vim Mercurial repository: https://bitbucket.org/kien/ctrlp.vim -=============================================================================== -THANKS *ctrlp-thanks* - +------------------------------------------------------------------------------- Thanks to everyone that has submitted ideas, bug reports or helped debugging on gibhub, bitbucket, and through email.