
Je start vim vanuit de map ~/dev/project1 en van daaruit open je vervolgens een rits bestanden in verschillende buffers. Op een gegeven moment sluit je vim weer af.
Op een ander moment open je vim vanuit de map ~/documenten, bewerk je een aantal teksten en sluit je vim weer af.
Nu ga je weer naar de ~/dev/project1 map en opent vim. Voila! Alle bestanden waar je mee bezig was worden geopend.
Het is een instelling in mijn ~/vimrc bestand waar ik veel gemak van heb. Lees verder en kijk hoe je een lijst van geopende bestanden voor iedere directory vanwaaruit je vim start wegschrijft bij het sluiten van vim en weer inleest bij het opstarten.
Allereerst definieren leggen we de locatie en de naamgeving van de bestanden vast:
let g:MyVimDir=$HOME . '/.vim' let g:my_vim_session = g:MyVimDir . '/sessions/' . join(split(getcwd(), "/"),".")
of in nvim (neovim)
let g:MyVimDir=$HOME . '/.local/share/nvim' let g:my_vim_session = g:MyVimDir . '/sessions/' . join(split(getcwd(), "/"),".")
Bij het opstarten van vim in ~/dev/project1 wordt join(split(getcwd(),"/",".") aangeroepen waardoor in het pad van de directory de slashes worden vervangen door punten. Er vanuit gaande dat ~ verwijst naar /home/gemenegronden, de home directory van user gemenegronden, krijgt de variabele my_vim_sessions krijgt de volgende waarde:
/home/gemenegronden/.vim/sessions/home.gemenegronden.dev.project1
Maar hoe gebruiken we deze variable om de sessie op te slaan? Hiervoor schrijven we een SaveSess() functie die gebruik maakt van het interne vim commando :mksession (:mks).
function! SaveSession() let mySessionsDir = expand(g:MyVimDir . '/sessions') call system('mkdir ' . g:MyVimDir) call system('mkdir ' . mySessionsDir) execute 'mksession! ' . g:my_vim_session endfunction
Eerst worden de benodigde directories aangemaakt voor het geval die nog niet bestaan waarna met mksession het bestand wordt weggeschreven
Bij het opstarten moet de sessie weer worden geladen. Daarvoor is de functie RestoreSession().
function! RestoreSession() let file = expand(g:my_vim_session) if filereadable(file) execute 'source ' . g:my_vim_session endif endfunction
Indien het pad die in my_vim_session is opgeslagen wijst naar een leesbaar bestand wordt dit geladen met het commando execute 'source'
Nu moeten de beide functies nog worden aangeroepen. SaveSession() bij het opstarten en RestoreSession() bij het afsluiten van vim. Hiervoor gebruiken we de autocmd plugin die bij normale vim versies (maar niet bij tinyvim) standaard aanwezig is. VimEnter en VimLeave doen hier de aanroep naar de fucties. Merk op dat RestoreSession alleen wordt aangeroepen als er geen argumenten worden meegegeven aan vim (bijvoorbeeld vim .bashrc).
if has("autocmd") autocmd BufWritePost .vimrc source $MYVIMRC autocmd VimEnter * if !argc() | call RestoreSession() | endif autocmd VimLeave * call SaveSession() endif
De regel BufWritePost .vimrc source $MYVIMRC heeft niets met deze procedure van doen maar is zeker ook interessant. Alle code hier beschreven staat in dit .vimrc bestand. Het is het configuratiebestand voor vim. Wanneer het bestand wordt opgeslagen draagt deze regel er zorg voor dat vim opnieuw wordt geladen met de nieuwe instellingen.
Undo history onthouden
if has('persistent_undo') let myUndoDir = expand(g:MyVimDir . '/undodir') " Create dirs call system('mkdir ' . g:MyVimDir) call system('mkdir ' . myUndoDir) let &undodir = myUndoDir set undofile endif