@@ -2,6 +2,16 @@ let s:temp_file = ""
22let s: action = " "
33let s: tbuf = 0
44
5+ let s: local_ses = ' nnn_vim_'
6+ " Add timestamp for convenience
7+ " :h strftime() -- strftime is not portable
8+ if exists (' *strftime' )
9+ let s: local_ses .= strftime (' %Y_%m_%dT%H_%M_%SZ' )
10+ else
11+ " HACK: cannot use / in a session name
12+ let s: local_ses .= substitute (tempname (), ' /' , ' _' , ' g' )
13+ endif
14+
515function ! s: statusline ()
616 setlocal statusline = % #StatusLineTerm #\ nnn\ % #StatusLineTermNC #
717endfunction
@@ -242,8 +252,8 @@ function! s:switch_back(opts, Cmd)
242252 execute win_id2win (l: term_wins .term .winhandle) . ' close'
243253 endif
244254 catch /E444: Cannot close last window/
245- " In case Vim complains it is the last window, fail silently.
246- endtry
255+ " In case Vim complains it is the last window, fail silently.
256+ endtry
247257 if bufexists (l: term_wins .term .buf )
248258 execute ' bwipeout!' l: term_wins .term .buf
249259 endif
@@ -273,6 +283,8 @@ function! s:create_term_buf(opts)
273283 endif
274284endfunction
275285
286+ let s: nnn_conf_dir = (! empty ($XDG_CONFIG_HOME ) ? $XDG_CONFIG_HOME : $HOME .' /.config' ) . ' /nnn'
287+
276288function ! s: create_on_exit_callback (opts)
277289 let l: opts = a: opts
278290 function ! s: callback (id, code, ... ) closure
@@ -283,8 +295,7 @@ function! s:create_on_exit_callback(opts)
283295
284296 call s: eval_temp_file (l: opts )
285297
286- let fdir = ! empty ($XDG_CONFIG_HOME ) ? $XDG_CONFIG_HOME : $HOME .' /.config'
287- let fname = fdir . ' /nnn/.lastd'
298+ let fname = s: nnn_conf_dir .' /.lastd'
288299 if ! empty (glob (fname))
289300 let firstline = readfile (fname)[0 ]
290301 let lastd = split (firstline, ' "' )[1 ]
@@ -342,7 +353,20 @@ function! nnn#pick(...) abort
342353 let l: default_opts = { ' edit' : ' edit' }
343354 let l: opts = extend (l: default_opts , get (a: , 2 , {}))
344355 let s: temp_file = tempname ()
345- let l: cmd = g: nnn #command .' -p ' .shellescape (s: temp_file ).' ' .(l: directory != ' ' ? shellescape (l: directory ): ' ' )
356+
357+ if g: nnn #session == # ' none' || ! get (l: opts , ' session' , 1 )
358+ let l: sess_cfg = ' '
359+ elseif g: nnn #session == # ' global'
360+ let l: sess_cfg = ' -S '
361+ elseif g: nnn #session == # ' local'
362+ let l: sess_cfg = ' -S -s ' .s: local_ses .' '
363+ let session_file = s: nnn_conf_dir .' /sessions/' .s: local_ses
364+ execute ' augroup NnnSession | autocmd! VimLeavePre * call delete(fnameescape("' .session_file.' ")) | augroup End'
365+ else
366+ let l: sess_cfg = ' '
367+ endif
368+
369+ let l: cmd = g: nnn #command .l: sess_cfg .' -p ' .shellescape (s: temp_file ).' ' .(l: directory != ' ' ? shellescape (l: directory ): ' ' )
346370 let l: layout = exists (' l:opts.layout' ) ? l: opts .layout : g: nnn #layout
347371
348372 let l: opts .layout = l: layout
0 commit comments