|
| 1 | +function! fern#internal#command#do#command(mods, fargs) abort |
| 2 | + let winid_saved = win_getid() |
| 3 | + try |
| 4 | + let stay = fern#internal#args#pop(a:fargs, 'stay', v:false) |
| 5 | + let drawer = fern#internal#args#pop(a:fargs, 'drawer', v:false) |
| 6 | + |
| 7 | + if len(a:fargs) is# 0 |
| 8 | + \ || type(stay) isnot# v:t_bool |
| 9 | + \ || type(drawer) isnot# v:t_bool |
| 10 | + throw 'Usage: FernDo {expr...} [-drawer] [-stay]' |
| 11 | + endif |
| 12 | + |
| 13 | + " Does all options are handled? |
| 14 | + call fern#internal#args#throw_if_dirty(a:fargs) |
| 15 | + |
| 16 | + let found = fern#internal#window#find( |
| 17 | + \ funcref('s:predicator', [drawer]), |
| 18 | + \ winnr() + 1, |
| 19 | + \) |
| 20 | + if !found |
| 21 | + return |
| 22 | + endif |
| 23 | + call win_gotoid(win_getid(found)) |
| 24 | + execute join([a:mods] + a:fargs, ' ') |
| 25 | + catch |
| 26 | + echohl ErrorMsg |
| 27 | + echo v:exception |
| 28 | + echohl None |
| 29 | + call fern#logger#debug(v:exception) |
| 30 | + call fern#logger#debug(v:throwpoint) |
| 31 | + finally |
| 32 | + if stay |
| 33 | + call win_gotoid(winid_saved) |
| 34 | + endif |
| 35 | + endtry |
| 36 | +endfunction |
| 37 | + |
| 38 | +function! fern#internal#command#do#complete(arglead, cmdline, cursorpos) abort |
| 39 | + return fern#internal#complete#options(a:arglead, a:cmdline, a:cursorpos) |
| 40 | +endfunction |
| 41 | + |
| 42 | +function! s:predicator(drawer, winnr) abort |
| 43 | + let bufname = bufname(winbufnr(a:winnr)) |
| 44 | + let fri = fern#fri#parse(bufname) |
| 45 | + return fri.scheme ==# 'fern' |
| 46 | + \ && (!a:drawer || fri.authority =~# '\<drawer\>') |
| 47 | +endfunction |
0 commit comments