diff --git a/autoload/ctrlp.vim b/autoload/ctrlp.vim index 4644b01..e72fced 100644 --- a/autoload/ctrlp.vim +++ b/autoload/ctrlp.vim @@ -2,7 +2,7 @@ " File: autoload/ctrlp.vim " Description: Fuzzy file, buffer, mru and tag finder. " Author: Kien Nguyen -" Version: 1.6.5 +" Version: 1.6.6 " ============================================================================= " Static variables {{{1 @@ -42,6 +42,7 @@ fu! s:opts() if !exists('g:ctrlp_newcache') | let g:ctrlp_newcache = 0 | en let s:glob = s:dotfiles ? '.*\|*' : '*' let s:maxdepth = min([s:maxdepth, 100]) + let s:igntype = empty(s:usrign) ? -1 : type(s:usrign) let g:ctrlp_builtins = 2 if !empty(s:extensions) | for each in s:extensions exe 'ru autoload/ctrlp/'.each.'.vim' @@ -54,7 +55,7 @@ let s:lash = ctrlp#utils#lash() " Global options let s:glbs = { 'magic': 1, 'to': 1, 'tm': 0, 'sb': 1, 'hls': 0, 'im': 0, \ 'report': 9999, 'sc': 0, 'ss': 0, 'siso': 0, 'mfd': 200, 'mouse': 'n', - \ 'gcr': 'a:blinkon0' } + \ 'gcr': 'a:blinkon0', 'ic': 1, 'scs': 1 } if s:lazy cal extend(s:glbs, { 'ut': ( s:lazy > 1 ? s:lazy : 250 ) }) @@ -67,13 +68,8 @@ fu! s:Open() if exists('g:ctrlp_log') && g:ctrlp_log sil! exe 'redi >>' ctrlp#utils#cachedir().s:lash.'ctrlp.log' en - let [s:cwd, s:winres] = [getcwd(), winrestcmd()] - let [s:crfile, s:crfpath] = [expand('%:p', 1), expand('%:p:h', 1)] - let [s:crword, s:crline] = [expand(''), getline('.')] - let [s:tagfiles, s:crcursor] = [s:tagfiles(), getpos('.')] - let [s:crbufnr, s:crvisual] = [bufnr('%'), s:lastvisual()] - let s:currwin = s:mwbottom ? winnr() : winnr() + has('autocmd') - sil! exe s:mwbottom ? 'bo' : 'to' '1new ControlP' + cal s:getenv() + sil! exe 'keepa' ( s:mwbottom ? 'bo' : 'to' ) '1new ControlP' let [s:bufnr, s:prompt] = [bufnr('%'), ['', '', '']] abc if !exists('s:hstry') @@ -97,9 +93,15 @@ fu! s:Close() endfo if exists('s:glb_acd') | let &acd = s:glb_acd | en let [g:ctrlp_lines, g:ctrlp_allfiles] = [[], []] - exe s:winres + if s:winres[1] >= &lines && s:winres[2] == winnr('$') + exe s:winres[0] + en unl! s:focus s:hisidx s:hstgot s:marked s:statypes s:cline s:init s:savestr \ g:ctrlp_nolimit + if exists('g:ctrlp_ext_vars') + cal map(filter(copy(g:ctrlp_ext_vars), + \ 'exists("v:val[4]")'), 'eval(v:val[4])') + en cal ctrlp#recordhist() if exists('g:ctrlp_log') && g:ctrlp_log sil! redi END @@ -159,9 +161,6 @@ endf fu! s:GlobPath(dirs, depth) let entries = split(globpath(a:dirs, s:glob), "\n") - if s:usrign != '' - cal filter(entries, 'v:val !~ s:usrign') - en let [dnf, depth] = [ctrlp#dirnfile(entries), a:depth + 1] cal extend(g:ctrlp_allfiles, dnf[1]) if !empty(dnf[0]) && !s:maxf(len(g:ctrlp_allfiles)) && depth <= s:maxdepth @@ -215,7 +214,7 @@ fu! s:Buffers() "{{{1 retu allbufs endf " * MatchedItems() {{{1 -fu! s:MatchIt(items, pat, limit, ispathitem, mfunc) +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 @@ -227,7 +226,9 @@ endf fu! s:MatchedItems(items, pats, limit) let [items, pats, limit, ipt] = [a:items, a:pats, a:limit, s:ispathitem()] " If items is longer than s:mltipats_lim, use only the last pattern - if len(items) >= s:mltipats_lim | let pats = [pats[-1]] | en + 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 let mfunc = s:byfname && ipt ? 's:matchfname' @@ -243,7 +244,7 @@ fu! s:MatchedItems(items, pats, limit) 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, ipt, mfunc) + let newitems = s:MatchIt(items, pat, limit, mfunc) en endfo let s:matches = len(newitems) @@ -320,7 +321,9 @@ fu! s:Render(lines, pat) keepj norm! 1| cal s:unmarksigns() cal s:remarksigns() - if exists('s:cline') | cal cursor(s:cline, 1) | en + if exists('s:cline') && !exists('g:ctrlp_nolimit') + cal cursor(s:cline, 1) + en " Highlighting if s:dohighlight() cal s:highlight(a:pat, empty(s:mathi[1]) ? 'Identifier' : s:mathi[1]) @@ -460,7 +463,7 @@ endf fu! s:PrtSelectMove(dir) exe 'norm!' a:dir - let s:cline = line('.') + if !exists('g:ctrlp_nolimit') | let s:cline = line('.') | en if line('$') > winheight(0) | cal s:BuildPrompt(0, s:Focus()) | en endf @@ -483,7 +486,7 @@ fu! s:PrtSelectJump(char, ...) let [jmpln, s:jmpchr] = [npos == -1 ? pos : npos, [chr, npos]] en keepj exe jmpln + 1 - let s:cline = line('.') + if !exists('g:ctrlp_nolimit') | let s:cline = line('.') | en if line('$') > winheight(0) | cal s:BuildPrompt(0, s:Focus()) | en en endf @@ -549,7 +552,7 @@ endf fu! s:MapSpecs(...) let [lcmap, prtmaps] = ['nn ', { - \ 'PrtBS()': [''], + \ 'PrtBS()': ['', ''], \ 'PrtDelete()': [''], \ 'PrtDeleteWord()': [''], \ 'PrtClear()': [''], @@ -557,11 +560,11 @@ fu! s:MapSpecs(...) \ 'PrtSelectMove("k")': ['', ''], \ 'PrtHistory(-1)': [''], \ 'PrtHistory(1)': [''], - \ 'AcceptSelection("e")': ['', '<2-LeftMouse>'], + \ 'AcceptSelection("e")': ['', '', '<2-LeftMouse>'], \ 'AcceptSelection("h")': ['', '', ''], \ 'AcceptSelection("t")': ['', ''], - \ 'AcceptSelection("v")': ['', '', ''], - \ 'ToggleFocus()': [''], + \ 'AcceptSelection("v")': ['', ''], + \ 'ToggleFocus()': ['', ''], \ 'ToggleRegex()': [''], \ 'ToggleByFname()': [''], \ 'ToggleType(1)': ['', ''], @@ -572,7 +575,7 @@ fu! s:MapSpecs(...) \ 'PrtInsert("+")': [''], \ 'PrtCurStart()': [''], \ 'PrtCurEnd()': [''], - \ 'PrtCurLeft()': ['', ''], + \ 'PrtCurLeft()': ['', '', ''], \ 'PrtCurRight()': ['', ''], \ 'PrtClearCache()': [''], \ 'PrtDeleteMRU()': [''], @@ -581,11 +584,14 @@ fu! s:MapSpecs(...) \ 'OpenMulti()': [''], \ 'PrtExit()': ['', '', ''], \ }] + if !has('gui_running') && ( has('win32') || has('win64') ) + cal add(prtmaps['PrtBS()'], remove(prtmaps['PrtCurLeft()'], 0)) + en if type(s:urprtmaps) == 4 cal extend(prtmaps, s:urprtmaps) en " Correct arrow keys in terminal - if ( has('termresponse') && !empty(v:termresponse) ) + if ( has('termresponse') && match(v:termresponse, "\") >= 0 ) \ || &term =~? 'xterm\|\','\B ','\C ','\D '] exe lcmap.' ['.each @@ -648,11 +654,7 @@ fu! s:ToggleType(dir) unl! g:ctrlp_nolimit cal s:SetLines(s:itemtype) cal s:PrtSwitcher() - if s:itemtype > 2 - if exists('g:ctrlp_ext_vars['.s:extid.'][4][0]') - let g:ctrlp_nolimit = g:ctrlp_ext_vars[s:extid][4][0] - en - el + if s:itemtype < 3 && has('syntax') && exists('g:syntax_on') cal s:syntax() en endf @@ -695,7 +697,7 @@ fu! ctrlp#acceptfile(mode, matchstr, ...) if s:jmptobuf && bufnum > 0 && md =~ 'e\|t' let [jmpb, bufwinnr] = [1, bufwinnr(bufnum)] let buftab = s:jmptobuf > 1 ? s:buftab(bufnum, md) : [0, 0] - let j2l = a:0 ? a:1 : str2nr(matchstr(s:tail(), '^ +\zs\d\+$')) + let j2l = a:0 ? a:1 : str2nr(matchstr(s:tail(), '^ +\D*\zs\d\+\ze\D*')) en " Switch to existing buffer or open new one if exists('jmpb') && bufwinnr > 0 && md != 't' @@ -716,9 +718,7 @@ fu! ctrlp#acceptfile(mode, matchstr, ...) 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 + let [str, type] = [join(s:prompt, ''), s:type()] if str == '..' && type =~ '0\|dir' cal s:parentdir(getcwd()) cal s:SetLines(s:itemtype) @@ -771,7 +771,10 @@ fu! s:CreateNewFile() "{{{1 endf " * OpenMulti() {{{1 fu! s:MarkToOpen() - if s:bufnr <= 0 || !s:opmul || s:itemtype > g:ctrlp_builtins | retu | en + if s:bufnr <= 0 || !s:opmul + \ || ( s:itemtype > g:ctrlp_builtins && s:type() !~ 'rts' ) + retu + en let matchstr = matchstr(getline('.'), '^> \zs.\+\ze\t*$') if empty(matchstr) | retu | en let filpath = s:itemtype ? matchstr : getcwd().s:lash.matchstr @@ -801,10 +804,10 @@ endf fu! s:OpenMulti() if !exists('s:marked') || !s:opmul - cal s:AcceptSelection('e') - retu + cal s:AcceptSelection('e') | retu en let mkd = s:marked + cal s:sanstail(join(s:prompt, '')) cal s:PrtExit() " Try not to open a new tab let [ntab, norwins] = [0, s:normbuf()] @@ -821,8 +824,8 @@ fu! s:OpenMulti() if ntab | tabnew | en let [ic, wnr] = [1, exists('wnr') ? wnr : 1] let cmds = { 'v': 'vne', 'h': 'new', 't': 'tabe' } - let spt = len(s:opmul) > 1 ? cmds[matchstr(s:opmul, '\w$')] : 'vne' - let nr = matchstr(s:opmul, '^\d\+') + let [nr, md] = matchlist(s:opmul, '\v^(\d+)(\w)$')[1:2] + let spt = len(s:opmul) > 1 ? cmds[md] : 'vne' exe wnr.'winc w' for va in values(mkd) let cmd = ic == 1 ? 'e' : spt @@ -853,8 +856,9 @@ endf fu! s:comparent(s1, s2) " By same parent dir - if match(s:crfpath, escape(getcwd(), '.^$*\')) >= 0 - let [as1, as2] = [getcwd().s:lash.a:s1, getcwd().s:lash.a:s2] + let cwd = getcwd() + if match(s:crfpath, escape(cwd, '.^$*\')) >= 0 + let [as1, as2] = [cwd.s:lash.a:s1, cwd.s:lash.a:s2] let [loc1, loc2] = [s:getparent(as1), s:getparent(as2)] if loc1 == s:crfpath && loc2 != s:crfpath | retu -1 | en if loc2 == s:crfpath && loc1 != s:crfpath | retu 1 | en @@ -933,13 +937,15 @@ endf " Paths {{{2 fu! s:ispathitem() let ext = s:itemtype - ( g:ctrlp_builtins + 1 ) - retu s:itemtype < 3 || ( s:itemtype > 2 && g:ctrlp_ext_vars[ext][3] == 'dir' ) + retu s:itemtype < 3 + \ || ( s:itemtype > 2 && g:ctrlp_ext_vars[ext][3] =~ 'dir\|rts' ) endf fu! ctrlp#dirnfile(entries) let [items, cwd] = [[[], []], getcwd().s:lash] for each in a:entries let etype = getftype(each) + if s:igntype >= 0 && s:usrign(each, etype) | con | en if etype == 'dir' if s:dotfiles | if match(each, '[\/]\.\{,2}$') < 0 cal add(items[0], each) @@ -960,6 +966,12 @@ fu! ctrlp#dirnfile(entries) retu items endf +fu! s:usrign(item, type) + retu s:igntype == 1 ? a:item =~ s:usrign + \ : s:igntype == 4 && has_key(s:usrign, a:type) && s:usrign[a:type] != '' + \ ? a:item =~ s:usrign[a:type] : 0 +endf + fu! s:samerootsyml(each, isfile, cwd) let resolve = resolve(a:each) let resolve = ( a:isfile ? fnamemodify(resolve, ':p:h') : resolve ).s:lash @@ -967,8 +979,12 @@ fu! s:samerootsyml(each, isfile, cwd) endf fu! ctrlp#rmbasedir(items) - let idx = strlen(getcwd()) + 1 - retu map(a:items, 'strpart(v:val, idx)') + let cwd = getcwd() + if !stridx(a:items[0], cwd) + let idx = strlen(cwd) + 1 + retu map(a:items, 'strpart(v:val, idx)') + en + retu a:items endf fu! s:parentdir(curr) @@ -977,11 +993,11 @@ fu! s:parentdir(curr) endf fu! s:getparent(item) - retu split(a:item, '[\/]\ze[^\/]\+[\/:]\?$')[0] -endf - -fu! s:getgrand(item) - retu split(a:item, '[\/]\ze[^\/]\+[\/][^\/]\+[\/:]\?$')[0] + let parent = substitute(a:item, '[\/][^\/]\+[\/:]\?$', '', '') + if parent == '' || match(parent, '[\/]') < 0 + let parent .= s:lash + en + retu parent endf fu! s:createparentdirs(arr) @@ -992,21 +1008,6 @@ fu! s:createparentdirs(arr) retu curr endf -fu! s:listdirs(path, parent) - let [str, dirs] = ['', split(s:glbpath(a:path, '*', 1), "\n")] - for entry in filter(dirs, 'isdirectory(v:val)') - let str .= a:parent . split(entry, '[\/]')[-1] . "\n" - endfo - retu str -endf - -fu! ctrlp#cpl(A, L, P) - let haslash = match(a:A, '[\/]') - let parent = substitute(a:A, '[^\/]*$', '', 'g') - let path = !haslash ? parent : haslash > 0 ? getcwd().s:lash.parent : getcwd() - retu s:listdirs(path, parent) -endf - fu! s:findroot(curr, mark, depth, type) let [depth, notfound] = [a:depth + 1, empty(s:glbpath(a:curr, a:mark, 1))] if !notfound || depth > s:maxdepth @@ -1036,7 +1037,7 @@ fu! ctrlp#setdir(path, ...) try exe cmd.' '.ctrlp#fnesc(a:path) cat - cal ctrlp#msg("Can't change working dir. Directory not exists.") + cal ctrlp#msg("Can't change working directory.") endt endf " Highlighting {{{2 @@ -1063,8 +1064,7 @@ fu! s:highlight(pat, grp) endf fu! s:dohighlight() - retu type(s:mathi) == 3 && len(s:mathi) > 1 && s:mathi[0] - \ && exists('*clearmatches') + retu len(s:mathi) > 1 && s:mathi[0] && exists('*clearmatches') endf " Prompt history {{{2 fu! s:gethistloc() @@ -1203,6 +1203,19 @@ fu! s:sanstail(str) retu substitute(str, '\\\ze:', '', 'g') endf " Misc {{{2 +fu! s:getenv() + let [s:cwd, s:winres] = [getcwd(), [winrestcmd(), &lines, winnr('$')]] + let [s:crfile, s:crfpath] = [expand('%:p', 1), expand('%:p:h', 1)] + let [s:crword, s:crline] = [expand(''), getline('.')] + let [s:tagfiles, s:crcursor] = [s:tagfiles(), getpos('.')] + let [s:crbufnr, s:crvisual] = [bufnr('%'), s:lastvisual()] + if exists('g:ctrlp_extensions') && index(g:ctrlp_extensions, 'undo') >= 0 + \ && v:version > 702 && has('patch005') && exists('*undotree') + let s:undotree = undotree() + en + let s:currwin = s:mwbottom ? winnr() : winnr() + has('autocmd') +endf + fu! s:lastvisual() let cview = winsaveview() let [ovreg, ovtype] = [getreg('v'), getregtype('v')] @@ -1229,6 +1242,7 @@ fu! s:openfile(cmd, filpath, ...) if !empty(tail) sil! norm! zvzz en + cal ctrlp#setdir(getcwd(), haslocaldir() ? 'lc!' : 'cd!') endt endf @@ -1292,10 +1306,29 @@ fu! s:insertcache(str) cal s:writecache(0, ctrlp#utils#cachefile()) endf " Extensions {{{2 +fu! s:type() + retu s:itemtype > 2 ? + \ g:ctrlp_ext_vars[s:itemtype - ( g:ctrlp_builtins + 1 )][3] : s:itemtype +endf + fu! s:tagfiles() retu filter(map(tagfiles(), 'fnamemodify(v:val, ":p")'), 'filereadable(v:val)') endf +fu! ctrlp#allbufs() + let bufs = [] + for each in range(1, bufnr('$')) + if getbufvar(each, '&bl') + let bufname = bufname(each) + if strlen(bufname) && bufname != 'ControlP' + cal add(bufs, fnamemodify(bufname, ':p')) + en + en + endfo + cal filter(bufs, 'filereadable(v:val)') + retu bufs +endf + fu! ctrlp#exit() cal s:PrtExit() endf diff --git a/autoload/ctrlp/buffertag.vim b/autoload/ctrlp/buffertag.vim index 9b56859..6607a01 100644 --- a/autoload/ctrlp/buffertag.vim +++ b/autoload/ctrlp/buffertag.vim @@ -2,6 +2,9 @@ " File: autoload/ctrlp/buffertag.vim " Description: Buffer Tag extension " Maintainer: Kien Nguyen +" Credits: Much of the code was taken from tagbar.vim by Jan Larres, plus +" a few lines from taglist.vim by Yegappan Lakshmanan and from +" buffertag.vim by Takeshi Nishida. " ============================================================================= " Init {{{1 @@ -10,8 +13,8 @@ if exists('g:loaded_ctrlp_buftag') && g:loaded_ctrlp_buftag en let g:loaded_ctrlp_buftag = 1 -let s:buftag_var = ['ctrlp#buffertag#init(s:crfile, s:crbufnr)', - \ 'ctrlp#buffertag#accept', 'buffer tags', 'bft'] +let s:buftag_var = ['ctrlp#buffertag#init(s:crfile)', 'ctrlp#buffertag#accept', + \ 'buffer tags', 'bft', 'ctrlp#buffertag#exit()'] let g:ctrlp_ext_vars = exists('g:ctrlp_ext_vars') && !empty(g:ctrlp_ext_vars) \ ? add(g:ctrlp_ext_vars, s:buftag_var) : [s:buftag_var] @@ -167,16 +170,16 @@ fu! s:process(fname, ftype) let ftime = getftime(a:fname) if has_key(g:ctrlp_buftags, a:fname) \ && g:ctrlp_buftags[a:fname]['time'] >= ftime - let data = g:ctrlp_buftags[a:fname]['data'] + let lines = g:ctrlp_buftags[a:fname]['lines'] el let data = s:exectagsonfile(a:fname, a:ftype) - let cache = { a:fname : { 'time': ftime, 'data': data } } + let [raw, lines] = [split(data, '\n\+'), []] + for line in raw | if len(split(line, ';"')) == 2 + cal add(lines, s:parseline(line)) + en | endfo + let cache = { a:fname : { 'time': ftime, 'lines': lines } } cal extend(g:ctrlp_buftags, cache) en - let [raw, lines] = [split(data, '\n\+'), []] - for line in raw | if len(split(line, ';"')) == 2 - cal add(lines, s:parseline(line)) - en | endfo retu lines endf @@ -184,17 +187,27 @@ fu! s:parseline(line) let eval = '\v^([^\t]+)\t(.+)\t\/\^(.+)\$\/\;\"\t(.+)\tline(no)?\:(\d+)' let vals = matchlist(a:line, eval) if empty(vals) | retu '' | en - retu vals[1].' '.vals[4].'|'.vals[6].'| '.vals[3] + let [bufnr, bufname] = [bufnr(vals[2]), fnamemodify(vals[2], ':p:t')] + retu vals[1].' '.vals[4].'|'.bufnr.':'.bufname.'|'.vals[6].'| '.vals[3] endf " Public {{{1 -fu! ctrlp#buffertag#init(fname, bufnr) +fu! ctrlp#buffertag#init(fname) + let fname = exists('s:bufname') ? s:bufname : a:fname + let bufs = exists('s:btmode') && s:btmode ? ctrlp#allbufs() : [fname] + let lines = [] + for each in bufs + let tftype = get(split(getbufvar(each, '&ft'), '\.'), 0, '') + cal extend(lines, s:process(each, tftype)) + endfo sy match CtrlPTabExtra '\zs\t.*\ze$' hi link CtrlPTabExtra Comment - retu s:process(a:fname, get(split(getbufvar(a:bufnr, '&ft'), '\.'), 0, '')) + retu lines endf fu! ctrlp#buffertag#accept(mode, str) cal ctrlp#exit() + let vals = matchlist(a:str, '\v^[^\t]+\t+[^\t|]+\|(\d+)\:[^\t|]+\|(\d+)\|') + let [bufnr, linenr] = [vals[1], vals[2]] if a:mode == 't' tab sp elsei a:mode == 'h' @@ -202,12 +215,23 @@ fu! ctrlp#buffertag#accept(mode, str) elsei a:mode == 'v' vs en - cal ctrlp#j2l(matchstr(a:str, '^[^\t]\+\t\+[^\t|]\+|\zs\d\+\ze|')) + if exists('s:btmode') && s:btmode + exe 'hid b' bufnr + en + cal ctrlp#j2l(linenr) endf -fu! ctrlp#buffertag#id() +fu! ctrlp#buffertag#cmd(mode, ...) + let s:btmode = a:mode + if a:0 && !empty(a:1) + let s:bufname = fnamemodify(a:1, ':p') + en retu s:id endf + +fu! ctrlp#buffertag#exit() + unl! s:btmode s:bufname +endf "}}} " vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2 diff --git a/autoload/ctrlp/dir.vim b/autoload/ctrlp/dir.vim index a10c880..3507c74 100644 --- a/autoload/ctrlp/dir.vim +++ b/autoload/ctrlp/dir.vim @@ -15,7 +15,6 @@ 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', @@ -28,9 +27,6 @@ let s:id = g:ctrlp_builtins + len(g:ctrlp_ext_vars) " Utilities {{{1 fu! s:globdirs(dirs, depth) let entries = split(globpath(a:dirs, s:glob), "\n") - if s:usrign != '' - cal filter(entries, 'v:val !~ s:usrign') - en let [dirs, depth] = [ctrlp#dirnfile(entries)[0], a:depth + 1] cal extend(g:ctrlp_alldirs, dirs) if !empty(dirs) && !s:max(len(g:ctrlp_alldirs), s:maxfiles) diff --git a/autoload/ctrlp/line.vim b/autoload/ctrlp/line.vim index 341d08f..86655ba 100644 --- a/autoload/ctrlp/line.vim +++ b/autoload/ctrlp/line.vim @@ -1,9 +1,16 @@ " ============================================================================= " File: autoload/ctrlp/line.vim -" Description: Line extension - find a line in any buffer. +" Description: Line extension - Find a line in any buffer " Author: Kien Nguyen " ============================================================================= +" User Configuration {{{1 +" Enable: +" let g:ctrlp_extensions += ['line'] +" Create A Command: +" com! CtrlPLine cal ctrlp#init(ctrlp#line#id()) +"}}} + " Init {{{1 if exists('g:loaded_ctrlp_line') && g:loaded_ctrlp_line fini @@ -18,16 +25,7 @@ let g:ctrlp_ext_vars = exists('g:ctrlp_ext_vars') && !empty(g:ctrlp_ext_vars) let s:id = g:ctrlp_builtins + len(g:ctrlp_ext_vars) " Public {{{1 fu! ctrlp#line#init() - let [bufs, lines] = [[], []] - for each in range(1, bufnr('$')) - if getbufvar(each, '&bl') - let bufname = bufname(each) - if strlen(bufname) && bufname != 'ControlP' - cal add(bufs, fnamemodify(bufname, ':p')) - en - en - endfo - cal filter(bufs, 'filereadable(v:val)') + let [bufs, lines] = [ctrlp#allbufs(), []] for each in bufs let from_file = readfile(each) cal map(from_file, 'tr(v:val, '' '', '' '')') diff --git a/autoload/ctrlp/quickfix.vim b/autoload/ctrlp/quickfix.vim index 92e15e1..b89c374 100644 --- a/autoload/ctrlp/quickfix.vim +++ b/autoload/ctrlp/quickfix.vim @@ -11,7 +11,7 @@ en let g:loaded_ctrlp_quickfix = 1 let s:var_qf = ['ctrlp#quickfix#init()', 'ctrlp#quickfix#accept', 'quickfix', - \ 'qfx', [1]] + \ 'qfx'] let g:ctrlp_ext_vars = exists('g:ctrlp_ext_vars') && !empty(g:ctrlp_ext_vars) \ ? add(g:ctrlp_ext_vars, s:var_qf) : [s:var_qf] diff --git a/autoload/ctrlp/rtscript.vim b/autoload/ctrlp/rtscript.vim new file mode 100644 index 0000000..343baea --- /dev/null +++ b/autoload/ctrlp/rtscript.vim @@ -0,0 +1,45 @@ +" ============================================================================= +" File: autoload/ctrlp/rtscript.vim +" Description: Runtime scripts extension - Find vimscripts in runtimepath +" Author: Kien Nguyen +" ============================================================================= + +" User Configuration {{{1 +" Enable: +" let g:ctrlp_extensions += ['rtscript'] +" Create A Command: +" com! CtrlPRTS cal ctrlp#init(ctrlp#rtscript#id()) +"}}} + +" Init {{{1 +if exists('g:loaded_ctrlp_rtscript') && g:loaded_ctrlp_rtscript + fini +en +let [g:loaded_ctrlp_rtscript, g:ctrlp_newrts] = [1, 0] + +let s:rtscript_var = ['ctrlp#rtscript#init()', 'ctrlp#rtscript#accept', + \ 'runtime scripts', 'rts'] + +let g:ctrlp_ext_vars = exists('g:ctrlp_ext_vars') && !empty(g:ctrlp_ext_vars) + \ ? add(g:ctrlp_ext_vars, s:rtscript_var) : [s:rtscript_var] + +let s:id = g:ctrlp_builtins + len(g:ctrlp_ext_vars) +" Public {{{1 +fu! ctrlp#rtscript#init() + if g:ctrlp_newrts || !exists('g:ctrlp_rtscache') + let entries = split(globpath(&rtp, '**/*.\(vim\|txt\)'), "\n") + let [g:ctrlp_rtscache, g:ctrlp_newrts] = [ctrlp#dirnfile(entries)[1], 0] + en + retu g:ctrlp_rtscache +endf + +fu! ctrlp#rtscript#accept(mode, str) + cal ctrlp#acceptfile(a:mode, a:str) +endf + +fu! ctrlp#rtscript#id() + retu s:id +endf +"}}} + +" vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2 diff --git a/autoload/ctrlp/undo.vim b/autoload/ctrlp/undo.vim new file mode 100644 index 0000000..ecac4f4 --- /dev/null +++ b/autoload/ctrlp/undo.vim @@ -0,0 +1,116 @@ +" ============================================================================= +" File: autoload/ctrlp/undo.vim +" Description: Undo extension - Browse undo history (requires Vim 7.3.005+) +" Author: Kien Nguyen +" ============================================================================= + +" User Configuration {{{1 +" Enable: +" let g:ctrlp_extensions += ['undo'] +" Create A Command: +" com! CtrlPUndo cal ctrlp#init(ctrlp#undo#id()) +"}}} + +" Init {{{1 +if ( exists('g:loaded_ctrlp_undo') && g:loaded_ctrlp_undo ) + \ || !( v:version > 702 && has('patch005') ) + fini +en +let g:loaded_ctrlp_undo = 1 + +let s:undo_var = ['ctrlp#undo#init(s:undotree)', 'ctrlp#undo#accept', + \ 'undo', 'udo'] + +let g:ctrlp_ext_vars = exists('g:ctrlp_ext_vars') && !empty(g:ctrlp_ext_vars) + \ ? add(g:ctrlp_ext_vars, s:undo_var) : [s:undo_var] + +let s:id = g:ctrlp_builtins + len(g:ctrlp_ext_vars) +" Utilities {{{1 +fu! s:flatten(tree) + let flatdict = {} + for each in a:tree + cal extend(flatdict, { each['seq'] : each['time'] }) + if has_key(each, 'alt') + cal extend(flatdict, s:flatten(each['alt'])) + en + endfo + retu flatdict +endf + +fu! s:humantime(nr) + let elapsed = localtime() - a:nr + let mins = elapsed / 60 + let hrs = elapsed / 3600 + let days = elapsed / 86400 + let wks = elapsed / 604800 + let mons = elapsed / 2592000 + let yrs = elapsed / 31536000 + let text = [ + \ ' second ago', + \ ' seconds ago', + \ ' minutes ago', + \ ' hours ago', + \ ' days ago', + \ ' weeks ago', + \ ' months ago', + \ ' years ago', + \ ] + if yrs > 1 + retu yrs.text[7] + elsei mons > 1 + retu mons.text[6] + elsei wks > 1 + retu wks.text[5] + elsei days > 1 + retu days.text[4] + elsei hrs > 1 + retu hrs.text[3] + elsei mins > 1 + retu mins.text[2] + elsei elapsed == 1 + retu elapsed.text[0] + elsei elapsed < 120 + retu elapsed.text[1] + en +endf + +fu! s:syntax() + sy match CtrlPUndoT '\d\+ \zs[^ ]\+\ze' + sy match CtrlPUndoBr '\[\|\]' + sy match CtrlPUndoNr '\[\d\+\]$' contains=CtrlPUndoBr + hi link CtrlPUndoT Directory + hi link CtrlPUndoBr Comment + hi link CtrlPUndoNr String +endf + +fu! s:dict2list(dict) + let dict = map(a:dict, 's:humantime(v:val)') + retu map(keys(dict), 'eval(''[v:val, dict[v:val]]'')') +endf + +fu! s:compval(...) + retu a:2[0] - a:1[0] +endf +" Public {{{1 +fu! ctrlp#undo#init(undo) + let entries = a:undo['entries'] + if empty(entries) | retu [] | en + cal s:syntax() + let g:ctrlp_nolimit = 1 + let entries = sort(s:dict2list(s:flatten(entries)), 's:compval') + retu map(entries, 'v:val[1]." [".v:val[0]."]"') +endf + +fu! ctrlp#undo#accept(mode, str) + let undon = matchstr(a:str, '\[\zs\d\+\ze\]') + if empty(undon) | retu | en + cal ctrlp#exit() + exe 'u' undon +endf + +fu! ctrlp#undo#id() + retu s:id +endf +"}}} + +" vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2 diff --git a/doc/ctrlp.txt b/doc/ctrlp.txt index ed1dfd4..b51ad62 100644 --- a/doc/ctrlp.txt +++ b/doc/ctrlp.txt @@ -1,4 +1,4 @@ -*ctrlp.txt* Fuzzy file, buffer, mru and tag finder. v1.6.5 +*ctrlp.txt* Fuzzy file, buffer, mru and tag finder. v1.6.6 *CtrlP* *ControlP* *'ctrlp'* *'ctrl-p'* =============================================================================== # # @@ -128,7 +128,7 @@ Set the directory to store the cache files: > Use this to customize the mappings inside |CtrlP|’s prompt to your liking. You only need to keep the lines that you’ve changed the values (inside []): > let g:ctrlp_prompt_mappings = { - \ 'PrtBS()': [''], + \ 'PrtBS()': ['', ''], \ 'PrtDelete()': [''], \ 'PrtDeleteWord()': [''], \ 'PrtClear()': [''], @@ -136,18 +136,22 @@ 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")': ['', '', ''], - \ 'ToggleFocus()': [''], + \ 'AcceptSelection("v")': ['', ''], + \ 'ToggleFocus()': ['', ''], \ 'ToggleRegex()': [''], \ 'ToggleByFname()': [''], \ 'ToggleType(1)': ['', ''], \ 'ToggleType(-1)': ['', ''], + \ 'PrtInsert("w")': [''], + \ 'PrtInsert("s")': [''], + \ 'PrtInsert("v")': [''], + \ 'PrtInsert("+")': [''], \ 'PrtCurStart()': [''], \ 'PrtCurEnd()': [''], - \ 'PrtCurLeft()': ['', ''], + \ 'PrtCurLeft()': ['', '', ''], \ 'PrtCurRight()': ['', ''], \ 'PrtClearCache()': [''], \ 'PrtDeleteMRU()': [''], @@ -157,12 +161,13 @@ only need to keep the lines that you’ve changed the values (inside []): > \ 'PrtExit()': ['', '', ''], \ } < -If you have problem with moving left instead of deleting a char, add this -to your |vimrc|: > - let g:ctrlp_prompt_mappings = { - \ 'PrtBS()': [''], - \ 'PrtCurLeft()': [''], - \ } +Note: In some terminals, it’s not possible to remap without also changing +. So if pressing moves the cursor to the left instead of deleting a +char for you, add this to your |vimrc| to change the default mapping: > + let g:ctrlp_prompt_mappings = { + \ 'PrtBS()': ['', '', ''], + \ 'PrtCurLeft()': ['', ''], + \ } < *'g:ctrlp_mruf_max'* @@ -203,18 +208,26 @@ 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 glob is required. +Note #1: the `*/` in front of each glob is required. -Other note: |wildignore| influences the result of |expand()|, |globpath()| and +Note #2: |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: > +|CtrlP| to not show. Use |regexp| to specify the patterns: > let g:ctrlp_custom_ignore = '' < +Examples: > + let g:ctrlp_custom_ignore = '\.git$\|\.hg$\|\.svn$' + let g:ctrlp_custom_ignore = { + \ 'dir': '\.git$\|\.hg$\|\.svn$', + \ 'file': '\.exe$\|\.so$\|\.dll$', + \ 'link': 'bad_symbolic_link', + \ } +> *'g:ctrlp_highlight_match'* Use this to enable/disable highlighting of the matched patterns and to specify @@ -251,11 +264,11 @@ Use a version control listing command when inside a repository, this is a lot faster when working with large projects: > let g:ctrlp_user_command = [repo_marker, vcs_ls_command, fallback_command] < -If the fallback_command is empty or not defined, globpath() will then be used +If the fallback_command is empty or not defined, |globpath()| will then be used when searching outside a repo. Examples: > let g:ctrlp_user_command = ['.git/', 'cd %s && git ls-files'] - let g:ctrlp_user_command = ['.hg/', 'hg --cwd %s locate --fullpath -I .'] + let g:ctrlp_user_command = ['.hg/', 'hg --cwd %s locate -I .'] < *'g:ctrlp_open_new_file'* @@ -407,13 +420,21 @@ Once inside the prompt:~ Move the cursor to the 'end' of the prompt , - + , + Move the cursor one character to the 'left' , Move the cursor one character to the 'right' + , + + Delete the preceding character + + + Delete the current character + Delete a preceding inner word @@ -459,7 +480,7 @@ Once inside the prompt:~ , , - Exit |CtrlP|. can also be used to stop the file scan. + Exit |CtrlP|. can also be used to stop the scan. Choose your own mappings with |g:ctrlp_prompt_mappings|. @@ -483,16 +504,19 @@ b) Vim |regexp|. If the input string contains '*' or '|', it’ll be treated as a Vim’s |regexp| |pattern| without any modification. e.g. 'abc\d*efg' will be read as 'abc\d*efg'. - See also |ctrlp-fullregexp| (key map) and |g:ctrlp_regexp_search| (option). + See also |ctrlp-fullregexp| (keymap) and |g:ctrlp_regexp_search| (option). c) End the string with a colon ':' followed by a Vim command to execute that - command after opening the file. If you need to use ':' in the command, - escape it with a backslash: '\:'. + command after opening the file. If you need to use ':' literally, escape it + with a backslash: '\:'. When opening multiple files, the command will be + executed on each opening file. e.g. 'abc:45' will open the selected file and jump to line 45. 'abc:/my\:function' will open the selected file and jump to the first instance of 'my:function'. 'abc:+setf\ myfiletype|50' will open the selected file and set its - filetype to 'myfiletype' then jump to line 50. + filetype to 'myfiletype', then jump to line 50. + 'abc:difft' will open the selected file and run |:diffthis| on the first + four files. See also Vim’s |++opt| and |+cmd|. @@ -532,11 +556,13 @@ Available extensions:~ locations of the tags file(s). Example: `set tags+=tags/help,doc/tags` *:CtrlPBufTag* + *:CtrlPBufTagAll* * Buffer Tag mode:~ - Name: 'buffertag' - - Command: ':CtrlPBufTag' - - Search for a tag within the current buffer and jump to the definition. - Requires |exuberant_ctags|. + - Commands: ':CtrlPBufTag [buffer-name]', + ':CtrlPBufTagAll'. + - Search for a tag within the current buffer or all buffers and jump to the + definition. Requires |exuberant_ctags| or compatible programs. *:CtrlPQuickfix* * Quickfix mode:~ @@ -547,7 +573,7 @@ Available extensions:~ *:CtrlPDir* * Directory mode:~ - Name: 'dir' - - Command: ':CtrlPDir' + - Command: ':CtrlPDir [starting-directory]' - Search for a directory and change the working directory to it. - Mappings: + change the local working directory for |CtrlP| and keep it open. @@ -634,8 +660,12 @@ Special thanks:~ =============================================================================== CHANGELOG *ctrlp-changelog* + + Extend |g:ctrlp_custom_ignore| to specifically filter dir, file and link. + +Before 2012/01/05~ + + New feature: Buffer Tag extension. - + New command: |:CtrlPBufTag|. + + New commands: |:CtrlPBufTag|, |:CtrlPBufTagAll|. + New options: |g:ctrlp_cmd|, |g:ctrlp_custom_ignore| diff --git a/plugin/ctrlp.vim b/plugin/ctrlp.vim index f26fb7b..c67f518 100644 --- a/plugin/ctrlp.vim +++ b/plugin/ctrlp.vim @@ -13,7 +13,7 @@ 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! -n=? -com=custom,ctrlp#cpl CtrlP cal ctrlp#init(0, ) +com! -n=? -com=dir CtrlP cal ctrlp#init(0, ) com! CtrlPBuffer cal ctrlp#init(1) com! CtrlPMRUFiles cal ctrlp#init(2) @@ -32,21 +32,27 @@ cal ctrlp#mrufiles#init() if !exists('g:ctrlp_extensions') | fini | en -if index(g:ctrlp_extensions, 'tag') >= 0 - let g:ctrlp_alltags = [] | com! CtrlPTag cal ctrlp#init(ctrlp#tag#id()) +let s:ext = g:ctrlp_extensions + +if index(s:ext, 'tag') >= 0 + let g:ctrlp_alltags = [] + com! CtrlPTag cal ctrlp#init(ctrlp#tag#id()) en -if index(g:ctrlp_extensions, 'quickfix') >= 0 +if index(s:ext, 'quickfix') >= 0 com! CtrlPQuickfix cal ctrlp#init(ctrlp#quickfix#id()) en -if index(g:ctrlp_extensions, 'dir') >= 0 +if index(s:ext, 'dir') >= 0 let g:ctrlp_alldirs = [] - com! -n=? -com=custom,ctrlp#cpl CtrlPDir - \ cal ctrlp#init(ctrlp#dir#id(), ) + com! -n=? -com=dir CtrlPDir cal ctrlp#init(ctrlp#dir#id(), ) en -if index(g:ctrlp_extensions, 'buffertag') >= 0 +if index(s:ext, 'buffertag') >= 0 let g:ctrlp_buftags = {} - com! CtrlPBufTag cal ctrlp#init(ctrlp#buffertag#id()) + com! -n=? -com=buffer CtrlPBufTag + \ cal ctrlp#init(ctrlp#buffertag#cmd(0, )) + com! CtrlPBufTagAll cal ctrlp#init(ctrlp#buffertag#cmd(1)) en + +unl s:ext diff --git a/readme.md b/readme.md index c3be192..a902a78 100644 --- a/readme.md +++ b/readme.md @@ -1,5 +1,5 @@ # ctrlp.vim -Full path fuzzy __file__, __buffer__ and __MRU__ file finder for Vim. +Full path fuzzy __file__, __buffer__, __mru__ and __tag__ finder for Vim. * Written in pure Vimscript for MacVim and Vim 7.0+. * Full support for Vim’s regexp as search pattern. @@ -50,12 +50,20 @@ e.g. `abc:45` will open the file matched the pattern and jump to line 45. root.dir .vimprojects -* If you want to exclude directories or files from the search, you can use the Vim’s option `wildignore`. +* If you want to exclude directories or files from the search, you can use the Vim’s option `wildignore` +and/or the option `g:ctrlp_custom_ignore`. Examples: ```vim set wildignore+=*/.git/*,*/.hg/*,*/.svn/* " for Linux/MacOSX set wildignore+=.git\*,.hg\*,.svn\* " for Windows + + let g:ctrlp_custom_ignore = '\.git$\|\.hg$\|\.svn$' + let g:ctrlp_custom_ignore = { + \ 'dir': '\.git$\|\.hg$\|\.svn$', + \ 'file': '\.exe$\|\.so$\|\.dll$', + \ 'link': 'bad_symbolic_link', + \ } ``` * Use a custom file listing command with: