Come salvare e ripristinare più sessioni diverse in Vim?


367

A seconda del mio compito in Vim ho diverse schede aperte.

Come posso salvare sessioni diverse per un uso successivo?


16
@ldigas Penso che ppl si senta più a suo agio nel trovare la domanda qui (con il carattere grande, la formattazione eccezionale ...) che su un forum della vecchia scuola o una documentazione terminale, o, cielo proibito, una manpagina
puk

6
@ldigas Personalmente sono sempre stato spaventato dalle pagine man b / c che non riescono sufficientemente a stupire. Proprio come tutto il resto in Linux, ha una ripida curva di apprendimento.
puk

45
@Idigas - Penso che ti stia perdendo il punto che tra la nostra intelligenza collettiva, google e la gestione della metaknowledge dello stack overflow - questo è semplicemente un modo migliore per ottenere le tue risposte - quello che ti serve, non un lungo elenco di opzioni esoteriche, anche come questa pagina illustra l'esperienza del mondo reale delle trappole e spesso scorciatoie davvero eleganti per semplificarti la vita. Questo vale anche per quasi tutti i manuali che ho visto (tranne forse il manuale online di php). Viva stackoverflow!
ErichBSchulz,

2
@ldigas e le persone possono usarlo per riferimento futuro, poiché qualcun altro potrebbe averne bisogno.
Mansuro,

4
@idigas Penso che queste domande siano reali, nel senso che un principiante di VIM non sa molto del sistema di aiuto e di come usarlo, ma se diventano più esperti sapranno come trovare la loro strada in VIM.
Edgar Klerks,

Risposte:


494

Vuoi qualcosa di simile

:mksession ~/mysession.vim

Quindi in seguito puoi procurarti quel file vim e riavere la tua vecchia sessione:

:source ~/mysession.vim

o apri vim con l'opzione -S:

$ vim -S ~/mysession.vim

27
Ooo, e ho quasi dimenticato che puoi caricarlo di nuovo digitando: gvim -S ~ / mysession.vim
Benj

1
Grazie @ Benj. Sono nuovo in vim. Come posso 'fonte' nella riga di comando?
Jogusa

1
Ops! Scusa Benj, intendevo la modalità di comando. L'ho già trovato: ``: source ~ / mysession.vim´´.
Jogusa,

8
Breve è: così ~ / file. Se ti capita di voler rendere il file corrente un semplice: così% farà il lavoro per te.
Daniel Baulig,

14
Se non si specifica un nome di file di sessione, per impostazione predefinita scriverà e leggerà Session.vim. Quindi, se si desidera salvare solo una sessione nella directory corrente, è possibile utilizzare :mksessiono :mksda vim per salvare la sessione corrente e solo vim -Sper riaprirla.
anishpatel,

59

Potresti voler impostare queste opzioni di sessione nel tuo vimrc. Soprattutto le opzioni sono fastidiose quando hai cambiato il tuo vimrc dopo aver salvato la sessione.

set ssop-=options    " do not store global and local values in a session
set ssop-=folds      " do not store folds

1
Grande! Ho avuto esattamente questo problema ieri. Molte grazie!
Jogusa,

40

Nota che: mksession non salverà le modifiche ai file che hai apportato. Ho fatto questo errore di chiusura di VIM dopo aver salvato la sessione supponendo che riprenderò da lì. Ma la prossima volta che ho aperto la sessione, le modifiche apportate ai file erano sparite.


11
Questo dovrebbe venire con qualsiasi risposta relativa a :mksession.
Morgan Wilde,

1
sì, probabilmente vorrai seguire con un:wqa
JonnyRaa l'

11
o solo :xaun tasto in meno. Sìì!
Robin

Puoi anche impostare vim per salvare automaticamente i file (se ti piace quel genere di cose) nel tuo .vimrc: vimrc au FocusLost * silent! wa Ciò salverà automaticamente ogni volta che il buffer perde lo stato attivo.
Grego,

32

Se usi NERDTree come esploratore / trattino di file, consiglierei il plugin xolox / vim-session invece del comando incorporato: mksession. Per qualche motivo: mksession non riesce a ripristinare i buffer NERDTree. Il tuo chilometraggio può variare, ma ho pensato di condividere la mia esperienza.


Per macvim, devo garantire: let g:nerdtree_tabs_open_on_gui_startup=0e let g:nerdtree_tabs_open_on_new_tab=0far funzionare xolox / vim-session.
Nianliang,

18

Se si desidera automatizzare il processo senza utilizzare alcun plug-in, è possibile utilizzare Vai via e tornare da Vim Tips Wiki .

Ogni volta che esci da Vim, salverà la sessione corrente ~/.vim/sessionse la ricaricherà nuovamente una volta aperta Vim. Si basa anche sul tuo percorso attuale, quindi se apri Vim da directory diverse avrai sessioni diverse, il che è abbastanza utile quando lavori su progetti diversi.

Basta modificare il ~/.vimrcfile e aggiungere quanto segue:

