nvim: plugin: Add a simple session management plugin
This commit is contained in:
parent
7271c9b030
commit
eafc975e35
1 changed files with 66 additions and 0 deletions
66
nvim/.config/nvim/plugin/session.vim
Normal file
66
nvim/.config/nvim/plugin/session.vim
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
" Session management which does exactly what we want. No Telescope non-sense.
|
||||||
|
" Saves session with a fixed name to a fixed path. We do not allow creating
|
||||||
|
" sessions in non Git repositories. Automatically loads a session if one is
|
||||||
|
" available for the current directory. Exposes SessionSave command for creating
|
||||||
|
" a session.
|
||||||
|
|
||||||
|
let g:session_in_pager_mode = 0
|
||||||
|
let g:session_loaded = 0
|
||||||
|
|
||||||
|
function! s:SessionFile()
|
||||||
|
let session_name = join(split(getcwd(), '/'), '\%') . ".vim"
|
||||||
|
let session_path = expand('~/.vim/session/')
|
||||||
|
let session_file = session_path . '\%'. session_name
|
||||||
|
return session_file
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:SessionCreate()
|
||||||
|
if (fugitive#Head() == '')
|
||||||
|
echo "Will not create session in a non Git repository"
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
let session_file = s:SessionFile()
|
||||||
|
silent execute ':mksession! ' . session_file
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:SessionLoad()
|
||||||
|
" Do not load session if
|
||||||
|
" - neovim is started with arguments
|
||||||
|
" - neovim is opened outside a git repository
|
||||||
|
" - neovim is in pager mode and is getting input from STDIN
|
||||||
|
if (argc(-1) > 0 || fugitive#Head() == '' || g:session_in_pager_mode == 1)
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
let session_file = s:SessionFile()
|
||||||
|
if (!empty(glob(session_file)))
|
||||||
|
silent execute ':source' . session_file
|
||||||
|
" We noticed a case where session was loaded, so argc() had to be 0
|
||||||
|
" but after session load, argc() returned 1. Use a global variable to
|
||||||
|
" track if session was loaded. The save path will check this and save
|
||||||
|
" only if a session was loaded in the first place.
|
||||||
|
let g:session_loaded = 1
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:SessionSave()
|
||||||
|
" Do not save a session which was not loaded in the first place.
|
||||||
|
if (g:session_loaded == 1)
|
||||||
|
let session_file = s:SessionFile()
|
||||||
|
silent execute ':mksession! ' . session_file
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
augroup Session
|
||||||
|
autocmd!
|
||||||
|
autocmd VimEnter * nested call s:SessionLoad()
|
||||||
|
autocmd VimLeavePre * call s:SessionSave()
|
||||||
|
augroup END
|
||||||
|
|
||||||
|
augroup StdIn
|
||||||
|
autocmd!
|
||||||
|
autocmd StdinReadPre * let g:session_in_pager_mode = 1
|
||||||
|
augroup END
|
||||||
|
|
||||||
|
command SessionSave :call s:SessionCreate()
|
Loading…
Reference in a new issue