Skip to content

Commit d2ceaeb

Browse files
authored
Merge pull request #394 from lambdalisue/fix-session
Properly restore fern on a different tab through session
2 parents 6e4b08b + d551ad6 commit d2ceaeb

File tree

4 files changed

+49
-11
lines changed

4 files changed

+49
-11
lines changed

autoload/fern/helper/sync.vim

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,18 @@ endfunction
1111

1212
let s:sync = {}
1313

14+
function! s:sync_winid() abort dict
15+
let helper = self.helper
16+
if win_id2tabwin(helper.winid) != [0, 0]
17+
return helper.winid
18+
endif
19+
" Original window has disappeared
20+
let winids = win_findbuf(helper.bufnr)
21+
let helper.winid = len(winids) is# 0 ? -1 : winids[0]
22+
return helper.winid
23+
endfunction
24+
let s:sync.winid = funcref('s:sync_winid')
25+
1426
function! s:sync_echo(message, ...) abort dict
1527
let hl = a:0 ? a:1 : 'None'
1628
try
@@ -73,14 +85,22 @@ let s:sync.get_selected_nodes = funcref('s:sync_get_selected_nodes')
7385
function! s:sync_get_cursor() abort dict
7486
let helper = self.helper
7587
let fern = helper.fern
76-
return s:WindowCursor.get_cursor(helper.winid)
88+
let winid = self.winid()
89+
if winid is# -1
90+
return [0, 0]
91+
endif
92+
return s:WindowCursor.get_cursor(winid)
7793
endfunction
7894
let s:sync.get_cursor = funcref('s:sync_get_cursor')
7995

8096
function! s:sync_set_cursor(cursor) abort dict
8197
let helper = self.helper
8298
let fern = helper.fern
83-
call s:WindowCursor.set_cursor(helper.winid, a:cursor)
99+
let winid = self.winid()
100+
if winid is# -1
101+
return
102+
endif
103+
call s:WindowCursor.set_cursor(winid, a:cursor)
84104
call setbufvar(helper.bufnr, 'fern_cursor', a:cursor)
85105
endfunction
86106
let s:sync.set_cursor = funcref('s:sync_set_cursor')

autoload/fern/internal/viewer.vim

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ function! s:init() abort
5757
autocmd! * <buffer>
5858
autocmd BufEnter <buffer> setlocal nobuflisted
5959
autocmd BufReadCmd <buffer> nested call s:BufReadCmd()
60+
autocmd Syntax <buffer> call s:Syntax()
6061
autocmd ColorScheme <buffer> call s:ColorScheme()
6162
autocmd CursorMoved,CursorMovedI,BufLeave <buffer> let b:fern_cursor = getcurpos()[1:2]
6263
augroup END
@@ -99,9 +100,6 @@ function! s:init() abort
99100

100101
" now the buffer is ready so set filetype to emit FileType
101102
setlocal filetype=fern
102-
call helper.fern.renderer.syntax()
103-
call fern#hook#emit('viewer:syntax', helper)
104-
doautocmd <nomodeline> User FernSyntax
105103
call fern#action#_init()
106104

107105
let l:Profile = fern#profile#start('fern#internal#viewer:init')
@@ -129,9 +127,6 @@ endfunction
129127
function! s:BufReadCmd() abort
130128
let helper = fern#helper#new()
131129
setlocal filetype=fern
132-
call helper.fern.renderer.syntax()
133-
call fern#hook#emit('viewer:syntax', helper)
134-
doautocmd <nomodeline> User FernSyntax
135130
setlocal modifiable
136131
call setline(1, get(b:, 'fern_viewer_cache_content', []))
137132
setlocal nomodifiable
@@ -144,6 +139,13 @@ function! s:BufReadCmd() abort
144139
\.catch({ e -> fern#logger#error(e) })
145140
endfunction
146141

142+
function! s:Syntax() abort
143+
let helper = fern#helper#new()
144+
call helper.fern.renderer.syntax()
145+
call fern#hook#emit('viewer:syntax', helper)
146+
doautocmd <nomodeline> User FernSyntax
147+
endfunction
148+
147149
function! s:ColorScheme() abort
148150
let helper = fern#helper#new()
149151
call helper.fern.renderer.highlight()

doc/fern-develop.txt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -316,11 +316,12 @@ VARIABLE *fern-develop-helper-variable*
316316

317317
*fern-develop-helper.bufnr*
318318
.bufnr
319-
A buffer number where the target fern instance binded.
319+
A buffer number where the target fern instance is associated.
320320

321321
*fern-develop-helper.winid*
322322
.winid
323-
A window number where a target fern instance binded.
323+
A window number where a target fern instance is associated.
324+
Use |fern-develop-helper.sync.winid()| to get proper value.
324325

325326
*fern-develop-helper.STATUS_NONE*
326327
*fern-develop-helper.STATUS_COLLAPSED*
@@ -335,6 +336,10 @@ SYNC METHODS *fern-develop-helper.sync*
335336

336337
Following methods are executed synchronously.
337338

339+
*fern-develop-helper.sync.winid()*
340+
.sync.winid()
341+
Return |winid| where a target fern instance is associated.
342+
338343
*fern-develop-helper.sync.echo()*
339344
.sync.echo({message})
340345
Display a temporary |String| {message}.

plugin/fern.vim

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,19 @@ function! s:BufReadCmd() abort
2525
\.catch({ e -> fern#logger#error(e) })
2626
endfunction
2727

28+
function! s:SessionLoadPost() abort
29+
let bufnr = bufnr()
30+
call s:BufReadCmd()
31+
" Re-apply required window options
32+
for winid in win_findbuf(bufnr)
33+
let [tabnr, winnr] = win_id2tabwin(winid)
34+
call settabwinvar(tabnr, winnr, '&concealcursor', 'nvic')
35+
call settabwinvar(tabnr, winnr, '&conceallevel', 2)
36+
endfor
37+
endfunction
38+
2839
augroup fern_internal
2940
autocmd! *
3041
autocmd BufReadCmd fern://* nested call s:BufReadCmd()
31-
autocmd SessionLoadPost fern://* nested call s:BufReadCmd()
42+
autocmd SessionLoadPost fern://* nested call s:SessionLoadPost()
3243
augroup END

0 commit comments

Comments
 (0)