function! MakeSession()
  let b:sessiondir = $HOME . "/.vim/sessions" . getcwd()
  if (filewritable(b:sessiondir) != 2)
    exe 'silent !mkdir -p ' b:sessiondir
    redraw!
  endif
  let b:filename = b:sessiondir . '/session.vim'
  exe "mksession! " . b:filename
endfunction

function! LoadSession()
  let b:sessiondir = $HOME . "/.vim/sessions" . getcwd()
  let b:sessionfile = b:sessiondir . "/session.vim"
  if (filereadable(b:sessionfile))
    exe 'source ' b:sessionfile
  else
    echo "No session loaded."
  endif
endfunction

" Adding automatons for when entering or leaving Vim
au VimEnter * nested :call LoadSession()
au VimLeave * :call MakeSession()

Anche per un principiante questo script è in qualche modo facile da capire e personalizzare.

Nota che questo script funziona correttamente solo per i sistemi Unix (MacOS / Linux), deve essere adattato per funzionare su Windows.


AGGIORNAMENTO: Aggiungendo il suggerimento di 0xc0de , è possibile sostituire la VimEnterriga per questi se si desidera che Vim carichi la sessione solo se non vengono forniti argomenti :

if(argc() == 0)
  au VimEnter * nested :call LoadSession()
endif

1
Potresti voler aprire la sessione solo se non viene fornito alcun argomento per vim, ad es. if argc() == 0 au VimEnter * nested :call LoadSession() end
0xc0de,

Grazie @ 0xc0de, ottimo suggerimento (ho anche iniziato a usarlo da solo). Ho aggiornato la risposta.
mathielo,

come potrei modificarlo in modo che se apro vim con argomenti non salvi anche quella sessione
Dr Manhattan,

molto bene, ma `exe 'source' b: sessionfile` ha bisogno di un punto lì? e il problema è che la sessione di caricamento automatico dipende dalla home directory corrente (get by pwd) come posso impostarla come ultima directory di lavoro prima di uscire da vim? in modo che possa caricare l'ultima sessione di lavoro anziché la sessione sotto ~/?
van abel,

Se si vuole essere in grado di avere le sessioni, ma ancora aprire i file singoli nella directory senza sovrascrivere lo check-out la mia versione modificata di questo nella risposta separata: stackoverflow.com/questions/1642611/...
PMunch

6

Esiste un plugin molto utile per questo compito vim-startify che gestisce molte altre cose come file aperti di recente ecc., Ha anche un'interfaccia molto semplice.

Lo sto usando da un paio di giorni e fino ad ora funziona perfettamente. Spero che ti aiuti.


5

Dato che questo è il primo successo su Google per me (e probabilmente altri) su come lavorare con le sessioni in Vim, ho deciso di aggiungere un po 'alla risposta di @mathielo su come renderlo automatico.

Mi piace il suo codice, ma l'aggiunta della soluzione "solo se senza args" sembra essere un po 'carente. Questa è la mia versione modificata:

function! MakeSession(overwrite)
  let b:sessiondir = $HOME . "/.vim/sessions" . getcwd()
  if (filewritable(b:sessiondir) != 2)
    exe 'silent !mkdir -p ' b:sessiondir
    redraw!
  endif
  let b:filename = b:sessiondir . '/session.vim'
  if a:overwrite == 0 && !empty(glob(b:filename))
    return
  endif
  exe "mksession! " . b:filename
endfunction

function! LoadSession()
  let b:sessiondir = $HOME . "/.vim/sessions" . getcwd()
  let b:sessionfile = b:sessiondir . "/session.vim"
  if (filereadable(b:sessionfile))
    exe 'source ' b:sessionfile
  else
    echo "No session loaded."
  endif
endfunction

" Adding automatons for when entering or leaving Vim
if(argc() == 0)
  au VimEnter * nested :call LoadSession()
  au VimLeave * :call MakeSession(1)
else
  au VimLeave * :call MakeSession(0)
endif

La notevole modifica qui è l'override opzionale. Se apri Vim senza opzioni, si aprirà qualsiasi sessione esistente e sovrascriverà le modifiche apportate alla tua partenza. Se Vim è aperto con opzioni, verrà creata una nuova sessione solo se non esiste, ciò significa che è possibile aprire singoli file in una directory che ha una sessione senza sovrascriverla. Quindi puoi aprire Vim senza opzioni per eseguire invece la sessione. Se non esiste una sessione, ne crea una nuova.


Ho appena provato la tua soluzione sopra pubblicata in Neovim 0.2.2 e ho inserito il tuo frammento, $HOME/.vim/plugin/sessions.vimma non sta salvando i file della sessione. ¯ \ _ (ツ) _ / ¯
ipatch

Questo thread, e in particolare il commento collegato, potrebbe aiutare: superuser.com/questions/404686/… L' ho nel mio .vimrc e funziona bene.
PMunch

