diff --git a/nvim/.config/nvim/plugin/session.vim b/nvim/.config/nvim/plugin/session.vim new file mode 100644 index 0000000..bc5c509 --- /dev/null +++ b/nvim/.config/nvim/plugin/session.vim @@ -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()