Tag and Quickfix extensions

* New extensions for searching tag and quickfix.
* Option to update the results lazily. Close #37.
This commit is contained in:
Kien N 2011-11-28 19:52:28 +07:00
parent dee2f5a998
commit ef9e072c5f
8 changed files with 333 additions and 134 deletions

View File

@ -2,11 +2,12 @@
" File: autoload/ctrlp.vim " File: autoload/ctrlp.vim
" Description: Fuzzy file, buffer and MRU file finder. " Description: Fuzzy file, buffer and MRU file finder.
" Author: Kien Nguyen <github.com/kien> " Author: Kien Nguyen <github.com/kien>
" Version: 1.6.1 " Version: 1.6.2
" ============================================================================= " =============================================================================
" Static variables {{{ " Static variables {{{
fu! s:opts() fu! s:opts()
let hst = exists('+hi') ? &hi : 20
let opts = { let opts = {
\ 'g:ctrlp_by_filename': ['s:byfname', 0], \ 'g:ctrlp_by_filename': ['s:byfname', 0],
\ 'g:ctrlp_clear_cache_on_exit': ['s:clrex', 1], \ 'g:ctrlp_clear_cache_on_exit': ['s:clrex', 1],
@ -15,12 +16,14 @@ fu! s:opts()
\ 'g:ctrlp_extensions': ['s:extensions', []], \ 'g:ctrlp_extensions': ['s:extensions', []],
\ 'g:ctrlp_follow_symlinks': ['s:folsym', 0], \ 'g:ctrlp_follow_symlinks': ['s:folsym', 0],
\ 'g:ctrlp_highlight_match': ['s:mathi', [1, 'Identifier']], \ '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', 1],
\ 'g:ctrlp_match_window_bottom': ['s:mwbottom', 1], \ 'g:ctrlp_match_window_bottom': ['s:mwbottom', 1],
\ 'g:ctrlp_match_window_reversed': ['s:mwreverse', 1], \ 'g:ctrlp_match_window_reversed': ['s:mwreverse', 1],
\ 'g:ctrlp_max_depth': ['s:maxdepth', 40], \ 'g:ctrlp_max_depth': ['s:maxdepth', 40],
\ 'g:ctrlp_max_files': ['s:maxfiles', 20000], \ 'g:ctrlp_max_files': ['s:maxfiles', 20000],
\ 'g:ctrlp_max_height': ['s:mxheight', 10], \ 'g:ctrlp_max_height': ['s:mxheight', 10],
\ 'g:ctrlp_max_history': ['s:maxhst', hst],
\ 'g:ctrlp_open_multi': ['s:opmul', '1v'], \ 'g:ctrlp_open_multi': ['s:opmul', '1v'],
\ 'g:ctrlp_open_new_file': ['s:newfop', 3], \ 'g:ctrlp_open_new_file': ['s:newfop', 3],
\ 'g:ctrlp_prompt_mappings': ['s:urprtmaps', 0], \ 'g:ctrlp_prompt_mappings': ['s:urprtmaps', 0],
@ -28,16 +31,13 @@ fu! s:opts()
\ 'g:ctrlp_root_markers': ['s:rmarkers', []], \ 'g:ctrlp_root_markers': ['s:rmarkers', []],
\ 'g:ctrlp_split_window': ['s:splitwin', 0], \ 'g:ctrlp_split_window': ['s:splitwin', 0],
\ 'g:ctrlp_use_caching': ['s:caching', 1], \ 'g:ctrlp_use_caching': ['s:caching', 1],
\ 'g:ctrlp_user_command': ['s:usrcmd', ''],
\ 'g:ctrlp_working_path_mode': ['s:pathmode', 2], \ 'g:ctrlp_working_path_mode': ['s:pathmode', 2],
\ } \ }
for [ke, va] in items(opts) for [ke, va] in items(opts)
exe 'let' va[0] '=' string(exists(ke) ? eval(ke) : va[1]) '| unl!' ke exe 'let' va[0] '=' string(exists(ke) ? eval(ke) : va[1])
endfo endfo
if !exists('g:ctrlp_newcache') | let g:ctrlp_newcache = 0 | en if !exists('g:ctrlp_newcache') | let g:ctrlp_newcache = 0 | en
if !exists('g:ctrlp_user_command') | let g:ctrlp_user_command = '' | en
let s:maxhst = exists('g:ctrlp_max_history') ? g:ctrlp_max_history
\ : exists('+hi') ? &hi : 20
unl! g:ctrlp_max_history
" Note: wildignore is ignored when using ** " Note: wildignore is ignored when using **
let s:glob = s:dotfiles ? '.*\|*' : '*' let s:glob = s:dotfiles ? '.*\|*' : '*'
let s:maxdepth = min([s:maxdepth, 100]) let s:maxdepth = min([s:maxdepth, 100])
@ -53,7 +53,7 @@ let s:lash = ctrlp#utils#lash()
" Global options " Global options
let s:glbs = { 'magic': 1, 'to': 1, 'tm': 0, 'sb': 1, 'hls': 0, 'im': 0, 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', \ 'report': 9999, 'sc': 0, 'ss': 0, 'siso': 0, 'mfd': 200, 'mouse': 'n',
\ 'gcr': 'a:block-PmenuSel-blinkon0' } \ 'gcr': 'a:block-PmenuSel-blinkon0', 'ut': ( s:lazy > 1 ? s:lazy : 250 ) }
" Limiters " Limiters
let [s:compare_lim, s:nocache_lim, s:mltipats_lim] = [3000, 4000, 2000] let [s:compare_lim, s:nocache_lim, s:mltipats_lim] = [3000, 4000, 2000]
@ -62,6 +62,7 @@ let [s:compare_lim, s:nocache_lim, s:mltipats_lim] = [3000, 4000, 2000]
fu! s:Open() fu! s:Open()
let [s:cwd, s:winres] = [getcwd(), winrestcmd()] let [s:cwd, s:winres] = [getcwd(), winrestcmd()]
let [s:crfile, s:crfpath] = [expand('%:p', 1), expand('%:p:h', 1)] let [s:crfile, s:crfpath] = [expand('%:p', 1), expand('%:p:h', 1)]
let [s:crword, s:crvisual] = [expand('<cword>'), s:lastvisual()]
sil! exe s:mwbottom ? 'bo' : 'to' '1new ControlP' sil! exe s:mwbottom ? 'bo' : 'to' '1new ControlP'
let s:currwin = s:mwbottom ? winnr('#') : winnr('#') + 1 let s:currwin = s:mwbottom ? winnr('#') : winnr('#') + 1
let [s:bufnr, s:prompt] = [bufnr('%'), ['', '', '']] let [s:bufnr, s:prompt] = [bufnr('%'), ['', '', '']]
@ -89,14 +90,14 @@ fu! s:Close()
let [g:ctrlp_lines, g:ctrlp_allfiles] = [[], []] let [g:ctrlp_lines, g:ctrlp_allfiles] = [[], []]
exe s:winres exe s:winres
unl! s:focus s:hisidx s:hstgot s:marked s:statypes s:cline s:init s:savestr unl! s:focus s:hisidx s:hstgot s:marked s:statypes s:cline s:init s:savestr
\ s:crfile s:crfpath \ s:crfile s:crfpath s:crword s:crvisual g:ctrlp_nolimit
cal s:recordhist(join(s:prompt, '')) cal s:recordhist(join(s:prompt, ''))
ec ec
endf endf
"}}} "}}}
" * Clear caches {{{ " * Clear caches {{{
fu! ctrlp#clr() fu! ctrlp#clr(...)
let g:ctrlp_newcache = 1 exe 'let g:ctrlp_new'.( exists('a:1') ? a:1 : 'cache' ).' = 1'
endf endf
fu! ctrlp#clra(...) fu! ctrlp#clra(...)
@ -117,7 +118,6 @@ fu! ctrlp#reset()
cal s:opts() cal s:opts()
cal ctrlp#utils#opts() cal ctrlp#utils#opts()
cal ctrlp#mrufiles#opts() cal ctrlp#mrufiles#opts()
let s:prompt = ['', '', '']
unl! s:cline unl! s:cline
endf endf
"}}} "}}}
@ -196,7 +196,8 @@ endf "}}}
" * MatchedItems() {{{ " * MatchedItems() {{{
fu! s:MatchIt(items, pat, limit) fu! s:MatchIt(items, pat, limit)
let [items, pat, limit, newitems] = [a:items, a:pat, a:limit, []] let [items, pat, limit, newitems] = [a:items, a:pat, a:limit, []]
let mfunc = s:byfname ? 's:matchsubstr' : 'match' let mfunc = s:byfname ? 's:matchfname'
\ : s:itemtype > 2 ? 's:matchtab' : 'match'
for item in items for item in items
if call(mfunc, [item, pat]) >= 0 | cal add(newitems, item) | en if call(mfunc, [item, pat]) >= 0 | cal add(newitems, item) | en
if limit > 0 && len(newitems) >= limit | brea | en if limit > 0 && len(newitems) >= limit | brea | en
@ -209,13 +210,13 @@ fu! s:MatchedItems(items, pats, limit)
" If items is longer than s:mltipats_lim, use only the last pattern " 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 | let pats = [pats[-1]] | en
cal map(pats, 'substitute(v:val, "\\\~", "\\\\\\~", "g")') cal map(pats, 'substitute(v:val, "\\\~", "\\\\\\~", "g")')
if !s:regexp | cal map(pats, 'escape(v:val, ".")') | en
" Loop through the patterns " Loop through the patterns
for each in pats for each in pats
" If newitems is small, set it as items to search in " If newitems is small, set it as items to search in
if exists('newitems') && len(newitems) < limit if exists('newitems') && len(newitems) < limit
let items = copy(newitems) let items = copy(newitems)
en en
if !s:regexp | let each = escape(each, '.') | en
if empty(items) " End here if empty(items) " End here
retu exists('newitems') ? newitems : [] retu exists('newitems') ? newitems : []
el " Start here, go back up if have 2 or more in pats el " Start here, go back up if have 2 or more in pats
@ -246,10 +247,10 @@ fu! s:SplitPattern(str, ...) "{{{
let nitem = !empty(array) ? array[0] : '' let nitem = !empty(array) ? array[0] : ''
let newpats = [nitem] let newpats = [nitem]
if len(array) > 1 if len(array) > 1
for i in range(1, len(array) - 1) for item in range(1, len(array) - 1)
" Separator " Separator
let sep = exists('a:1') ? a:1 : '[^'.array[i-1].']\{-}' let sep = exists('a:1') ? a:1 : '[^'.array[item-1].']\{-}'
let nitem .= sep.array[i] let nitem .= sep.array[item]
cal add(newpats, nitem) cal add(newpats, nitem)
endfo endfo
en en
@ -266,11 +267,13 @@ fu! s:Render(lines, pat)
setl nocul setl nocul
cal setline(1, ' == NO MATCHES ==') cal setline(1, ' == NO MATCHES ==')
cal s:unmarksigns() cal s:unmarksigns()
if s:dohighlight() | cal clearmatches() | en
retu retu
en en
setl cul setl cul
" Sort if not MRU " Sort if not MRU
if s:itemtype != 2 || !empty(join(s:prompt, '')) if ( s:itemtype != 2 && !exists('g:ctrlp_nolimit') )
\ || !empty(join(s:prompt, ''))
let s:compat = a:pat let s:compat = a:pat
cal sort(lines, 's:mixedsort') cal sort(lines, 's:mixedsort')
unl s:compat unl s:compat
@ -285,34 +288,40 @@ fu! s:Render(lines, pat)
cal s:remarksigns() cal s:remarksigns()
if exists('s:cline') | cal cursor(s:cline, 1) | en if exists('s:cline') | cal cursor(s:cline, 1) | en
" Highlighting " Highlighting
if type(s:mathi) == 3 && len(s:mathi) == 2 && s:mathi[0] if s:dohighlight()
\ && exists('*clearmatches')
cal s:highlight(a:pat, empty(s:mathi[1]) ? 'Identifier' : s:mathi[1]) cal s:highlight(a:pat, empty(s:mathi[1]) ? 'Identifier' : s:mathi[1])
en en
endf endf
fu! s:Update(pat, ...) fu! s:Update(str)
let pat = a:pat
" Get the previous string if existed " Get the previous string if existed
let oldstr = exists('s:savestr') ? s:savestr : '' let oldstr = exists('s:savestr') ? s:savestr : ''
let pats = s:SplitPattern(pat) let pats = s:SplitPattern(a:str)
" Get the new string sans tail " Get the new string sans tail
let notail = substitute(pat, ':\([^:]\|\\:\)*$', '', 'g') let notail = substitute(a:str, ':\([^:]\|\\:\)*$', '', 'g')
" Stop if the string's unchanged " Stop if the string's unchanged
if notail == oldstr && !empty(notail) && !exists('a:1') && !exists('s:force') if notail == oldstr && !empty(notail) && !exists('s:force')
retu retu
en en
let lines = s:MatchedItems(g:ctrlp_lines, pats, s:mxheight) let lines = exists('g:ctrlp_nolimit') && empty(notail) ? copy(g:ctrlp_lines)
\ : s:MatchedItems(g:ctrlp_lines, pats, s:mxheight)
cal s:Render(lines, pats[-1]) cal s:Render(lines, pats[-1])
endf endf
fu! s:ForceUpdate()
let [estr, prt] = ['"\', copy(s:prompt)]
cal map(prt, 'escape(v:val, estr)')
cal s:Update(join(prt, ''))
endf
fu! s:BuildPrompt(upd, ...) fu! s:BuildPrompt(upd, ...)
let base = ( s:regexp ? 'r' : '>' ).( s:byfname ? 'd' : '>' ).'> ' let base = ( s:regexp ? 'r' : '>' ).( s:byfname ? 'd' : '>' ).'> '
let [estr, prt] = ['"\', copy(s:prompt)] let [estr, prt] = ['"\', copy(s:prompt)]
cal map(prt, 'escape(v:val, estr)') cal map(prt, 'escape(v:val, estr)')
let str = join(prt, '') let str = join(prt, '')
if a:upd && ( s:matches || s:regexp || match(str, '[*|]') >= 0 ) let lazy = empty(str) || exists('s:force') || !has('autocmd') ? 0 : s:lazy
sil! cal call('s:Update', exists('a:2') ? [str, a:2] : [str]) if a:upd && ( s:matches || s:regexp || match(str, '[*|]') >= 0 ) && !lazy
sil! cal s:Update(str)
en en
sil! cal s:statusline() sil! cal s:statusline()
" Toggling " Toggling
@ -364,18 +373,23 @@ endf
fu! s:PrtDeleteWord() fu! s:PrtDeleteWord()
unl! s:hstgot unl! s:hstgot
let [str, s:matches] = [s:prompt[0], 1] let [str, s:matches] = [s:prompt[0], 1]
if match(str, '\W\w\+$') >= 0 let str = match(str, '\W\w\+$') >= 0 ? matchstr(str, '^.\+\W\ze\w\+$')
let str = matchstr(str, '^.\+\W\ze\w\+$') \ : match(str, '\w\W\+$') >= 0 ? matchstr(str, '^.\+\w\ze\W\+$')
elsei match(str, '\w\W\+$') >= 0 \ : match(str, '\s\+$') >= 0 ? matchstr(str, '^.*[^ \t]\+\ze\s\+$')
let str = matchstr(str, '^.\+\w\ze\W\+$') \ : match(str, ' ') <= 0 ? '' : str
elsei match(str, '\s\+$') >= 0
let str = matchstr(str, '^.*[^ \t]\+\ze\s\+$')
elsei match(str, ' ') <= 0
let str = ''
en
let s:prompt[0] = str let s:prompt[0] = str
cal s:BuildPrompt(1) cal s:BuildPrompt(1)
endf endf
fu! s:PrtInsert(type)
unl! s:hstgot
" Insert current word, search register, last visual and clipboard
let s:prompt[0] .= a:type == 'w' ? s:crword
\ : a:type == 's' ? getreg('/')
\ : a:type == 'v' ? s:crvisual
\ : a:type == '+' ? substitute(getreg('+'), '\n', '\\n', 'g') : s:prompt[0]
cal s:BuildPrompt(1)
endf
"}}} "}}}
" Movement {{{ " Movement {{{
fu! s:PrtCurLeft() fu! s:PrtCurLeft()
@ -405,14 +419,14 @@ endf
fu! s:PrtCurEnd() fu! s:PrtCurEnd()
let prt = s:prompt let prt = s:prompt
let str = join(prt, '') let [prt[0], prt[1], prt[2]] = [join(prt, ''), '', '']
let [prt[0], prt[1], prt[2]] = [str, '', '']
cal s:BuildPrompt(0) cal s:BuildPrompt(0)
endf endf
fu! s:PrtSelectMove(dir) fu! s:PrtSelectMove(dir)
exe 'norm!' a:dir exe 'norm!' a:dir
let s:cline = line('.') let s:cline = line('.')
if line('$') > winheight(0) | cal s:BuildPrompt(0, s:Focus()) | en
endf endf
fu! s:PrtSelectJump(char, ...) fu! s:PrtSelectJump(char, ...)
@ -435,20 +449,25 @@ fu! s:PrtSelectJump(char, ...)
en en
keepj exe jmpln + 1 keepj exe jmpln + 1
let s:cline = line('.') let s:cline = line('.')
if line('$') > winheight(0) | cal s:BuildPrompt(0, s:Focus()) | en
en en
endf endf
"}}} "}}}
" Hooks {{{ " Misc {{{
fu! s:PrtClearCache() fu! s:PrtClearCache()
let s:force = 1 if s:itemtype == 1 | retu | en
if !s:itemtype if s:itemtype == 0
cal ctrlp#clr() cal ctrlp#clr()
cal s:SetLines(s:itemtype) elsei s:itemtype > 2
cal s:BuildPrompt(1) cal ctrlp#clr(s:statypes[s:itemtype][1])
elsei s:itemtype == 2
let g:ctrlp_lines = ctrlp#mrufiles#list(-1, 1)
cal s:BuildPrompt(1)
en en
if s:itemtype == 2
let g:ctrlp_lines = ctrlp#mrufiles#list(-1, 1)
el
cal s:SetLines(s:itemtype)
en
let s:force = 1
cal s:BuildPrompt(1)
unl s:force unl s:force
endf endf
@ -475,8 +494,9 @@ fu! s:PrtHistory(...)
" Limit idx within 0 and hslen " Limit idx within 0 and hslen
let idx = idx < 0 ? 0 : idx >= hslen ? hslen > 1 ? hslen - 1 : 0 : idx let idx = idx < 0 ? 0 : idx >= hslen ? hslen > 1 ? hslen - 1 : 0 : idx
let s:prompt = [hst[idx], '', ''] let s:prompt = [hst[idx], '', '']
let [s:hisidx, s:hstgot] = [idx, 1] let [s:hisidx, s:hstgot, s:force] = [idx, 1, 1]
cal s:BuildPrompt(1) cal s:BuildPrompt(1)
unl s:force
endf endf
"}}} "}}}
"}}} "}}}
@ -513,12 +533,16 @@ fu! s:MapSpecs(...)
\ 'ToggleByFname()': ['<c-d>'], \ 'ToggleByFname()': ['<c-d>'],
\ 'ToggleType(1)': ['<c-f>', '<c-up'], \ 'ToggleType(1)': ['<c-f>', '<c-up'],
\ 'ToggleType(-1)': ['<c-b>', '<c-down>'], \ 'ToggleType(-1)': ['<c-b>', '<c-down>'],
\ 'PrtInsert("w")': ['<F2>'],
\ 'PrtInsert("s")': ['<F3>'],
\ 'PrtInsert("v")': ['<F4>'],
\ 'PrtInsert("+")': ['<F6>'],
\ 'PrtCurStart()': ['<c-a>'], \ 'PrtCurStart()': ['<c-a>'],
\ 'PrtCurEnd()': ['<c-e>'], \ 'PrtCurEnd()': ['<c-e>'],
\ 'PrtCurLeft()': ['<c-h>', '<left>'], \ 'PrtCurLeft()': ['<c-h>', '<left>'],
\ 'PrtCurRight()': ['<c-l>', '<right>'], \ 'PrtCurRight()': ['<c-l>', '<right>'],
\ 'PrtClearCache()': ['<F5>'], \ 'PrtClearCache()': ['<F5>'],
\ 'PrtDeleteMRU()': ['<F8>'], \ 'PrtDeleteMRU()': ['<F7>'],
\ 'CreateNewFile()': ['<c-y>'], \ 'CreateNewFile()': ['<c-y>'],
\ 'MarkToOpen()': ['<c-z>'], \ 'MarkToOpen()': ['<c-z>'],
\ 'OpenMulti()': ['<c-o>'], \ 'OpenMulti()': ['<c-o>'],
@ -546,6 +570,10 @@ fu! s:MapSpecs(...)
\ 'PrtCurRight()', \ 'PrtCurRight()',
\ 'PrtHistory(-1)', \ 'PrtHistory(-1)',
\ 'PrtHistory(1)', \ 'PrtHistory(1)',
\ 'PrtInsert("w")',
\ 'PrtInsert("s")',
\ 'PrtInsert("v")',
\ 'PrtInsert("+")',
\ ] \ ]
for ke in prtunmaps | for kp in prtmaps[ke] for ke in prtunmaps | for kp in prtmaps[ke]
exe lcmap kp '<Nop>' exe lcmap kp '<Nop>'
@ -582,19 +610,23 @@ endf
fu! s:ToggleType(dir) fu! s:ToggleType(dir)
let ext = exists('g:ctrlp_ext_vars') ? len(g:ctrlp_ext_vars) : 0 let ext = exists('g:ctrlp_ext_vars') ? len(g:ctrlp_ext_vars) : 0
let s:itemtype = s:walker(g:ctrlp_builtins + ext, s:itemtype, a:dir) let s:itemtype = s:walker(g:ctrlp_builtins + ext, s:itemtype, a:dir)
cal s:Type(s:itemtype) let s:extid = s:itemtype - ( g:ctrlp_builtins + 1 )
endf unl! g:ctrlp_nolimit
fu! s:Type(type)
let s:itemtype = a:type
cal s:SetLines(s:itemtype) cal s:SetLines(s:itemtype)
cal s:PrtSwitcher() cal s:PrtSwitcher()
cal s:syntax() 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
cal s:syntax()
en
endf endf
fu! s:PrtSwitcher() fu! s:PrtSwitcher()
let s:matches = 1 let [s:force, s:matches] = [1, 1]
cal s:BuildPrompt(1, s:Focus(), 1) cal s:BuildPrompt(1, s:Focus())
unl s:force
endf endf
"}}} "}}}
fu! s:SetWD(...) "{{{ fu! s:SetWD(...) "{{{
@ -602,12 +634,12 @@ fu! s:SetWD(...) "{{{
if exists('a:1') && len(a:1) == 1 && !type(a:1) if exists('a:1') && len(a:1) == 1 && !type(a:1)
let pathmode = a:1 let pathmode = a:1
elsei exists('a:1') && len(a:1) > 1 && type(a:1) elsei exists('a:1') && len(a:1) > 1 && type(a:1)
cal s:setdir(a:1) | retu cal ctrlp#setdir(a:1) | retu
en en
if !exists('a:2') if !exists('a:2')
if match(s:crfile, '^\<.\+\>://.*') >= 0 || !pathmode | retu | en if match(s:crfile, '^\<.\+\>://.*') >= 0 || !pathmode | retu | en
if exists('+acd') | let [s:glb_acd, &acd] = [&acd, 0] | en if exists('+acd') | let [s:glb_acd, &acd] = [&acd, 0] | en
cal s:setdir(s:crfpath) cal ctrlp#setdir(s:crfpath)
en en
if pathmode == 1 | retu | en if pathmode == 1 | retu | en
let markers = ['root.dir','.git/','.hg/','.vimprojects','_darcs/','.bzr/'] let markers = ['root.dir','.git/','.hg/','.vimprojects','_darcs/','.bzr/']
@ -639,15 +671,9 @@ fu! ctrlp#acceptfile(mode, matchstr)
exe bufwinnr.'winc w' exe bufwinnr.'winc w'
el el
" Determine the command to use " Determine the command to use
if md == 't' || s:splitwin == 1 let cmd = md == 't' || s:splitwin == 1 ? 'tabe'
let cmd = 'tabe' \ : md == 'h' || s:splitwin == 2 ? 'new'
elsei md == 'h' || s:splitwin == 2 \ : md == 'v' || s:splitwin == 3 ? 'vne' : ctrlp#normcmd('e')
let cmd = 'new'
elsei md == 'v' || s:splitwin == 3
let cmd = 'vne'
el
let cmd = s:normcmd('e')
en
" Open new window/buffer " Open new window/buffer
cal s:openfile(cmd, filpath) cal s:openfile(cmd, filpath)
en en
@ -679,15 +705,9 @@ fu! s:CreateNewFile() "{{{
let filpath = getcwd().s:lash.optyp let filpath = getcwd().s:lash.optyp
cal s:insertcache(str) cal s:insertcache(str)
cal s:PrtExit() cal s:PrtExit()
if s:newfop == 1 let cmd = s:newfop == 1 ? 'tabe'
let cmd = 'tabe' \ : s:newfop == 2 ? 'new'
elsei s:newfop == 2 \ : s:newfop == 3 ? 'vne' : ctrlp#normcmd('e')
let cmd = 'new'
elsei s:newfop == 3
let cmd = 'vne'
el
let cmd = s:normcmd('e')
en
cal s:openfile(cmd, filpath) cal s:openfile(cmd, filpath)
en en
endf "}}} endf "}}}
@ -808,7 +828,7 @@ fu! s:mixedsort(s1, s2)
if s:itemtype < 3 && s:height < 51 if s:itemtype < 3 && s:height < 51
let par = s:comparent(a:s1, a:s2) let par = s:comparent(a:s1, a:s2)
if s:height < 21 if s:height < 21
retu 6 * cml + 3 * par + 2 * s:comptime(a:s1, a:s2) + 1 * cln retu 6 * cml + 3 * par + 2 * s:comptime(a:s1, a:s2) + cln
en en
retu 3 * cml + 2 * par + cln retu 3 * cml + 2 * par + cln
en en
@ -862,7 +882,7 @@ endf
fu! s:parentdir(curr) fu! s:parentdir(curr)
let parent = s:getparent(a:curr) let parent = s:getparent(a:curr)
if parent != a:curr | cal s:setdir(parent) | en if parent != a:curr | cal ctrlp#setdir(parent) | en
endf endf
fu! s:getparent(item) fu! s:getparent(item)
@ -899,11 +919,11 @@ endf
fu! s:findroot(curr, mark, depth, type) fu! s:findroot(curr, mark, depth, type)
let [depth, notfound] = [a:depth + 1, empty(s:glbpath(a:curr, a:mark, 1))] let [depth, notfound] = [a:depth + 1, empty(s:glbpath(a:curr, a:mark, 1))]
if !notfound || depth > s:maxdepth if !notfound || depth > s:maxdepth
if notfound | cal s:setdir(s:cwd) | en if notfound | cal ctrlp#setdir(s:cwd) | en
if a:type if a:type
let s:vcsroot = depth <= s:maxdepth ? a:curr : '' let s:vcsroot = depth <= s:maxdepth ? a:curr : ''
el el
cal s:setdir(a:curr) cal ctrlp#setdir(a:curr)
let s:foundroot = 1 let s:foundroot = 1
en en
el el
@ -916,15 +936,15 @@ fu! s:glbpath(...)
retu call('globpath', v:version > 701 ? [a:1, a:2, a:3] : [a:1, a:2]) retu call('globpath', v:version > 701 ? [a:1, a:2, a:3] : [a:1, a:2])
endf endf
fu! s:fnesc(path) fu! ctrlp#fnesc(path)
retu exists('*fnameescape') ? fnameescape(a:path) : escape(a:path, " %#*?|<\"\n") retu exists('*fnameescape') ? fnameescape(a:path) : escape(a:path, " %#*?|<\"\n")
endf endf
fu! s:setdir(path) fu! ctrlp#setdir(path)
try try
exe 'lc!' s:fnesc(a:path) exe 'lc!' ctrlp#fnesc(a:path)
cat cat
cal s:msg("Can't change working dir. Directory not exists.") cal ctrlp#msg("Can't change working dir. Directory not exists.")
endt endt
endf endf
"}}} "}}}
@ -938,7 +958,7 @@ endf
fu! s:highlight(pat, grp) fu! s:highlight(pat, grp)
cal clearmatches() cal clearmatches()
if !empty(a:pat) && a:pat != '..' if !empty(a:pat) && a:pat != '..' && s:itemtype < 3
let pat = substitute(a:pat, '\~', '\\~', 'g') let pat = substitute(a:pat, '\~', '\\~', 'g')
if !s:regexp | let pat = escape(pat, '.') | en if !s:regexp | let pat = escape(pat, '.') | en
" Match only filename " Match only filename
@ -950,6 +970,11 @@ fu! s:highlight(pat, grp)
cal matchadd('CtrlPLineMarker', '^>') cal matchadd('CtrlPLineMarker', '^>')
en en
endf endf
fu! s:dohighlight()
retu type(s:mathi) == 3 && len(s:mathi) == 2 && s:mathi[0]
\ && exists('*clearmatches')
endf
"}}} "}}}
" Prompt history {{{ " Prompt history {{{
fu! s:gethistloc() fu! s:gethistloc()
@ -1033,7 +1058,7 @@ fu! s:normbuf()
retu winnrs retu winnrs
endf endf
fu! s:normcmd(cmd) fu! ctrlp#normcmd(cmd)
if !empty(s:nosplit) && match([bufname('%'), &l:ft], s:nosplit) >= 0 if !empty(s:nosplit) && match([bufname('%'), &l:ft], s:nosplit) >= 0
retu a:cmd retu a:cmd
en en
@ -1111,20 +1136,30 @@ fu! s:specinputs()
retu 0 retu 0
endf endf
fu! s:lastvisual()
let [cview, oreg, oreg_type] = [winsaveview(), getreg('v'), getregtype('v')]
norm! gv"vy
let selected = substitute(getreg('v'), '\n', '\\n', 'g')
cal setreg('v', oreg, oreg_type)
cal winrestview(cview)
retu selected
endf
fu! s:openfile(cmd, filpath) fu! s:openfile(cmd, filpath)
let cmd = a:cmd == 'e' && &modified ? 'hid e' : a:cmd let cmd = a:cmd == 'e' && &modified ? 'hid e' : a:cmd
let tail = s:tail()
try try
exe cmd.s:tail().' '.s:fnesc(a:filpath) exe cmd.tail.' '.ctrlp#fnesc(a:filpath)
cat cat
cal s:msg("Operation can't be completed. Make sure filename is valid.") cal ctrlp#msg("Operation can't be completed. Make sure filename is valid.")
fina fina
if !empty(s:tail()) if !empty(tail)
sil! norm! zOzz sil! norm! zOzz
en en
endt endt
endf endf
fu! s:msg(msg) fu! ctrlp#msg(msg)
echoh Identifier | echon "CtrlP: ".a:msg | echoh None echoh Identifier | echon "CtrlP: ".a:msg | echoh None
endf endf
@ -1158,10 +1193,14 @@ fu! s:walker(max, pos, dir)
retu a:dir > 0 ? a:pos < a:max ? a:pos + 1 : 0 : a:pos > 0 ? a:pos - 1 : a:max retu a:dir > 0 ? a:pos < a:max ? a:pos + 1 : 0 : a:pos > 0 ? a:pos - 1 : a:max
endf endf
fu! s:matchsubstr(item, pat) fu! s:matchfname(item, pat)
retu match(split(a:item, '[\/]\ze[^\/]\+$')[-1], a:pat) retu match(split(a:item, '[\/]\ze[^\/]\+$')[-1], a:pat)
endf endf
fu! s:matchtab(item, pat)
retu match(split(a:item, '\t[^\t]\+$')[0], a:pat)
endf
fu! s:maxfiles(len) fu! s:maxfiles(len)
retu s:maxfiles && a:len > s:maxfiles ? 1 : 0 retu s:maxfiles && a:len > s:maxfiles ? 1 : 0
endf endf
@ -1184,7 +1223,7 @@ fu! s:insertcache(str)
endf endf
fu! s:lscommand() fu! s:lscommand()
let cmd = g:ctrlp_user_command let cmd = s:usrcmd
if type(cmd) == 1 if type(cmd) == 1
retu cmd retu cmd
elsei type(cmd) == 3 && len(cmd) >= 2 && !empty(cmd[0]) && !empty(cmd[1]) elsei type(cmd) == 3 && len(cmd) >= 2 && !empty(cmd[0]) && !empty(cmd[1])
@ -1232,6 +1271,9 @@ if has('autocmd') "{{{
au BufEnter ControlP cal s:checkbuf() au BufEnter ControlP cal s:checkbuf()
au BufLeave ControlP cal s:Close() au BufLeave ControlP cal s:Close()
au VimLeavePre * cal s:leavepre() au VimLeavePre * cal s:leavepre()
if s:lazy
au CursorHold ControlP cal s:ForceUpdate()
en
aug END aug END
en "}}} en "}}}