ha funzionato, a quanto pare devo uscire da (n) vim per poter scrivere la sessione inserire uno scherzo cattivo Grazie ancora per aver condiviso ip
ipatch

3

C'è questo meraviglioso plugin chiamato vim-session . È molto potente. Per installarlo:

cd ~/.vim/bundle
git clone https://github.com/xolox/vim-session.git

Ho mappato la sua funzionalità nel mio .vimrcfile in questo modo:

nnoremap <leader>so :OpenSession 
nnoremap <leader>ss :SaveSession 
nnoremap <leader>sd :DeleteSession<CR>
nnoremap <leader>sc :CloseSession<CR>

Ora in modalità normale basta digitare <leader>sse vedrai un comando come questo

:SaveSession 

Ora aggiungi il nome della tua sessione

 :SaveSession namesession

e questo è tutto.

Quando chiudi Vim e la riapri, fallo

 :OpenSession

e vedrai la tua sessione aperta.

C'è molta altra configurazione da aggiungere nel tuo .vimrcfile, vedi la documentazione per esempi:

let g:session_directory = "~/.vim/tmp/session"  // the directory must be created before the sessions will be saved there
let g:session_autoload = "no"                   // automatic reload sessions
let g:session_autosave = "no"                   // autosave
let g:session_command_aliases = 1

C'è un buon tutorial su YouTube.


2

Personalmente ho appena finito il plugin Obsession di Tim Pope per consentire la definizione di a sessiondired evitare di digitare il percorso:

let g:sessiondir = $HOME . ".vim/sessions"

command! -nargs=1 MkSession call MkSession(<f-args>)
function! MkSession(sessionfile)
  if !isdirectory(g:sessiondir)
    call mkdir(g:sessiondir, "p")
  endif
  exe 'Obsession' g:sessiondir . '/' . a:sessionfile
endfunction

command! -nargs=1 LoadSession call LoadSession(<f-args>)
function! LoadSession(sessionfile)

  let a:sessionpath = g:sessiondir . a:sessionfile
  if (filereadable(a:sessionpath))
    exe 'source ' a:sessionpath
  else
    echo "No session loaded."
  endif
endfunction

ho avuto problemi specifici con il plugin e le sessioni Airline. Passare all'utilizzo di Obsession ha risolto i problemi, è stata una scoperta incredibile dopo settimane di difficoltà. Vedi github.com/vim-airline/vim-airline/issues/…
icc97,

1

Grazie @mathielo Seguendo l'esempio di @mathielo, ho aggiunto la riga seguente a .vimrc per salvare la sessione attiva (se presente):

au VimLeave * if this_session != "" | exe "mksession! ".this_session

Se vuoi mettere più righe, devi usare endif:

au VimLeave * if v:this_session != ""
au VimLeave *   exe "mksession! ".this_session
au VimLeave * endif

Hai solo bisogno di salvare una nuova sessione in VIM con

:mks [Session filename]

e dopo iniziare con

$ vim -S [Session filename]

vim avvierà la sessione e non dovrai preoccuparti di salvare la sessione ogni volta che chiudi vim.

Se non hai una sessione attiva .vimrc non farà nulla. Come prima.

Questo è quello che stavo cercando! Grazie ancora @mathielo!


Questo è quello che stavo anche cercando. Grande ! Non ricordo quante volte ho perso la sessione facendo :qinvece :bd... Grazie!
Joel.O

1

Se prevedi di avere solo 1 sessione per il progetto, fallo

:mks

che creerà un Session.vimfile nella directory corrente e quindi per aprire la sessione (dalla stessa directory):

vim -S

Se si modifica la sessione e si desidera salvarla:

:mks!

Questo salva la sessione, non i file stessi!

Se prevedi di avere più sessioni , preferisco salvarle in file nascosti nella directory del progetto:

:mks .session-name.vim

Per aprirlo (dalla stessa directory):

vim -S .session-name.vim

Salva sessione:

:mks! .session-name.vim

Poiché le sessioni vengono salvate in file nascosti, per visualizzarli non dimenticare -a

ls -a

0

Puoi memorizzare la sessione dove vuoi.

Ex:

:mksession! D:/session.ses

Ciò memorizza la sessione nell'unità D.

Questo può essere aperto digitando

:so D:/session.ses

in uno qualsiasi dei file vim.


0

Di seguito è l'unico conf. ha funzionato davvero per me. L'ho preso da qui , dove puoi anche prendere una versione più completa / complessa.

set viewoptions+=cursor,folds,slash,unix
set viewoptions-=options

augroup vimrc
    autocmd BufWritePost *
    \   if expand('%') != '' && &buftype !~ 'nofile'
    \|      mkview
    \|  endif
    autocmd BufRead *
    \   if expand('%') != '' && &buftype !~ 'nofile'
    \|      silent loadview
    \|  endif
augroup END

0

Per la gestione di più sessioni (su una base per directory / repository), di recente sono passato dal plug-in vim-session a vim-workspace . La gestione della sessione è relativamente semplice e funziona abbastanza bene.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.