Improve Open Multiple Files

Try not to open a new tab when using <c-o> to open marked files.
Option to move the match window to top of screen.
This commit is contained in:
Kien N 2011-10-09 09:30:16 +07:00
parent 000742dc0f
commit 6ee4410612
4 changed files with 48 additions and 47 deletions

View File

@ -3,7 +3,7 @@
" Description: Full path fuzzy file, buffer and MRU file finder for Vim.
" Author: Kien Nguyen <github.com/kien>
" License: MIT
" Version: 1.5.1
" Version: 1.5.2
" =============================================================================
if v:version < '700' "{{{
@ -14,6 +14,7 @@ endif "}}}
func! s:opts()
let opts = {
\ 'g:ctrlp_match_window_reversed' : ['s:mwreverse', 1],
\ 'g:ctrlp_match_window_bottom' : ['s:mwbottom', 1],
\ 'g:ctrlp_split_window' : ['s:splitwin', 0],
\ 'g:ctrlp_working_path_mode' : ['s:pathmode', 1],
\ 'g:ctrlp_root_markers' : ['s:rmarkers', []],
@ -61,9 +62,7 @@ cal s:opts()
let s:lash = ctrlp#utils#lash()
" Limiters
let s:compare_lim = 3000
let s:nocache_lim = 4000
let s:mltipats_lim = 2000
let [s:compare_lim, s:nocache_lim, s:mltipats_lim] = [3000, 4000, 2000]
"}}}
" * Clear caches {{{
@ -112,11 +111,13 @@ func! s:GlobPath(dirs, allfiles, depth)
endfunc
func! s:UserCommand(path, lscmd)
let path = a:path
if exists('+ssl') && &ssl
let ssl = &ssl
let &ssl = 0
let path = substitute(path, '/', '\', 'g')
endif
let g:ctrlp_allfiles = split(system(printf(a:lscmd, shellescape(a:path))), '\n')
let g:ctrlp_allfiles = split(system(printf(a:lscmd, shellescape(path))), '\n')
if exists('+ssl') && exists('ssl')
let &ssl = ssl
cal map(g:ctrlp_allfiles, 'substitute(v:val, "\\", "/", "g")')
@ -216,9 +217,7 @@ endfunc "}}}
" * GetMatchedItems {{{
func! s:MatchIt(items, pat, limit)
let items = a:items
let pat = a:pat
let limit = a:limit
let [items, pat, limit] = [a:items, a:pat, a:limit]
let newitems = []
for item in items
if s:byfname
@ -233,9 +232,7 @@ func! s:MatchIt(items, pat, limit)
endfunc
func! s:GetMatchedItems(items, pats, limit)
let items = a:items
let pats = a:pats
let limit = a: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
let pats = [pats[-1]]
@ -293,9 +290,10 @@ func! s:BufOpen(...) "{{{
cal s:recordhist(prt[0] . prt[1] . prt[2])
ec
else
let s:currwin = winnr()
" Open new buffer
sil! exe 'bo 1new' a:1
let pos = s:mwbottom ? 'bo' : 'to'
sil! exe pos '1new' a:1
let s:currwin = s:mwbottom ? winnr('#') : winnr('#') + 1
abc <buffer>
let s:winnr = bufwinnr('%')
let s:bufnr = bufnr('%')
@ -431,7 +429,7 @@ func! s:CreateNewFile() "{{{
let arr = split(str, '[\/]')
cal map(arr, 'escape(v:val, "%#")')
let fname = remove(arr, -1)
clo!
exe s:currwin.'winc w'
if s:newfop == 1 " In new tab
tabnew
let cmd = 'e'
@ -489,17 +487,15 @@ func! s:OpenMulti()
retu
endif
let marked = deepcopy(s:marked)
let prt = g:CtrlP_prompt
let str = prt[0] . prt[1] . prt[2]
if !has('autocmd') | cal s:BufOpen('ControlP', 'del') | endif
exe s:currwin.'winc w'
" Try not to open in new tab
let ntab = 0
let norbufs = s:normbuf()
if empty(norbufs)
let norwins = s:normbuf()
if empty(norwins)
let ntab = 1
else
for each in norbufs
for each in norwins
let bufnr = winbufnr(each)
if !empty(bufname(bufnr)) && !empty(getbufvar(bufnr, '&ft'))
\ && bufname(bufnr) != 'ControlP'
@ -507,7 +503,7 @@ func! s:OpenMulti()
endif
endfor
if !ntab
let wnr = min(norbufs)
let wnr = min(norwins)
endif
endif
if ntab | tabnew | endif
@ -653,7 +649,7 @@ func! s:PrtClearCache()
endfunc
func! s:PrtExit()
if has('autocmd') && s:currwin
if has('autocmd')
exe s:currwin.'winc w'
else
cal s:BufOpen('ControlP', 'del')
@ -810,9 +806,7 @@ func! s:FindRoot(curr, mark, depth, ...)
endif
else
let parent = substitute(a:curr, '[\/]\zs[^\/]\+[\/]\?$', '', '')
if parent != a:curr
cal s:FindRoot(parent, a:mark, depth, a:1)
endif
if parent != a:curr | cal s:FindRoot(parent, a:mark, depth, a:1) | endif
endif
endfunc
@ -836,10 +830,10 @@ func! ctrlp#SetWorkingPath(...)
if s:pathmode == 1 || l:pathmode == 1 | retu | endif
let markers = [
\ 'root.dir',
\ '.vimprojects',
\ '.git/',
\ '_darcs/',
\ '.hg/',
\ '.vimprojects',
\ '_darcs/',
\ '.bzr/',
\ ]
if exists('s:rmarkers') && type(s:rmarkers) == 3 && !empty(s:rmarkers)
@ -857,8 +851,8 @@ func! s:AcceptSelection(mode,...) "{{{
let prt = g:CtrlP_prompt
let str = prt[0] . prt[1] . prt[2]
if md == 'e' && !s:itemtype
" Walk backward the dir tree
if str == '..'
" Walk backward the dir tree
cal s:parentdir(getcwd())
cal s:SetLines(s:itemtype)
cal s:PrtClear()
@ -879,11 +873,11 @@ func! s:AcceptSelection(mode,...) "{{{
if exists('a:1') && a:1 | retu filpath | endif
" Manually remove the prompt and match window
if !has('autocmd') | cal s:BufOpen('ControlP', 'del') | endif
exe s:currwin.'winc w'
let bufnum = bufnr(filpath)
let bufwinnr = bufwinnr(bufnum)
let norbufs = s:normbuf()
let norbuf = empty(norbufs) ? 0 : norbufs[0]
exe s:currwin.'winc w'
let norwins = s:normbuf()
let norwin = empty(norwins) ? 0 : norwins[0]
" Check if the file's already opened in a tab
for nr in range(1, tabpagenr('$'))
" Get a list of the buffers in the nr tab
@ -927,11 +921,11 @@ func! s:AcceptSelection(mode,...) "{{{
elseif md == 'e' || !s:splitwin " In current window
let cmd = 'e'
" If there's at least 1 normal buffer
if norbuf
if norwin
" But not the current one
if !&l:bl || !empty(&l:bt) || !&l:ma
" Go to the first normal one
exe norbuf.'winc w'
exe norwin.'winc w'
endif
else
" No normal buffers
@ -951,8 +945,7 @@ endfunc "}}}
" Sorting {{{
func! s:complen(s1, s2)
" By length
let len1 = strlen(a:s1)
let len2 = strlen(a:s2)
let [len1, len2] = [strlen(a:s1), strlen(a:s2)]
retu len1 == len2 ? 0 : len1 > len2 ? 1 : -1
endfunc
@ -972,8 +965,7 @@ endfunc
func! s:comptime(s1, s2)
" By last modified time
let time1 = getftime(a:s1)
let time2 = getftime(a:s2)
let [time1, time2] = [getftime(a:s1), getftime(a:s2)]
retu time1 == time2 ? 0 : time1 < time2 ? 1 : -1
endfunc
@ -1049,8 +1041,7 @@ func! s:statusline(...)
endfunc
func! s:progress(len)
let cnt = '%#Function# '.a:len.' %*'
let dir = ' %=%<%#LineNr# '.getcwd().' %*'
let [cnt, dir] = ['%#Function# '.a:len.' %*', ' %=%<%#LineNr# '.getcwd().' %*']
let &l:stl = cnt.dir
redr
endfunc
@ -1205,15 +1196,15 @@ endfunc
" Buffers {{{
func! s:normbuf()
let bufs = []
let winnrs = []
for each in range(1, winnr('$'))
let bufnr = winbufnr(each)
if getbufvar(bufnr, '&bl') && empty(getbufvar(bufnr, '&bt'))
\ && getbufvar(bufnr, '&ma')
cal add(bufs, each)
cal add(winnrs, each)
endif
endfor
retu bufs
retu winnrs
endfunc
func! s:setupblank()
@ -1327,8 +1318,7 @@ endfunc
func! ctrlp#init(type, ...)
if exists('s:init') | retu | endif
let s:matches = 1
let s:init = 1
let [s:matches, s:init] = [1, 1]
let a1 = exists('a:1') ? a:1 : ''
cal ctrlp#SetWorkingPath(a1)
cal s:BufOpen('ControlP')

View File

@ -1,4 +1,4 @@
*ctrlp.txt* Full path fuzzy file, buffer and MRU file finder. v1.5.1
*ctrlp.txt* Full path fuzzy file, buffer and MRU file finder. v1.5.2
*CtrlP* *ControlP* *'ctrlp'* *'ctrl-p'*
===============================================================================
# #
@ -55,6 +55,11 @@ Set this to 1 to set full |regexp| search as the default mode: >
let g:ctrlp_regexp_search = 0
<
*'g:ctrlp_match_window_bottom'*
Set this to 0 to show the match window at the top of the screen: >
let g:ctrlp_match_window_bottom = 1
<
*'g:ctrlp_match_window_reversed'*
Reverse the sort order of the matched files in the match window. The default
setting is from bottom to top: >

View File

@ -31,5 +31,4 @@ exe 'nn <silent>' g:ctrlp_map ':<c-u>CtrlP<cr>'
if g:ctrlp_mru_files | cal ctrlp#mrufiles#init() | endif
let g:ctrlp_lines = []
let g:ctrlp_allfiles = []
let [g:ctrlp_lines, g:ctrlp_allfiles] = [[], []]

View File

@ -21,7 +21,7 @@ Once CtrlP is open:
e.g. `abc:45` will open the file matched the pattern and jump to line 45.
* Submit two dots `..` as the input string to go backward the directory tree by 1 level.
* Use `<c-y>` to create a new file and its parent dirs.
* Use `<c-z>` to mark multiple files and `<c-o>` to open them.
* Use `<c-z>` to mark/unmark files and `<c-o>` to open them.
## Basic Options
* Change the mapping to invoke CtrlP:
@ -69,6 +69,13 @@ e.g. Just have something like this in your vimrc:
set wildignore+=.git\*,.hg\*,.svn\* " for Windows
```
* Use a custom file listing command with:
```vim
let g:ctrlp_user_command = 'find %s -type f' " MacOSX/Linux
let g:ctrlp_user_command = 'dir %s /-n /b /s /a-d' " Windows
```
_Check [the docs][2] for more mappings, commands and options._
[1]: http://i.imgur.com/3rtLt.png