Browse files

Custom ignore and default command options

* Extend jump-to-open-buffer to use <c-t> 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.
  • Loading branch information...
1 parent 0bd17c4 commit 64dca5ec7961cbd4a5a7da460890e70ae8716db4 @kien committed Dec 18, 2011
Showing with 146 additions and 109 deletions.
  1. +107 −91 autoload/ctrlp.vim
  2. +10 −2 autoload/ctrlp/dir.vim
  3. +25 −13 doc/ctrlp.txt
  4. +4 −3 plugin/ctrlp.vim
View
198 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)')
View
12 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
View
38 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 = '<c-p>'
<
+ *'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.
View
7 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 = '<c-p>' | en
+if !exists('g:ctrlp_cmd') | let g:ctrlp_cmd = 'CtrlP' | en
com! -na=? -comp=custom,ctrlp#cpl CtrlP cal ctrlp#init(0, <q-args>)
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 <silent>' g:ctrlp_map ':<c-u>CtrlP<cr>'
+exe 'nn <silent>' g:ctrlp_map ':<c-u>'.g:ctrlp_cmd.'<cr>'
cal ctrlp#mrufiles#init()

0 comments on commit 64dca5e

Please sign in to comment.