From 9da5b08e04b3b9469a7f9d5ff0063a1c74c1231e Mon Sep 17 00:00:00 2001 From: Kien N Date: Mon, 14 Nov 2011 13:58:09 +0700 Subject: [PATCH] Add sorting by parent dir * Add a simple sorting algo giving more weight to files with same parent dir. Close #31. * Change g:ctrlp_cache_dir to accept full path. Close #32. * Fix a bug with listdirs() introduced in previous commit. --- autoload/ctrlp.vim | 42 ++++++++++++++++++++++++++++++---------- autoload/ctrlp/utils.vim | 35 +++++++++++++++------------------ doc/ctrlp.txt | 4 ++-- 3 files changed, 50 insertions(+), 31 deletions(-) diff --git a/autoload/ctrlp.vim b/autoload/ctrlp.vim index 7bd1ef8..022253b 100644 --- a/autoload/ctrlp.vim +++ b/autoload/ctrlp.vim @@ -39,9 +39,8 @@ fu! s:opts() \ : exists('+hi') ? &hi : 20 unl! g:ctrlp_max_history " Note: wildignore is ignored when using ** - let s:glob = s:dotfiles ? '.*\|*' : '*' - let s:cache_dir = exists('g:ctrlp_cache_dir') ? g:ctrlp_cache_dir : $HOME - let s:maxdepth = min([s:maxdepth, 100]) + let s:glob = s:dotfiles ? '.*\|*' : '*' + let s:maxdepth = min([s:maxdepth, 100]) let g:ctrlp_builtins = 2 if !empty(s:extensions) | for each in s:extensions exe 'ru autoload/ctrlp/'.each.'.vim' @@ -781,6 +780,17 @@ fu! s:comptime(s1, s2) retu time1 == time2 ? 0 : time1 < time2 ? 1 : -1 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 [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 + en + retu 0 +endf + fu! s:matchlens(str, pat, ...) if empty(a:pat) || index(['^','$'], a:pat) >= 0 | retu {} | en let st = exists('a:1') ? a:1 : 0 @@ -811,9 +821,13 @@ endf fu! s:mixedsort(s1, s2) let [cml, cln] = [s:compmatlen(a:s1, a:s2), s:complen(a:s1, a:s2)] - if s:itemtype =~ '0\|1\|2' && s:height < 21 - let [ctm, wrd] = [s:comptime(a:s1, a:s2), s:compword(a:s1, a:s2)] - retu 6 * cml + 3 * ctm + 2 * cln + wrd + if s:itemtype < 3 && s:height < 51 + let par = s:comparent(a:s1, a:s2) + if s:height < 21 + let [ctm, wrd] = [s:comptime(a:s1, a:s2), s:compword(a:s1, a:s2)] + retu 12 * cml + 6 * par + 3 * ctm + 2 * cln + wrd + en + retu 3 * cml + 2 * par + cln en retu 2 * cml + cln endf @@ -864,10 +878,18 @@ fu! s:dirfilter(val) endf fu! s:parentdir(curr) - let parent = substitute(a:curr, '[\/]\zs[^\/]\+[\/]\?$', '', '') + let parent = s:getparent(a:curr) if parent != a:curr | cal s:setdir(parent) | en endf +fu! s:getparent(item) + retu split(a:item, '[\/]\ze[^\/]\+[\/:]\?$')[0] +endf + +fu! s:getgrand(item) + retu split(a:item, '[\/]\ze[^\/]\+[\/][^\/]\+[\/:]\?$')[0] +endf + fu! s:createparentdirs(arr) for each in a:arr let curr = exists('curr') ? curr.s:lash.each : each @@ -877,7 +899,7 @@ fu! s:createparentdirs(arr) endf fu! s:listdirs(path, parent) - let [str, dirs] = [split(s:glbpath(a:path, '*', 1), "\n"), ''] + 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 @@ -902,7 +924,7 @@ fu! s:findroot(curr, mark, depth, type) let s:foundroot = 1 en el - let parent = substitute(a:curr, '[\/]\zs[^\/]\+[\/:]\?$', '', '') + let parent = s:getparent(a:curr) if parent != a:curr | cal s:findroot(parent, a:mark, depth, a:type) | en en endf @@ -1158,7 +1180,7 @@ fu! s:walker(max, pos, dir) endf fu! s:matchsubstr(item, pat) - retu match(split(a:item, '[\/]\ze[^\/]\+$')[-1], a:pat) + retu match(split(a:item, '[\/]\ze[^\/:]\+$')[-1], a:pat) endf fu! s:maxfiles(len) diff --git a/autoload/ctrlp/utils.vim b/autoload/ctrlp/utils.vim index 3017a59..75352ce 100644 --- a/autoload/ctrlp/utils.vim +++ b/autoload/ctrlp/utils.vim @@ -1,58 +1,55 @@ " ============================================================================= " File: autoload/ctrlp/utils.vim -" Description: Utility functions +" Description: Utilities " Author: Kien Nguyen " ============================================================================= " Static variables {{{ +fu! ctrlp#utils#lash() + retu &ssl || !exists('+ssl') ? '/' : '\' +endf +let s:lash = ctrlp#utils#lash() + fu! ctrlp#utils#opts() - let s:cache_dir = exists('g:ctrlp_cache_dir') ? g:ctrlp_cache_dir : $HOME + let s:cache_dir = exists('g:ctrlp_cache_dir') ? + \ isdirectory(g:ctrlp_cache_dir.s:lash.'.ctrlp_cache') + \ ? g:ctrlp_cache_dir.s:lash.'.ctrlp_cache' + \ : g:ctrlp_cache_dir : $HOME.s:lash.'.ctrlp_cache' endf cal ctrlp#utils#opts() "}}} " Files and Directories {{{ fu! ctrlp#utils#cachedir() - retu exists('*mkdir') ? s:cache_dir.ctrlp#utils#lash().'.ctrlp_cache' : s:cache_dir + retu s:cache_dir endf fu! ctrlp#utils#cachefile() let cache_file = substitute(getcwd(), '\([\/]\|^\a\zs:\)', '%', 'g').'.txt' - retu ctrlp#utils#cachedir().ctrlp#utils#lash().cache_file + retu s:cache_dir.s:lash.cache_file endf fu! ctrlp#utils#readfile(file) if filereadable(a:file) let data = readfile(a:file) - if empty(data) || type(data) != 3 - unl data | let data = [] - en + if empty(data) || type(data) != 3 | unl data | let data = [] | en retu data en retu [] endf fu! ctrlp#utils#mkdir(dir) - if exists('*mkdir') && !isdirectory(a:dir) - sil! cal mkdir(a:dir) - en + if exists('*mkdir') && !isdirectory(a:dir) | sil! cal mkdir(a:dir) | en endf fu! ctrlp#utils#writecache(lines, ...) - let cache_dir = exists('a:1') ? a:1 : ctrlp#utils#cachedir() + let cache_dir = exists('a:1') ? a:1 : s:cache_dir cal ctrlp#utils#mkdir(cache_dir) - " write cache if isdirectory(cache_dir) sil! cal writefile(a:lines, exists('a:2') ? a:2 : ctrlp#utils#cachefile()) - if !exists('a:1') || !exists('a:2') - let g:ctrlp_newcache = 0 - en + if !exists('a:1') || !exists('a:2') | let g:ctrlp_newcache = 0 | en en endf -fu! ctrlp#utils#lash() - retu &ssl || !exists('+ssl') ? '/' : '\' -endf - fu! ctrlp#utils#glob(...) retu call('glob', v:version > 701 ? [a:1, a:2] : [a:1]) endf diff --git a/doc/ctrlp.txt b/doc/ctrlp.txt index 63400b5..f04c27c 100644 --- a/doc/ctrlp.txt +++ b/doc/ctrlp.txt @@ -111,8 +111,8 @@ Set this to 0 to enable cross-sessions caching: > < *'g:ctrlp_cache_dir'* -Set the parent directory for the '.ctrlp_cache' directory: > - let g:ctrlp_cache_dir = $HOME +Set the directory to store the cache files: > + let g:ctrlp_cache_dir = $HOME.'/.ctrlp_cache' < *'g:ctrlp_prompt_mappings'*