Vim Tips Wiki
Register
Advertisement

Daily I need to switch between different git projects. This script automatically saves vim sessions per git directory.

Usage

  • Starting vim with no filename argument in a git directory will load a previously stored session if one exists.
  • Exiting vim (with no filename argument given at invocation) in a git directory will store the current session.
  • Starting vim with a filename argument doesn't restore nor save a session.

Caveats

  • $HOME/.vim/sessions must exist.

Script

function! FindProjectName()
    let s:name = getcwd()
    if !isdirectory(".git")
        let s:name = substitute(finddir(".git", ".;"), "/.git", "", "")
    end

    if s:name != ""
        let s:name = matchstr(s:name, ".*", strridx(s:name, "/") + 1)
    end

    return s:name
endfunction

" Sessions only restored if we start vim without args.
function! RestoreSession(name)
    if a:name != ""
        if filereadable($HOME . "/.vim/sessions/" . a:name)
            execute 'source ' . $HOME . "/.vim/sessions/" . a:name
        end
    end
endfunction

" Sessions only saved if we start vim without args.
function! SaveSession(name)
    if a:name != ""
        execute 'mksession! ' . $HOME . '/.vim/sessions/' . a:name
    end
endfunction

"
" Restore and save sessions.
"
if argc() == 0
    autocmd VimEnter * call RestoreSession(FindProjectName())
    autocmd VimLeave * call SaveSession(FindProjectName())
end
Advertisement