dotfiles/nvim/.config/nvim/plugin/session.vim
Sanchayan Maity 245855e5ff
nvim: plugin/session: Do not load session if Quickfix list is loaded
This is required if we want to use git-jump or do anything with `nvim -q`.
2023-05-15 20:45:48 +05:30

68 lines
2.1 KiB
VimL

" 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
" - neovim is opened with nvim -q
if (argc(-1) > 0 || fugitive#Head() == '' || g:session_in_pager_mode == 1 || (!empty(getqflist())))
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()