Allow x_func function arguments to be passed in a Dictionary
This commit is contained in:
parent
693f4d60e2
commit
e927848400
@ -472,7 +472,16 @@ fu! s:MatchedItems(items, pat, limit)
|
|||||||
let exc = exists('s:crfilerel') ? s:crfilerel : ''
|
let exc = exists('s:crfilerel') ? s:crfilerel : ''
|
||||||
let items = s:narrowable() ? s:matched + s:mdata[3] : a:items
|
let items = s:narrowable() ? s:matched + s:mdata[3] : a:items
|
||||||
if s:matcher != {}
|
if s:matcher != {}
|
||||||
let argms = [items, a:pat, a:limit, s:mmode(), s:ispath, exc, s:regexp]
|
let argms =
|
||||||
|
\ has_key(s:matcher, 'arg_type') && s:matcher['arg_type'] == 'dict' ? [{
|
||||||
|
\ 'items': items,
|
||||||
|
\ 'str': a:pat,
|
||||||
|
\ 'limit': a:limit,
|
||||||
|
\ 'mmode': s:mmode(),
|
||||||
|
\ 'ispath': s:ispath,
|
||||||
|
\ 'crfile': exc,
|
||||||
|
\ 'regex': s:regexp,
|
||||||
|
\ }] : [items, a:pat, a:limit, s:mmode(), s:ispath, exc, s:regexp]
|
||||||
let lines = call(s:matcher['match'], argms, s:matcher)
|
let lines = call(s:matcher['match'], argms, s:matcher)
|
||||||
el
|
el
|
||||||
let lines = s:MatchIt(items, a:pat, a:limit, exc)
|
let lines = s:MatchIt(items, a:pat, a:limit, exc)
|
||||||
@ -961,14 +970,21 @@ fu! s:SetWD(args)
|
|||||||
en
|
en
|
||||||
endf
|
endf
|
||||||
" * AcceptSelection() {{{1
|
" * AcceptSelection() {{{1
|
||||||
fu! ctrlp#acceptfile(mode, line, ...)
|
fu! ctrlp#acceptfile(...)
|
||||||
let [md, useb] = [a:mode, 0]
|
let useb = 0
|
||||||
if !type(a:line)
|
if a:0 == 1 && type(a:1) == 4
|
||||||
let [filpath, bufnr, useb] = [a:line, a:line, 1]
|
let [md, line] = [a:1['action'], a:1['line']]
|
||||||
|
let atl = has_key(a:1, 'tail') ? a:1['tail'] : ''
|
||||||
el
|
el
|
||||||
let filpath = fnamemodify(a:line, ':p')
|
let [md, line] = [a:1, a:2]
|
||||||
if s:nonamecond(a:line, filpath)
|
let atl = a:0 > 2 ? a:3 : ''
|
||||||
let bufnr = str2nr(matchstr(a:line, '[\/]\?\[\zs\d\+\ze\*No Name\]$'))
|
en
|
||||||
|
if !type(line)
|
||||||
|
let [filpath, bufnr, useb] = [line, line, 1]
|
||||||
|
el
|
||||||
|
let filpath = fnamemodify(line, ':p')
|
||||||
|
if s:nonamecond(line, filpath)
|
||||||
|
let bufnr = str2nr(matchstr(line, '[\/]\?\[\zs\d\+\ze\*No Name\]$'))
|
||||||
let [filpath, useb] = [bufnr, 1]
|
let [filpath, useb] = [bufnr, 1]
|
||||||
el
|
el
|
||||||
let bufnr = bufnr('^'.filpath.'$')
|
let bufnr = bufnr('^'.filpath.'$')
|
||||||
@ -976,7 +992,7 @@ fu! ctrlp#acceptfile(mode, line, ...)
|
|||||||
en
|
en
|
||||||
cal s:PrtExit()
|
cal s:PrtExit()
|
||||||
let tail = s:tail()
|
let tail = s:tail()
|
||||||
let j2l = a:0 ? a:1 : matchstr(tail, '^ +\zs\d\+$')
|
let j2l = atl != '' ? atl : matchstr(tail, '^ +\zs\d\+$')
|
||||||
if ( s:jmptobuf =~ md || ( s:jmptobuf && md =~ '[et]' ) ) && bufnr > 0
|
if ( s:jmptobuf =~ md || ( s:jmptobuf && md =~ '[et]' ) ) && bufnr > 0
|
||||||
\ && !( md == 'e' && bufnr == bufnr('%') )
|
\ && !( md == 'e' && bufnr == bufnr('%') )
|
||||||
let [jmpb, bufwinnr] = [1, bufwinnr(bufnr)]
|
let [jmpb, bufwinnr] = [1, bufwinnr(bufnr)]
|
||||||
@ -1004,7 +1020,7 @@ fu! ctrlp#acceptfile(mode, line, ...)
|
|||||||
" Reset &switchbuf option
|
" Reset &switchbuf option
|
||||||
let [swb, &swb] = [&swb, '']
|
let [swb, &swb] = [&swb, '']
|
||||||
" Open new window/buffer
|
" Open new window/buffer
|
||||||
let [fid, tail] = [( useb ? bufnr : filpath ), ( a:0 ? ' +'.a:1 : tail )]
|
let [fid, tail] = [( useb ? bufnr : filpath ), ( atl != '' ? ' +'.atl : tail )]
|
||||||
let args = [cmd, fid, tail, 1, [useb, j2l]]
|
let args = [cmd, fid, tail, 1, [useb, j2l]]
|
||||||
cal call('s:openfile', args)
|
cal call('s:openfile', args)
|
||||||
let &swb = swb
|
let &swb = swb
|
||||||
@ -1035,24 +1051,34 @@ fu! s:SpecInputs(str)
|
|||||||
retu 0
|
retu 0
|
||||||
endf
|
endf
|
||||||
|
|
||||||
fu! s:AcceptSelection(mode)
|
fu! s:AcceptSelection(action)
|
||||||
if a:mode != 'e' && s:OpenMulti(a:mode) != -1 | retu | en
|
let [md, icr] = [a:action[0], match(a:action, 'r') >= 0]
|
||||||
|
let subm = icr || ( !icr && md == 'e' )
|
||||||
|
if !subm && s:OpenMulti(md) != -1 | retu | en
|
||||||
let str = s:getinput()
|
let str = s:getinput()
|
||||||
if a:mode == 'e' | if s:SpecInputs(str) | retu | en | en
|
if subm | if s:SpecInputs(str) | retu | en | en
|
||||||
" Get the selected line
|
" Get the selected line
|
||||||
let line = ctrlp#getcline()
|
let line = ctrlp#getcline()
|
||||||
if a:mode != 'e' && !s:itemtype && line == ''
|
if !subm && !s:itemtype && line == '' && line('.') > s:offset
|
||||||
\ && str !~ '\v^(\.\.([\/]\.\.)*[\/]?[.\/]*|/|\\|\?|\@.+)$'
|
\ && str !~ '\v^(\.\.([\/]\.\.)*[\/]?[.\/]*|/|\\|\?|\@.+)$'
|
||||||
cal s:CreateNewFile(a:mode) | retu
|
cal s:CreateNewFile(md) | retu
|
||||||
en
|
en
|
||||||
if empty(line) | retu | en
|
if empty(line) | retu | en
|
||||||
" Do something with it
|
" Do something with it
|
||||||
if s:openfunc != {} && has_key(s:openfunc, s:ctype)
|
if s:openfunc != {} && has_key(s:openfunc, s:ctype)
|
||||||
let actfunc = s:openfunc[s:ctype]
|
let actfunc = s:openfunc[s:ctype]
|
||||||
|
let type = has_key(s:openfunc, 'arg_type') ? s:openfunc['arg_type'] : 'list'
|
||||||
el
|
el
|
||||||
let actfunc = s:itemtype < 3 ? 'ctrlp#acceptfile' : s:getextvar('accept')
|
if s:itemtype < 3
|
||||||
|
let [actfunc, type] = ['ctrlp#acceptfile', 'dict']
|
||||||
|
el
|
||||||
|
let [actfunc, exttype] = [s:getextvar('accept'), s:getextvar('act_farg')]
|
||||||
|
let type = exttype == 'dict' ? exttype : 'list'
|
||||||
|
en
|
||||||
en
|
en
|
||||||
cal call(actfunc, [a:mode, line])
|
let actargs = type == 'dict' ? [{ 'action': md, 'line': line, 'icr': icr }]
|
||||||
|
\ : [md, line]
|
||||||
|
cal call(actfunc, actargs)
|
||||||
endf
|
endf
|
||||||
" - CreateNewFile() {{{1
|
" - CreateNewFile() {{{1
|
||||||
fu! s:CreateNewFile(...)
|
fu! s:CreateNewFile(...)
|
||||||
@ -1211,7 +1237,10 @@ fu! s:OpenNoMarks(md, line)
|
|||||||
cal s:remarksigns()
|
cal s:remarksigns()
|
||||||
cal s:BuildPrompt(0)
|
cal s:BuildPrompt(0)
|
||||||
elsei a:md == 'x'
|
elsei a:md == 'x'
|
||||||
cal call(s:openfunc[s:ctype], [a:md, a:line], s:openfunc)
|
let type = has_key(s:openfunc, 'arg_type') ? s:openfunc['arg_type'] : 'dict'
|
||||||
|
let argms = type == 'dict' ? [{ 'action': a:md, 'line': a:line }]
|
||||||
|
\ : [a:md, a:line]
|
||||||
|
cal call(s:openfunc[s:ctype], argms, s:openfunc)
|
||||||
elsei a:md == 'd'
|
elsei a:md == 'd'
|
||||||
let dir = fnamemodify(a:line, ':h')
|
let dir = fnamemodify(a:line, ':h')
|
||||||
if isdirectory(dir)
|
if isdirectory(dir)
|
||||||
@ -1352,8 +1381,17 @@ fu! ctrlp#statusline()
|
|||||||
let marked = s:opmul != '0' ?
|
let marked = s:opmul != '0' ?
|
||||||
\ exists('s:marked') ? ' <'.s:dismrk().'>' : ' <->' : ''
|
\ exists('s:marked') ? ' <'.s:dismrk().'>' : ' <->' : ''
|
||||||
if s:status != {}
|
if s:status != {}
|
||||||
let args = [focus, byfname, s:regexp, prv, s:ctype, nxt, marked]
|
let argms =
|
||||||
let &l:stl = call(s:status['main'], args, s:status)
|
\ has_key(s:status, 'arg_type') && s:status['arg_type'] == 'dict' ? [{
|
||||||
|
\ 'focus': focus,
|
||||||
|
\ 'byfname': byfname,
|
||||||
|
\ 'regex': s:regexp,
|
||||||
|
\ 'prev': prv,
|
||||||
|
\ 'item': s:ctype,
|
||||||
|
\ 'next': nxt,
|
||||||
|
\ 'marked': marked,
|
||||||
|
\ }] : [focus, byfname, s:regexp, prv, s:ctype, nxt, marked]
|
||||||
|
let &l:stl = call(s:status['main'], argms, s:status)
|
||||||
el
|
el
|
||||||
let item = '%#CtrlPMode1# '.s:ctype.' %*'
|
let item = '%#CtrlPMode1# '.s:ctype.' %*'
|
||||||
let focus = '%#CtrlPMode2# '.focus.' %*'
|
let focus = '%#CtrlPMode2# '.focus.' %*'
|
||||||
@ -1373,8 +1411,13 @@ endf
|
|||||||
fu! ctrlp#progress(enum, ...)
|
fu! ctrlp#progress(enum, ...)
|
||||||
if has('macunix') || has('mac') | sl 1m | en
|
if has('macunix') || has('mac') | sl 1m | en
|
||||||
let txt = a:0 ? '(press ctrl-c to abort)' : ''
|
let txt = a:0 ? '(press ctrl-c to abort)' : ''
|
||||||
let &l:stl = s:status != {} ? call(s:status['prog'], [a:enum], s:status)
|
if s:status != {}
|
||||||
\ : '%#CtrlPStats# '.a:enum.' %* '.txt.'%=%<%#CtrlPMode2# %{getcwd()} %*'
|
let argms = has_key(s:status, 'arg_type') && s:status['arg_type'] == 'dict'
|
||||||
|
\ ? [{ 'str': a:enum }] : [a:enum]
|
||||||
|
let &l:stl = call(s:status['prog'], argms, s:status)
|
||||||
|
el
|
||||||
|
let &l:stl = '%#CtrlPStats# '.a:enum.' %* '.txt.'%=%<%#CtrlPMode2# %{getcwd()} %*'
|
||||||
|
en
|
||||||
redraws
|
redraws
|
||||||
endf
|
endf
|
||||||
" *** Paths {{{2
|
" *** Paths {{{2
|
||||||
@ -2178,6 +2221,10 @@ endf
|
|||||||
fu! ctrlp#call(func, ...)
|
fu! ctrlp#call(func, ...)
|
||||||
retu call(a:func, a:000)
|
retu call(a:func, a:000)
|
||||||
endf
|
endf
|
||||||
|
|
||||||
|
fu! ctrlp#getvar(var)
|
||||||
|
retu {a:var}
|
||||||
|
endf
|
||||||
"}}}1
|
"}}}1
|
||||||
" * Initialization {{{1
|
" * Initialization {{{1
|
||||||
fu! ctrlp#setlines(...)
|
fu! ctrlp#setlines(...)
|
||||||
|
@ -743,6 +743,27 @@ Structure of the function: >
|
|||||||
endfunction
|
endfunction
|
||||||
<
|
<
|
||||||
|
|
||||||
|
Note: you can extend any of the above options with { 'arg_type': 'dict' } to
|
||||||
|
enable passing all the function arguments in a single Dictionary argument. Use
|
||||||
|
the existing argument names as keys in this Dictionary.
|
||||||
|
|
||||||
|
Example: >
|
||||||
|
let g:ctrlp_status_func = {
|
||||||
|
\ 'arg_type' : 'dict',
|
||||||
|
\ 'enter': 'Function_Name_1',
|
||||||
|
\ 'exit': 'Function_Name_2',
|
||||||
|
\ }
|
||||||
|
|
||||||
|
function! Function_Name_1(dict)
|
||||||
|
" where dict == {
|
||||||
|
" \ 'focus': value,
|
||||||
|
" \ 'byfname': value,
|
||||||
|
" \ 'regex': value,
|
||||||
|
" \ ...
|
||||||
|
" }
|
||||||
|
endfunction
|
||||||
|
<
|
||||||
|
|
||||||
===============================================================================
|
===============================================================================
|
||||||
COMMANDS *ctrlp-commands*
|
COMMANDS *ctrlp-commands*
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user