Skip to content

Commit 0e862fc

Browse files
authored
Merge pull request #124 from lambdalisue/lazy-badge
Prepare for fern-plugin-xxxxx
2 parents f3a8d53 + 2be9ff5 commit 0e862fc

File tree

10 files changed

+80
-22
lines changed

10 files changed

+80
-22
lines changed

autoload/fern/helper/async.vim

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ function! s:async_redraw() abort dict
2323
\ )
2424
\})
2525
\.then({ v -> fern#internal#buffer#replace(helper.bufnr, v) })
26+
\.then({ -> fern#hook#emit('viewer:redraw', helper) })
2627
\.finally({ -> Profile() })
2728
endfunction
2829
let s:async.redraw = funcref('s:async_redraw')

autoload/fern/internal/core.vim

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,10 @@ function! fern#internal#core#new(url, provider, ...) abort
1414
\ 'comparator': g:fern#comparator,
1515
\}, a:0 ? a:1 : {},
1616
\)
17+
let scheme = fern#fri#parse(a:url).scheme
1718
let root = fern#internal#node#root(a:url, a:provider)
1819
let fern = {
20+
\ 'scheme': scheme,
1921
\ 'source': s:CancellationTokenSource.new(),
2022
\ 'provider': a:provider,
2123
\ 'renderer': s:get_renderer(options.renderer),

autoload/fern/internal/viewer.vim

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,9 @@ endfunction
104104

105105
function! s:BufReadCmd() abort
106106
let helper = fern#helper#new()
107+
setlocal filetype=fern
107108
call helper.fern.renderer.syntax()
109+
call fern#hook#emit('renderer:syntax', helper)
108110
let root = helper.sync.get_root_node()
109111
let cursor = get(b:, 'fern_cursor', getcurpos())
110112
call s:Promise.resolve()
@@ -119,4 +121,5 @@ endfunction
119121
function! s:ColorScheme() abort
120122
let helper = fern#helper#new()
121123
call helper.fern.renderer.highlight()
124+
call fern#hook#emit('renderer:highlight', helper)
122125
endfunction

autoload/vital/_fern/Async/CancellationTokenSource.vim

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,5 +82,5 @@ function! s:_unlink(source) abort
8282
endfunction
8383

8484
function! s:_throw(exception) abort
85-
throw a:exception
85+
throw substitute(a:exception, '^Vim(.*):', '', '')
8686
endfunction

autoload/vital/_fern/Async/Promise/Process.vim

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,5 +92,5 @@ endfunction
9292

9393
function! s:_on_cancel(ns, ...) abort
9494
call a:ns.job.stop()
95-
call a:ns.reject(s:CancellationToken.CancellationError)
95+
call a:ns.reject(s:CancellationToken.CancelledError)
9696
endfunction

autoload/vital/fern.vim

Lines changed: 38 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ function! s:_import(name) abort dict
149149
call module._vital_created(module)
150150
endif
151151
let export_module = filter(copy(module), 'v:key =~# "^\\a"')
152-
" Cache module before calling module.vital_loaded() to avoid cyclic
152+
" Cache module before calling module._vital_loaded() to avoid cyclic
153153
" dependences but remove the cache if module._vital_loaded() fails.
154154
" let s:loaded[a:name] = export_module
155155
let s:loaded[a:name] = export_module
@@ -167,30 +167,51 @@ let s:Vital._import = function('s:_import')
167167

168168
function! s:_format_throwpoint(throwpoint) abort
169169
let funcs = []
170-
let stack = matchstr(a:throwpoint, '^function \zs.*\ze, line \d\+$')
170+
let stack = matchstr(a:throwpoint, '^function \zs.*, .\{-} \d\+$')
171171
for line in split(stack, '\.\.')
172-
let m = matchlist(line, '^\%(<SNR>\(\d\+\)_\)\?\(.\+\)\[\(\d\+\)\]$')
173-
if empty(m)
174-
call add(funcs, line)
175-
continue
176-
endif
177-
let [sid, name, lnum] = m[1:3]
178-
let attr = ''
179-
if !empty(sid)
180-
let name = printf('<SNR>%d_%s', sid, name)
172+
let m = matchlist(line, '^\(.\+\)\%(\[\(\d\+\)\]\|, .\{-} \(\d\+\)\)$')
173+
if !empty(m)
174+
let [name, lnum, lnum2] = m[1:3]
175+
if empty(lnum)
176+
let lnum = lnum2
177+
endif
178+
let info = s:_get_func_info(name)
179+
if !empty(info)
180+
let attrs = empty(info.attrs) ? '' : join([''] + info.attrs)
181+
let flnum = info.lnum == 0 ? '' : printf(' Line:%d', info.lnum + lnum)
182+
call add(funcs, printf('function %s(...)%s Line:%d (%s%s)',
183+
\ info.funcname, attrs, lnum, info.filename, flnum))
184+
continue
185+
endif
181186
endif
182-
let file = s:_get_file_by_func_name(name)
183-
call add(funcs, printf('function %s(...)%s Line:%d (%s)', name, attr, lnum, file))
187+
" fallback when function information cannot be detected
188+
call add(funcs, line)
184189
endfor
185190
return join(funcs, "\n")
186191
endfunction
187192

188-
function! s:_get_file_by_func_name(name) abort
189-
let body = execute(printf('verbose function %s', a:name))
193+
function! s:_get_func_info(name) abort
194+
let name = a:name
195+
if a:name =~# '^\d\+$' " is anonymous-function
196+
let name = printf('{%s}', a:name)
197+
elseif a:name =~# '^<lambda>\d\+$' " is lambda-function
198+
let name = printf("{'%s'}", a:name)
199+
endif
200+
if !exists('*' . name)
201+
return {}
202+
endif
203+
let body = execute(printf('verbose function %s', name))
190204
let lines = split(body, "\n")
191205
let signature = matchstr(lines[0], '^\s*\zs.*')
192-
let file = matchstr(lines[1], '^\t\%(Last set from\|.\{-}:\)\s*\zs.*$')
193-
return substitute(file, '[/\\]\+', '/', 'g')
206+
let [_, file, lnum; __] = matchlist(lines[1],
207+
\ '^\t\%(Last set from\|.\{-}:\)\s*\zs\(.\{-}\)\%( \S\+ \(\d\+\)\)\?$')
208+
return {
209+
\ 'filename': substitute(file, '[/\\]\+', '/', 'g'),
210+
\ 'lnum': 0 + lnum,
211+
\ 'funcname': a:name,
212+
\ 'arguments': split(matchstr(signature, '(\zs.*\ze)'), '\s*,\s*'),
213+
\ 'attrs': filter(['dict', 'abort', 'range', 'closure'], 'signature =~# (").*" . v:val)'),
214+
\ }
194215
endfunction
195216

196217
" s:_get_module() returns module object wihch has all script local functions.

autoload/vital/fern.vital

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
fern
2-
8043f4d0f577ffb654cab9cfe629312b36c5342d
2+
80887bd366c925887a40829eae73e86d7bb63ecc
33

44
App.Spinner
55
Async.CancellationTokenSource

doc/fern-develop.txt

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ RENDERER |fern-develop-renderer|
1515
SCHEME |fern-develop-scheme|
1616
PROVIDER |fern-develop-scheme-provider|
1717
MAPPING |fern-develop-scheme-provider|
18+
HOOK |fern-develop-hook|
1819
HELPER |fern-develop-helper|
1920
LOGGER |fern-develop-logger|
2021
UTILITY |fern-develop-utility|
@@ -303,6 +304,7 @@ VARIABLE *fern-develop-helper-variable*
303304
.fern
304305
A fern instance which has the following attributes:
305306

307+
"scheme" A scheme name used to determine "provider"
306308
"source" A cancellation token source to cancel requests
307309
"provider" A provider instance for the fren tree
308310
"renderer" A renderer instance to sort nodes
@@ -500,6 +502,29 @@ Following methods are executed asynchronously and return a promise.
500502
It is used to collapse modified nodes to solve issue #103.
501503

502504

505+
=============================================================================
506+
HOOK *fern-develop-hook*
507+
508+
Following hook will be emitted by |fern#hook#emit()| from fern itself.
509+
510+
"renderer:syntax" ({helper})
511+
Called when fern renderer has register its syntax.
512+
The {helper} is a helper instance described in |fern-develop-helper|.
513+
514+
"renderer:highlight" ({helper})
515+
Called when fern renderer has register its highlight.
516+
The {helper} is a helper instance described in |fern-develop-helper|.
517+
518+
"viewer:redraw" ({helper})
519+
Called when fern viewer has redrawed.
520+
The {helper} is a helper instance described in |fern-develop-helper|.
521+
522+
"viewer:ready" ({helper})
523+
Called when fern viewer has ready, mean that the buffer has opened and
524+
all content has rendererd.
525+
The {helper} is a helper instance described in |fern-develop-helper|.
526+
527+
503528
=============================================================================
504529
LOGGER *fern-develop-logger*
505530

plugin/fern.vim

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
if exists('g:fern_loaded')
1+
if exists('g:loaded_fern')
22
finish
33
endif
4-
let g:fern_loaded = 1
4+
let g:loaded_fern = 1
5+
let g:fern_loaded = 1 " Obsolete: For backward compatibility
56

67
command! -bar -nargs=*
78
\ -complete=customlist,fern#internal#command#fern#complete
@@ -30,4 +31,8 @@ augroup fern_internal
3031
autocmd! *
3132
autocmd BufReadCmd fern://* ++nested call s:BufReadCmd()
3233
autocmd SessionLoadPost fern://* ++nested call s:BufReadCmd()
34+
autocmd User FernInit ++once :
3335
augroup END
36+
37+
" Tell 3rd parties that fern has initialized
38+
doautocmd <nomodeline> User FernInit

test/fern/internal/core.vimspec

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ Describe fern#internal#core
99
Describe #new()
1010
It returns a fern instance of given url and provider
1111
let fern = fern#internal#core#new('debug:///', provider)
12+
Assert KeyExists(fern, 'scheme')
1213
Assert KeyExists(fern, 'source')
1314
Assert KeyExists(fern, 'provider')
1415
Assert KeyExists(fern, 'comparator')

0 commit comments

Comments
 (0)