Rewrite WD related functions

* Equal priority for default root markers. Closes #241.
* Change g:ctrlp_working_path_mode's type.
This commit is contained in:
Kien N 2012-07-21 21:35:26 +07:00
parent f14014d0a7
commit 188de26f74
4 changed files with 106 additions and 88 deletions

View File

@ -83,7 +83,7 @@ let [s:pref, s:opts, s:new_opts] = ['g:ctrlp_', {
\ 'use_caching': ['s:caching', 1],
\ 'use_migemo': ['s:migemo', 0],
\ 'user_command': ['s:usrcmd', ''],
\ 'working_path_mode': ['s:pathmode', 2],
\ 'working_path_mode': ['s:pathmode', 'rc'],
\ }, {
\ 'open_multiple_files': 's:opmul',
\ 'regexp': 's:regexp',
@ -354,26 +354,25 @@ fu! s:lsCmd()
if type(cmd) == 1
retu cmd
elsei type(cmd) == 3 && len(cmd) >= 2 && cmd[:1] != ['', '']
" Find a repo root
cal s:findroot(s:dyncwd, cmd[0], 0, 1)
if !exists('s:vcsroot')
" Try the secondary_command
if s:findroot(s:dyncwd, cmd[0], 0, 1) == []
retu len(cmd) == 3 ? cmd[2] : ''
en
unl s:vcsroot
let s:vcscmd = s:lash == '\' ? 1 : 0
retu cmd[1]
elsei type(cmd) == 4 && has_key(cmd, 'types')
for key in sort(keys(cmd['types']), 's:compval')
cal s:findroot(s:dyncwd, cmd['types'][key][0], 0, 1)
if exists('s:vcsroot') | brea | en
let [markrs, cmdtypes] = [[], values(cmd['types'])]
for pair in cmdtypes
cal add(markrs, pair[0])
endfo
if !exists('s:vcsroot')
let fndroot = s:findroot(s:dyncwd, markrs, 0, 1)
if fndroot == []
retu has_key(cmd, 'fallback') ? cmd['fallback'] : ''
en
unl s:vcsroot
for pair in cmdtypes
if pair[0] == fndroot[0] | brea | en
endfo
let s:vcscmd = s:lash == '\' ? 1 : 0
retu cmd['types'][key][1]
retu pair[1]
en
endf
" - Buffers {{{1
@ -813,30 +812,26 @@ fu! s:PrtSwitcher()
unl s:force
endf
" - SetWD() {{{1
fu! s:SetWD(...)
let pathmode = s:wpmode
fu! s:SetWD(args)
let [s:crfilerel, s:dyncwd] = [fnamemodify(s:crfile, ':.'), getcwd()]
if a:0 && strlen(a:1) | if type(a:1)
cal ctrlp#setdir(a:1) | retu
el
let pathmode = a:1
en | en
if a:0 < 2
if s:crfile =~ '^.\+://' || !pathmode | retu | en
let pmode = has_key(a:args, 'mode') ? a:args['mode'] : s:wpmode
if has_key(a:args, 'dir') && a:args['dir'] != ''
cal ctrlp#setdir(a:args['dir']) | retu
en
if s:crfile =~ '^.\+://' | retu | en
if pmode =~ 'c' || ( !type(pmode) && pmode )
if exists('+acd') | let [s:glb_acd, &acd] = [&acd, 0] | en
cal ctrlp#setdir(s:crfpath)
en
if pathmode == 1 | retu | en
let markers = ['.git', '.hg', '.svn', '.bzr', '_darcs']
if type(s:rmarkers) == 3 && !empty(s:rmarkers)
cal extend(markers, s:rmarkers, 0)
let markers = reverse(filter(reverse(markers), 'count(markers, v:val) == 1'))
if pmode =~ 'r' || pmode == 2
let markers = ['.git', '.hg', '.svn', '.bzr', '_darcs']
let spath = pmode =~ 'd' ? s:dyncwd : pmode =~ 'w' ? s:cwd : s:crfpath
if type(s:rmarkers) == 3 && !empty(s:rmarkers)
if s:findroot(spath, s:rmarkers, 0, 0) != [] | retu | en
cal filter(markers, 'index(s:rmarkers, v:val) < 0')
en
cal s:findroot(spath, markers, 0, 0)
en
for marker in markers
cal s:findroot(s:dyncwd, marker, 0, 0)
if exists('s:foundroot') | brea | en
endfo
unl! s:foundroot
endf
" * AcceptSelection() {{{1
fu! ctrlp#acceptfile(mode, line, ...)
@ -883,7 +878,7 @@ fu! s:SpecInputs(str)
cal s:PrtClear()
retu 1
elsei a:str == s:lash && s:spi
cal s:SetWD(2, 0)
cal s:SetWD({ 'mode': 'rd' })
cal ctrlp#setlines()
cal s:PrtClear()
retu 1
@ -1223,7 +1218,8 @@ fu! ctrlp#progress(enum, ...)
\ : '%#CtrlPStats# '.a:enum.' %* '.txt.'%=%<%#CtrlPMode2# %{getcwd()} %*'
redraws
endf
" Paths {{{2
" *** Paths {{{2
" Line formatting {{{3
fu! s:formatline(str)
let cond = s:ispath && ( s:winw - 4 ) < s:strwidth(a:str)
retu '> '.( cond ? s:pathshorten(a:str) : a:str )
@ -1233,7 +1229,7 @@ fu! s:pathshorten(str)
retu matchstr(a:str, '^.\{9}').'...'
\ .matchstr(a:str, '.\{'.( s:winw - 16 ).'}$')
endf
" Directory completion {{{3
fu! s:dircompl(be, sd)
if a:sd == '' | retu [] | en
let [be, sd] = a:be == '' ? [s:dyncwd, a:sd] : [a:be, a:be.s:lash(a:be).a:sd]
@ -1256,7 +1252,7 @@ fu! s:findcommon(items, seed)
endfo
retu cmn
endf
" Misc {{{3
fu! s:headntail(str)
let parts = split(a:str, '[\/]\ze[^\/]\+[\/:]\?$')
retu len(parts) == 1 ? ['', parts[0]] : len(parts) == 2 ? parts : []
@ -1314,7 +1310,7 @@ fu! ctrlp#rmbasedir(items)
en
retu a:items
endf
" Working directory {{{3
fu! s:getparent(item)
let parent = substitute(a:item, '[\/][^\/]\+[\/:]\?$', '', '')
if parent == '' || parent !~ '[\/]'
@ -1324,20 +1320,34 @@ fu! s:getparent(item)
endf
fu! s:findroot(curr, mark, depth, type)
let [depth, notfound] = [a:depth + 1, empty(s:glbpath(a:curr, a:mark, 1))]
if !notfound || depth > s:maxdepth
if notfound | cal ctrlp#setdir(s:cwd) | en
if a:type && depth <= s:maxdepth
let s:vcsroot = a:curr
elsei !a:type && !notfound
cal ctrlp#setdir(a:curr) | let s:foundroot = 1
en
let [depth, fnd] = [a:depth + 1, 0]
if type(a:mark) == 1
let fnd = s:glbpath(a:curr, a:mark, 1) != ''
elsei type(a:mark) == 3
for markr in a:mark
if s:glbpath(a:curr, markr, 1) != '' | let fnd = 1 | brea | en
endfo
en
if fnd
if !a:type | cal ctrlp#setdir(a:curr) | en
retu [exists('markr') ? markr : a:mark, a:curr]
elsei depth > s:maxdepth
cal ctrlp#setdir(s:cwd)
el
let parent = s:getparent(a:curr)
if parent != a:curr | cal s:findroot(parent, a:mark, depth, a:type) | en
if parent != a:curr
retu s:findroot(parent, a:mark, depth, a:type)
en
en
retu []
endf
fu! ctrlp#setdir(path, ...)
let cmd = a:0 ? a:1 : 'lc!'
sil! exe cmd ctrlp#fnesc(a:path)
let [s:crfilerel, s:dyncwd] = [fnamemodify(s:crfile, ':.'), getcwd()]
endf
" Fallbacks {{{3
fu! s:glbpath(...)
let cond = v:version > 702 || ( v:version == 702 && has('patch051') )
retu call('globpath', cond ? a:000 : a:000[:1])
@ -1347,12 +1357,6 @@ fu! ctrlp#fnesc(path)
retu exists('*fnameescape') ? fnameescape(a:path) : escape(a:path, " %#*?|<\"\n")
endf
fu! ctrlp#setdir(path, ...)
let cmd = a:0 ? a:1 : 'lc!'
sil! exe cmd ctrlp#fnesc(a:path)
let [s:crfilerel, s:dyncwd] = [fnamemodify(s:crfile, ':.'), getcwd()]
endf
fu! ctrlp#setlcdir()
if exists('*haslocaldir')
cal ctrlp#setdir(getcwd(), haslocaldir() ? 'lc!' : 'cd!')
@ -1912,7 +1916,7 @@ fu! ctrlp#init(type, ...)
let [s:matches, s:init] = [1, 1]
cal ctrlp#reset()
noa cal s:Open()
cal s:SetWD(a:0 ? a:1 : '')
cal s:SetWD(a:0 ? a:1 : {})
cal s:MapKeys()
cal ctrlp#syntax()
cal ctrlp#setlines(s:settype(a:type))

View File

@ -160,14 +160,18 @@ Where to put the new tab page when opening one: >
*'g:ctrlp_working_path_mode'*
When starting up, CtrlP sets its local working directory according to this
variable: >
let g:ctrlp_working_path_mode = 2
let g:ctrlp_working_path_mode = 'rc'
<
1 - the directory of the current file.
2 - the nearest ancestor that contains one of these directories or files:
c - the directory of the current file.
r - the nearest ancestor that contains one of these directories or files:
.git .hg .svn .bzr _darcs
0 - don't manage working directory.
Note: you can use b:ctrlp_working_path_mode (a |b:var|) to set this option on a
per buffer basis.
{empty-string} - don't manage working directory.
Note #1: you can use b:ctrlp_working_path_mode (a |b:var|) to set this option
on a per buffer basis.
Note #2: with both 'r' and 'c' in the option, when a root isn't found, use the
directory of the current file.
*'g:ctrlp_root_markers'*
Use this to set your own root markers in addition to the default ones (.git,
@ -200,7 +204,10 @@ Set the directory to store the cache files: >
Set this to 0 if you don't want CtrlP to scan for dotfiles and dotdirs: >
let g:ctrlp_dotfiles = 1
<
You can use |'wildignore'| to exclude anything from the search.
*'ctrlp-wildignore'*
You can use Vim's |'wildignore'| to exclude files and directories from the
results.
Examples: >
" Excluding version control directories
set wildignore+=*/.git/*,*/.hg/*,*/.svn/* " Linux/MacOSX
@ -226,7 +233,7 @@ Examples: >
\ 'link': 'SOME_BAD_SYMBOLIC_LINKS',
\ }
<
Note: ignoring only works when |globpath()| is used to scan for files.
Note: ignoring only applies when |globpath()| is used to scan for files.
*'g:ctrlp_max_files'*
The maximum number of files to scan, set to 0 for no limit: >
@ -307,6 +314,7 @@ For the number:
- If given, it'll be used as the maximum number of windows or tabs to create
when opening the files (the rest will be opened as hidden buffers).
- If not given, <c-o> will open all files, each in a new window or new tab.
For the letters:
t - each file in a new tab.
h - each file in a new horizontal split.
@ -475,17 +483,19 @@ Structure of the functions: >
" | + 'h' : user pressed <c-x> (default)
" | + 'v' : user pressed <c-v> (default)
" | + 't' : user pressed <c-t> (default)
" | + 'x' : user used the <c-o> dialog (default) and chose
" | "e[x]ternal".
" | + 'x' : user used the <c-o> console dialog (default) and
" | chose "e[x]ternal".
" |
" +- a:line : The selected line.
endfunction
<
Linux example: open HTML files in the default web browser when <c-t> is pressed
and in Vim otherwise >
Note: does not apply when opening multiple files with <c-z> and <c-o>.
Example: open HTML files in the default web browser when <c-t> is pressed and
in Vim otherwise >
function! HTMLOpenFunc(action, line)
if a:action == 't' && fnamemodify(a:line, ':e') =~? '^html\?$'
if a:action =~ '^[tx]$' && fnamemodify(a:line, ':e') =~? '^html\?$'
" Get the filename
let filename = fnameescape(fnamemodify(a:line, ':p'))
@ -498,7 +508,7 @@ and in Vim otherwise >
elseif a:action == 'x' && fnamemodify(a:line, ':e') !~? '^html\?$'
" Not a HTML file, simulate pressing <c-o> again
" Not a HTML file, simulate pressing <c-o> again and wait for new input
call feedkeys("\<c-o>")
else
@ -511,7 +521,6 @@ and in Vim otherwise >
let g:ctrlp_open_func = { 'files': 'HTMLOpenFunc' }
<
Note: this option does not apply when opening multiple files with <c-z>, <c-o>.
*'g:ctrlp_status_func'*
Use this to customize the statuslines for the CtrlP window: >
@ -630,8 +639,8 @@ COMMANDS *ctrlp-commands*
*:CtrlPRoot*
:CtrlPRoot
This acts like |:CtrlP| with |g:ctrlp_working_path_mode| = 2 (ignores the
variable's current value).
This acts like |:CtrlP| with |g:ctrlp_working_path_mode| = 'rc' and ignores
the variable's current value.
*:CtrlPClearCache*
:CtrlPClearCache
@ -778,7 +787,7 @@ Pasting:~
Paste the clipboard content into the prompt.
<c-\>
Open a text dialog to paste <cword>, <cfile>, the content of the search
Open a console dialog to paste <cword>, <cfile>, the content of the search
register, the last visual selection, the clipboard or any register into the
prompt.
@ -790,8 +799,7 @@ When inside the match window (press <s-tab> to switch):~
a-z
0-9
~^-=;`',.+!@#$%&_(){}[]
Cycle through the lines with the first letter (of paths or filenames) that
matches that key.
Cycle through the lines which have the matching first character.
===============================================================================
INPUT FORMATS *ctrlp-input-formats*

View File

@ -17,10 +17,10 @@ let [g:ctrlp_lines, g:ctrlp_allfiles, g:ctrlp_alltags, g:ctrlp_alldirs,
if !exists('g:ctrlp_map') | let g:ctrlp_map = '<c-p>' | en
if !exists('g:ctrlp_cmd') | let g:ctrlp_cmd = 'CtrlP' | en
com! -n=? -com=dir CtrlP cal ctrlp#init(0, <q-args>)
com! -n=? -com=dir CtrlP cal ctrlp#init(0, { 'dir': <q-args> })
com! -n=? -com=dir CtrlPMRUFiles cal ctrlp#init(2, { 'dir': <q-args> })
com! -bar CtrlPBuffer cal ctrlp#init(1)
com! -bar CtrlPMRUFiles cal ctrlp#init(2)
com! -bar CtrlPLastMode cal ctrlp#init(-1)
com! -bar CtrlPClearCache cal ctrlp#clr()
@ -31,9 +31,9 @@ com! -bar ClearCtrlPCache cal ctrlp#clr()
com! -bar ClearAllCtrlPCaches cal ctrlp#clra()
com! -bar ResetCtrlP cal ctrlp#reset()
com! -bar CtrlPCurWD cal ctrlp#init(0, 0)
com! -bar CtrlPCurFile cal ctrlp#init(0, 1)
com! -bar CtrlPRoot cal ctrlp#init(0, 2)
com! -bar CtrlPCurWD cal ctrlp#init(0, { 'mode': '' })
com! -bar CtrlPCurFile cal ctrlp#init(0, { 'mode': 'c' })
com! -bar CtrlPRoot cal ctrlp#init(0, { 'mode': 'rc' })
if g:ctrlp_map != '' && !hasmapto(':<c-u>'.g:ctrlp_cmd.'<cr>', 'n')
exe 'nn <silent>' g:ctrlp_map ':<c-u>'.g:ctrlp_cmd.'<cr>'
@ -41,20 +41,26 @@ en
cal ctrlp#mrufiles#init()
com! -bar CtrlPTag cal ctrlp#init(ctrlp#tag#id())
com! -bar CtrlPQuickfix cal ctrlp#init(ctrlp#quickfix#id())
com! -bar CtrlPTag cal ctrlp#init(ctrlp#tag#id())
com! -bar CtrlPQuickfix cal ctrlp#init(ctrlp#quickfix#id())
com! -n=? -com=dir CtrlPDir
\ cal ctrlp#init(ctrlp#dir#id(), <q-args>)
\ cal ctrlp#init(ctrlp#dir#id(), { 'dir': <q-args> })
com! -n=? -com=buffer CtrlPBufTag
\ cal ctrlp#init(ctrlp#buffertag#cmd(0, <q-args>))
com! -bar CtrlPBufTagAll cal ctrlp#init(ctrlp#buffertag#cmd(1))
com! -bar CtrlPRTS cal ctrlp#init(ctrlp#rtscript#id())
com! -bar CtrlPUndo cal ctrlp#init(ctrlp#undo#id())
com! -bar CtrlPLine cal ctrlp#init(ctrlp#line#id())
com! -bar CtrlPBufTagAll cal ctrlp#init(ctrlp#buffertag#cmd(1))
com! -bar CtrlPRTS cal ctrlp#init(ctrlp#rtscript#id())
com! -bar CtrlPUndo cal ctrlp#init(ctrlp#undo#id())
com! -bar CtrlPLine cal ctrlp#init(ctrlp#line#id())
com! -n=? -com=buffer CtrlPChange
\ cal ctrlp#init(ctrlp#changes#cmd(0, <q-args>))
com! -bar CtrlPChangeAll cal ctrlp#init(ctrlp#changes#cmd(1))
com! -bar CtrlPMixed cal ctrlp#init(ctrlp#mixed#id())
com! -bar CtrlPBookmarkDir cal ctrlp#init(ctrlp#bookmarkdir#id())
com! -n=? -com=dir CtrlPBookmarkDirAdd
\ cal ctrlp#call('ctrlp#bookmarkdir#add', <q-args>)

View File

@ -46,12 +46,12 @@ Use `:difft` when opening multiple files to run `:difft` on the first 4 files.
* When invoked, unless a starting directory is specified, CtrlP will set its local working directory according to this variable:
```vim
let g:ctrlp_working_path_mode = 2
let g:ctrlp_working_path_mode = 'rc'
```
0 - don't manage working directory.
1 - the directory of the current file.
2 - the nearest ancestor that contains one of these directories or files:
`{empty-string}` - don't manage working directory.
`c` - the directory of the current file.
`r` - the nearest ancestor that contains one of these directories or files:
`.git` `.hg` `.svn` `.bzr` `_darcs`
Define additional root markers with the `g:ctrlp_root_markers` option.