View File

@ -7,13 +7,13 @@
" Static variables {{{ " Static variables {{{
fu! ctrlp#mrufiles#opts() fu! ctrlp#mrufiles#opts()
let opts = { let opts = {
\ 'g:ctrlp_mruf_max': ['s:max', 150], \ 'g:ctrlp_mruf_max': ['s:max', 250],
\ 'g:ctrlp_mruf_include': ['s:include', ''], \ 'g:ctrlp_mruf_include': ['s:include', ''],
\ 'g:ctrlp_mruf_exclude': ['s:exclude', ''], \ 'g:ctrlp_mruf_exclude': ['s:exclude', ''],
\ 'g:ctrlp_mruf_case_sensitive': ['s:csen', 1], \ 'g:ctrlp_mruf_case_sensitive': ['s:csen', 1],
\ } \ }
for [ke, va] in items(opts) for [ke, va] in items(opts)
exe 'let' va[0] '=' string(exists(ke) ? eval(ke) : va[1]) '| unl!' ke exe 'let' va[0] '=' string(exists(ke) ? eval(ke) : va[1])
endfo endfo
endf endf
cal ctrlp#mrufiles#opts() cal ctrlp#mrufiles#opts()

View File

@ -0,0 +1,56 @@
" =============================================================================
" File: autoload/ctrlp/quickfix.vim
" Description: Quickfix extension
" Author: Kien Nguyen <github.com/kien>
" =============================================================================
" Init {{{
if exists('g:loaded_ctrlp_quickfix') && g:loaded_ctrlp_quickfix
fini
en
let g:loaded_ctrlp_quickfix = 1
let s:var_qf = ['ctrlp#quickfix#init()', 'ctrlp#quickfix#accept', 'quickfix',
\ 'qfx', [1]]
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]
let s:id = g:ctrlp_builtins + len(g:ctrlp_ext_vars)
fu! s:lineout(dict)
retu printf('%s|%d:%d| %s', bufname(a:dict['bufnr']), a:dict['lnum'],
\ a:dict['col'], matchstr(a:dict['text'], '\s*\zs.*\S'))
endf
"}}}
" Public {{{
fu! ctrlp#quickfix#init()
let g:ctrlp_nolimit = 1
sy match CtrlPqfLineCol '|\zs\d\+:\d\+\ze|'
hi def link CtrlPqfLineCol Search
retu map(getqflist(), 's:lineout(v:val)')
endf
fu! ctrlp#quickfix#accept(mode, str)
let items = matchlist(a:str, '^\([^|]\+\ze\)|\(\d\+\):\(\d\+\)|')
let [md, filpath] = [a:mode, fnamemodify(items[1], ':p')]
if empty(filpath) | retu | en
cal ctrlp#exit()
let cmd = md == 't' ? 'tabe' : md == 'h' ? 'new' : md == 'v' ? 'vne'
\ : ctrlp#normcmd('e')
let cmd = cmd == 'e' && &modified ? 'hid e' : cmd
try
exe cmd.' '.ctrlp#fnesc(filpath)
cat
cal ctrlp#msg("Invalid command or argument.")
fina
cal cursor(items[2], items[3]) | sil! norm! zOzz
endt
endf
fu! ctrlp#quickfix#id()
retu s:id
endf
"}}}
" vim:fen:fdl=0:ts=2:sw=2:sts=2

58
autoload/ctrlp/tag.vim Normal file
View File

@ -0,0 +1,58 @@
" =============================================================================
" File: autoload/ctrlp/tag.vim
" Description: Tag file extension
" Author: Kien Nguyen <github.com/kien>
" =============================================================================
" Init {{{
if exists('g:loaded_ctrlp_tag') && g:loaded_ctrlp_tag
fini
en
let [g:loaded_ctrlp_tag, g:ctrlp_newtag] = [1, 0]
let s:tag_var = ['ctrlp#tag#init()', 'ctrlp#tag#accept', 'tags', 'tag']
let g:ctrlp_ext_vars = exists('g:ctrlp_ext_vars') && !empty(g:ctrlp_ext_vars)
\ ? add(g:ctrlp_ext_vars, s:tag_var) : [s:tag_var]
let s:id = g:ctrlp_builtins + len(g:ctrlp_ext_vars)
"}}}
" Public {{{
fu! ctrlp#tag#init()
if exists('s:cwd') && s:cwd == getcwd()
let newtags = 0
el
let s:cwd = getcwd()
let newtags = 1
en
if ( newtags && !exists('g:ctrlp_alltags['''.s:cwd.''']') ) || g:ctrlp_newtag
let alltags = map(taglist('.*'), 'v:val["name"]." ".v:val["filename"]')
cal extend(g:ctrlp_alltags, { s:cwd : alltags })
let g:ctrlp_newtag = 0
en
sy match CtrlPTagFilename '\zs\t.*\ze$'
hi link CtrlPTagFilename Comment
retu g:ctrlp_alltags[s:cwd]
endf
fu! ctrlp#tag#accept(mode, str)
cal ctrlp#exit()
let md = a:mode
let cmd = md == 't' ? 'tabnew' : md == 'h' ? 'new' : md == 'v' ? 'vne'
\ : ctrlp#normcmd('ene')
let cmd = cmd == 'ene' && &modified ? 'hid ene' : cmd
try
exe cmd
cal ctrlp#setdir(s:cwd)
exe 'ta' split(a:str, '\t[^\t]\+$')[0]
cat
cal ctrlp#msg("Tag not found.")
endt
endf
fu! ctrlp#tag#id()
retu s:id
endf
"}}}
" vim:fen:fdl=0:ts=2:sw=2:sts=2

View File

@ -26,9 +26,10 @@ fu! ctrlp#utils#cachedir()
retu s:cache_dir retu s:cache_dir
endf endf
fu! ctrlp#utils#cachefile() fu! ctrlp#utils#cachefile(...)
let cache_file = substitute(getcwd(), '\([\/]\|^\a\zs:\)', '%', 'g').'.txt' let tail = exists('a:1') ? '.'.a:1 : ''
retu s:cache_dir.s:lash.cache_file let cache_file = substitute(getcwd(), '\([\/]\|^\a\zs:\)', '%', 'g').tail.'.txt'
retu exists('a:1') ? cache_file : s:cache_dir.s:lash.cache_file
endf endf
fu! ctrlp#utils#readfile(file) fu! ctrlp#utils#readfile(file)

View File

@ -1,4 +1,4 @@
*ctrlp.txt* Fuzzy file, buffer and MRU file finder. v1.6.1 *ctrlp.txt* Fuzzy file, buffer and MRU file finder. v1.6.2
*CtrlP* *ControlP* *'ctrlp'* *'ctrl-p'* *CtrlP* *ControlP* *'ctrlp'* *'ctrl-p'*
=============================================================================== ===============================================================================
# # # #
@ -18,6 +18,7 @@ CONTENTS *ctrlp-contents*
3. Commands.....................................|ctrlp-commands| 3. Commands.....................................|ctrlp-commands|
4. Mappings.....................................|ctrlp-mappings| 4. Mappings.....................................|ctrlp-mappings|
5. Input Formats................................|ctrlp-input-formats| 5. Input Formats................................|ctrlp-input-formats|
6. Extensions...................................|ctrlp-extensions|
=============================================================================== ===============================================================================
1. Intro *ctrlp-intro* 1. Intro *ctrlp-intro*
@ -27,6 +28,8 @@ Written in pure Vimscript for MacVim and Vim version 7.0+. Has full support for
Vims |regexp| as search pattern, built-in MRU monitoring, projects root Vims |regexp| as search pattern, built-in MRU monitoring, projects root
finder, and more. finder, and more.
To enable optional extensions (tag, quickfix ...), see |ctrlp-extensions|.
=============================================================================== ===============================================================================
2. Options *ctrlp-options* 2. Options *ctrlp-options*
@ -141,7 +144,7 @@ only need to keep the lines that youve changed the values (inside []): >
\ 'PrtCurLeft()': ['<c-h>', '<left>'], \ 'PrtCurLeft()': ['<c-h>', '<left>'],
\ 'PrtCurRight()': ['<c-l>', '<right>'], \ 'PrtCurRight()': ['<c-l>', '<right>'],
\ 'PrtClearCache()': ['<F5>'], \ 'PrtClearCache()': ['<F5>'],
\ 'PrtDeleteMRU()': ['<F8>'], \ 'PrtDeleteMRU()': ['<F7>'],
\ 'CreateNewFile()': ['<c-y>'], \ 'CreateNewFile()': ['<c-y>'],
\ 'MarkToOpen()': ['<c-z>'], \ 'MarkToOpen()': ['<c-z>'],
\ 'OpenMulti()': ['<c-o>'], \ 'OpenMulti()': ['<c-o>'],
@ -151,7 +154,7 @@ only need to keep the lines that youve changed the values (inside []): >
*'g:ctrlp_mruf_max'* *'g:ctrlp_mruf_max'*
Specify the number of recently opened files you want |CtrlP| to remember: > Specify the number of recently opened files you want |CtrlP| to remember: >
let g:ctrlp_mruf_max = 150 let g:ctrlp_mruf_max = 250
< <
*'g:ctrlp_mruf_exclude'* *'g:ctrlp_mruf_exclude'*
@ -194,7 +197,7 @@ this.
Other note: |wildignore| influences the result of |expand()|, |globpath()| and 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 |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). 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|. So be a little mindful of what you put in your |wildignore|.
*'g:ctrlp_highlight_match'* *'g:ctrlp_highlight_match'*
@ -215,8 +218,8 @@ The maximum depth of a directory tree to recurse into: >
Note: the larger these values, the more memory Vim uses. Note: the larger these values, the more memory Vim uses.
*'g:ctrlp_user_command'* *'g:ctrlp_user_command'*
Specify an external tool to use for listing files instead of using Vims Specify an external tool to use for listing files instead of Vims globpath().
globpath(). Use %s in place of the target directory: > Use %s in place of the target directory: >
let g:ctrlp_user_command = '' let g:ctrlp_user_command = ''
< <
Examples: > Examples: >
@ -233,7 +236,7 @@ faster when working with large projects: >
let g:ctrlp_user_command = [repo_marker, vcs_ls_command, fallback_command] 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 outside a repo. when searching outside a repo.
Examples: > Examples: >
let g:ctrlp_user_command = ['.git/', 'cd %s && git ls-files'] 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 --fullpath -I .']
@ -252,7 +255,7 @@ pressing <c-y>:
*'g:ctrlp_max_history'* *'g:ctrlp_max_history'*
The maximum number of input strings you want |CtrlP| to remember. The default The maximum number of input strings you want |CtrlP| to remember. The default
value mirrors Vims global |'history'| option. E.g. `set history=50`: > value mirrors Vims global |'history'| option: >
let g:ctrlp_max_history = &history let g:ctrlp_max_history = &history
< <
Set to 0 to disable prompts history. Set to 0 to disable prompts history.
@ -285,23 +288,32 @@ Set this to 1 to follow symbolic links when listing files: >
let g:ctrlp_follow_symlinks = 0 let g:ctrlp_follow_symlinks = 0
< <
*'g:ctrlp_lazy_update'*
Set this to 1 to enable the lazy-update feature: only update the match window
after typings been stopped for a certain amount of time: >
let g:ctrlp_lazy_update = 0
<
If is 1, update after 250ms. If bigger than 1, the number will be used as the
delay time in milliseconds.
=============================================================================== ===============================================================================
3. Commands *ctrlp-commands* 3. Commands *ctrlp-commands*
*:CtrlP* *:CtrlP*
:CtrlP [starting-directory] :CtrlP [starting-directory]
Open the |CtrlP| prompt in find file mode. Open |CtrlP| in find file mode.
If no argument is given, the value of |g:ctrlp_working_path_mode| will be If no argument is given, the value of |g:ctrlp_working_path_mode| will be
used to determine the starting directory. used to determine the starting directory.
You can use <tab> to auto-complete the [starting-directory] when typing it. You can use <tab> to auto-complete the [starting-directory] when typing it.
*:CtrlPBuffer* *:CtrlPBuffer*
:CtrlPBuffer :CtrlPBuffer
Open the |CtrlP| prompt in find buffer mode. Open |CtrlP| in find buffer mode.
*:CtrlPMRU* *:CtrlPMRU*
:CtrlPMRU :CtrlPMRU
Open the |CtrlP| prompt in find Most-Recently-Used file mode. Open |CtrlP| in find Most-Recently-Used file mode.
*:ClearCtrlPCache* *:ClearCtrlPCache*
:ClearCtrlPCache :ClearCtrlPCache
@ -333,7 +345,7 @@ The following commands ignore the current value of |g:ctrlp_working_path_mode|:
*'ctrlp-<c-p>'* *'ctrlp-<c-p>'*
<c-p> <c-p>
Default |Normal| mode mapping to open the |CtrlP| prompt. Default |Normal| mode mapping to open the |CtrlP| prompt in find file mode.
Once inside the prompt:~ Once inside the prompt:~
@ -349,12 +361,11 @@ Once inside the prompt:~
<c-f>, 'forward' <c-f>, 'forward'
<c-up> <c-up>
Scroll to the 'next' search type in the sequence. Currently file, buffer Scroll to the 'next' search mode in the sequence.
and most recently used file (MRU) are available.
<c-b>, 'backward' <c-b>, 'backward'
<c-down> <c-down>
Scroll to the 'previous' search type in the sequence. Scroll to the 'previous' search mode in the sequence.
<tab> <tab>
Toggle the focus between the match window and the prompt. Toggle the focus between the match window and the prompt.
@ -388,7 +399,7 @@ Once inside the prompt:~
Clear the input field Clear the input field
<cr> <cr>
Open selected file with the method specified with |g:ctrlp_split_window| Open selected file in the active window if possible.
<c-t> <c-t>
Open selected file in a new 'tab' Open selected file in a new 'tab'
@ -405,10 +416,10 @@ Once inside the prompt:~
Create a new file and its parent directories. Create a new file and its parent directories.
<c-n> <c-n>
'Next' string in the prompts history Next string in the prompts history
<c-p> <c-p>
'Previous' string in the prompts history Previous string in the prompts history
<c-z> <c-z>
Mark/unmark a file to be opened with <c-o>. Mark/unmark a file to be opened with <c-o>.
@ -417,11 +428,11 @@ Once inside the prompt:~
Open files marked by <c-z>. Open files marked by <c-z>.
<F5> <F5>
Refresh the match window and purge the cache for the current directory. - Refresh the match window and purge the cache for the current directory.
Or remove deleted files from MRU list. - Remove deleted files from MRU list.
<F8> <F7>
Clear the MRU list. Clear MRU list.
<esc>, <esc>,
<c-c>, <c-c>,
@ -478,30 +489,52 @@ f) Type the name of a non-existent file and press <c-y> to create it.
g) Submit ? to open this help file. g) Submit ? to open this help file.
===============================================================================
6. Extensions *ctrlp-extensions*
Extensions are optional. To enable an extension, add its name to the variable
g:ctrlp_extensions: >
let g:ctrlp_extensions = ['tag', 'qfx']
<
Available extensions:~
* Tag mode:~
- Shortname: 'tag'
- Command: ':CtrlPTag'
- Search for a tag within a generated central tags file, and jump to the
definition. Use the Vims option |'tags'| to specify the names and the
locations of the tags file(s). Example: `set tags+=tags/help,doc/tags`
* Quickfix mode:~
- Shortname: 'qfx'
- Command: ':CtrlPQuickfix'
- Search for an entry in the current quickfix errors and jump to it. If the
=============================================================================== ===============================================================================
EXTENDING *ctrlp-extending* EXTENDING *ctrlp-extending*
Extending |CtrlP| is very simple. Simply create a .vim file following a short 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. guidelines, place it in autoload/ctrlp/ and add its name to your .vimrc.
To see how it all works, get the sample.vim from the 'extensions' branch on the To see how it works, get the sample.vim from the extensions branch on the main
main git repository (https://github.com/kien/ctrlp.vim/tree/extensions), and git repository (https://github.com/kien/ctrlp.vim/tree/extensions), and place
place it (along with the parent directories) somewhere in your runtimepath. it along with the parent directories somewhere in your runtimepath. Then put
Then put this into your .vimrc: > this into your .vimrc: >
let g:ctrlp_extensions = ['sample'] let g:ctrlp_extensions = ['sample']
< <
A 4th search type will show up the next time you open |CtrlP|. A new search type will show up the next time you open |CtrlP|.
For more details, check out the comments inside sample.vim.~ For more details, check out the comments inside sample.vim.~
=============================================================================== ===============================================================================
CREDITS *ctrlp-credits* CREDITS *ctrlp-credits*
Developed by Kien Nguyen (github.com/kien), initially based on the Command-T Developed by Kien Nguyen <github.com/kien>, initially based on the Command-T
and the LustyExplorer plugins. No code was taken from these plugins, but I did 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. clone the majority of their (awesome) interfaces and the way they work.
The was originally written as a module for a would-be larger plugin called This was originally written as a module for a would-be larger plugin called
AutoDoc.vim which Ive stopped developing because of lost of interest. I really AutoDoc.vim which Ive stopped developing because of lost of interest. I really
liked the way Command-T and LustyExplorer deal with users input, so I wrote a liked the way Command-T and LustyExplorer deal with users input, so I wrote a
pure Vimscript version of their prompt window, intended to use it for the pure Vimscript version of their prompt window, intended to use it for the
@ -525,12 +558,13 @@ Special thanks:~
=============================================================================== ===============================================================================
CHANGELOG *ctrlp-changelog* CHANGELOG *ctrlp-changelog*
+ New option: |g:ctrlp_follow_symlinks| + New features: Tag and Quickfix extensions.
+ New options: |g:ctrlp_lazy_update|,
|g:ctrlp_follow_symlinks|
Before 2011/11/13~ Before 2011/11/13~
+ New special input: '/' and '\' find root (section 5.e) + New special input: '/' and '\' find root (section 5.e)
+ New mapping: <F8> clear MRU.
+ Remove ctrlp#SetWorkingPath(). + Remove ctrlp#SetWorkingPath().
+ Remove |g:ctrlp_mru_files|, make MRU permanent. + Remove |g:ctrlp_mru_files|, make MRU permanent.
+ Extend |g:ctrlp_open_multi|, add new ways to open files. + Extend |g:ctrlp_open_multi|, add new ways to open files.
@ -597,4 +631,4 @@ Before 2011/09/12~
First public release: 2011/09/06~ First public release: 2011/09/06~
=============================================================================== ===============================================================================
vim:et:ts=2:sw=2:sts=2 vim:ft=help:et:ts=2:sw=2:sts=2:norl

View File

@ -8,7 +8,7 @@
if ( exists('g:loaded_ctrlp') && g:loaded_ctrlp ) || v:version < 700 || &cp if ( exists('g:loaded_ctrlp') && g:loaded_ctrlp ) || v:version < 700 || &cp
fini fini
en en
let g:loaded_ctrlp = 1 let [g:loaded_ctrlp, g:ctrlp_lines, g:ctrlp_allfiles] = [1, [], []]
if !exists('g:ctrlp_map') | let g:ctrlp_map = '<c-p>' | en if !exists('g:ctrlp_map') | let g:ctrlp_map = '<c-p>' | en
@ -29,4 +29,12 @@ exe 'nn <silent>' g:ctrlp_map ':<c-u>CtrlP<cr>'
cal ctrlp#mrufiles#init() cal ctrlp#mrufiles#init()
let [g:ctrlp_lines, g:ctrlp_allfiles] = [[], []] 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())
en
if index(g:ctrlp_extensions, 'quickfix') >= 0
com! CtrlPQuickfix cal ctrlp#init(ctrlp#quickfix#id())
en

View File

@ -12,7 +12,7 @@ Full path fuzzy __file__, __buffer__ and __MRU__ file finder for Vim.
## Basic Usage ## Basic Usage
* Press `<c-p>` or run `:CtrlP` to invoke CtrlP in find file mode. * Press `<c-p>` or run `:CtrlP` to invoke CtrlP in find file mode.
* Or use `:CtrlPBuffer` and `:CtrlPMRU` for buffer and MRU mode. * Or run `:CtrlPBuffer` or `:CtrlPMRU` to invoke CtrlP in buffer or MRU mode.
Once CtrlP is open: Once CtrlP is open: