Vim truukjes

Image
vim teksteditor
Vim kan het onthouden

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
Topics

Reactie toevoegen