Permalink
Browse files

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.
  • Loading branch information...
1 parent 000742d commit 6ee4410612bff4c8480272a44a3c33922aa6cbdc @kien committed Oct 9, 2011
Showing with 48 additions and 47 deletions.
  1. +33 −43 autoload/ctrlp.vim
  2. +6 −1 doc/ctrlp.txt
  3. +1 −2 plugin/ctrlp.vim
  4. +8 −1 readme.md
View
@@ -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,25 +487,23 @@ 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'
let ntab = 1
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
@@ -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
@@ -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
@@ -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

0 comments on commit 6ee4410

Please sign in to comment.