Comment enregistrer et restaurer plusieurs sessions différentes dans Vim?

Selon ma tâche dans Vim, plusieurs tabs sont ouverts.

Comment puis-je enregistrer différentes sessions pour une utilisation ultérieure?

    Vous voulez quelque chose comme

     :mksession ~/mysession.vim 

    Ensuite, vous pouvez vous procurer ce fichier vim et récupérer votre ancienne session:

     :source ~/mysession.vim 

    ou ouvrez vim avec l’option -S:

     $ vim -S ~/mysession.vim 

    Vous voudrez peut-être définir ces options de session dans votre vimrc. Les options sont particulièrement ennuyeuses lorsque vous avez modifié votre vimrc après avoir enregistré la session.

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

    Notez que: mksession n’enregistre pas les modifications apscopes aux fichiers que vous avez créés. J’ai commis cette erreur en fermant vim après avoir sauvegardé la session en supposant que je reprendrai à partir de là. Mais la prochaine fois que j’ai ouvert la session, les modifications apscopes aux fichiers avaient disparu.

    Si vous utilisez NERDTree comme explorateur de fichiers / tableau de bord, je vous recommande le plug-in xolox / vim-session au lieu de la commande intégrée: mksession. Pour une raison quelconque: mksession ne parvient pas à restaurer les tampons NERDTree. Votre kilométrage peut varier, mais j’ai pensé partager mon expérience.

    Si vous souhaitez automatiser le processus sans utiliser de plug-ins, vous pouvez utiliser Go away et revenir de Wiki Wiki Conseils .

    Chaque fois que vous quittez Vim, la session en cours sera sauvegardée sous ~/.vim/sessions et ~/.vim/sessions une fois que Vim est ouvert. Il est également basé sur votre chemin actuel, donc si vous ouvrez Vim à partir de différents répertoires, vous aurez différentes sessions, ce qui est très utile lorsque vous travaillez sur différents projets.

    ~/.vimrc simplement votre fichier ~/.vimrc et ajoutez ce qui suit:

     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() 

    Même pour un débutant, ce script est assez facile à comprendre et à personnaliser.

    Veuillez noter que ce script ne fonctionnera correctement que pour les systèmes Unix (MacOS / Linux), il doit être adapté pour fonctionner sous Windows.


    UPDATE: En ajoutant la suggestion de 0xc0de , vous pouvez remplacer la ligne VimEnter pour celles-ci si vous voulez que Vim charge la session uniquement si aucun argument n’est fourni :

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

    Il y a un plugin très utile pour cette tâche vim-startify qui gère beaucoup d’autres choses comme les fichiers récemment ouverts, etc., il a aussi une interface très simple.

    Je l’utilise depuis quelques jours et jusqu’à maintenant, il fonctionne parfaitement. J’espère que ça vous aide.

    Il y a ce merveilleux plugin appel vim-session . C’est très puissant. Pour l’installer:

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

    J’ai mappé ses fonctionnalités dans mon fichier .vimrc comme ceci:

     nnoremap so :OpenSession nnoremap ss :SaveSession nnoremap sd :DeleteSession nnoremap sc :CloseSession 

    Maintenant, en mode normal, tapez simplement ss et vous verrez une commande comme celle-ci

     :SaveSession 

    Maintenant, ajoutez le nom de votre session

      :SaveSession namesession 

    et c’est tout.

    Lorsque vous fermez Vim et que vous le rouvrez, faites-le simplement

      :OpenSession 

    et vous verrez votre session ouverte.

    Il y a beaucoup d’autres configurations à append dans votre fichier .vimrc , voir la documentation pour des exemples:

     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 

    Il existe un bon tutoriel sur YouTube.

    Comme il s’agit du premier hit sur Google pour moi (et probablement pour d’autres) sur la façon de travailler avec des sessions dans Vim, j’ai décidé d’append un peu à la réponse de @ mathielo sur la manière de rendre cela automatique.

    J’aime son code, mais l’ajout de la solution “seulement si sans args” semblait faire défaut. Ceci est ma version modifiée:

     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 

    Le changement notable ici est le remplacement facultatif. Si vous ouvrez Vim sans options, toutes les sessions existantes seront écrasées et les modifications apscopes à votre départ seront écrasées. Si Vim est ouvert avec des options, il ne créera une nouvelle session que si aucune n’existe, cela signifie que vous pouvez ouvrir des fichiers uniques dans un répertoire qui a une session sans la remplacer. Ensuite, vous pouvez ouvrir Vim sans options pour exécuter la session à la place. S’il n’y a pas de session, il en crée une nouvelle.

    Merci @mathielo Suivant l’exemple de @mathielo, j’ai ajouté la ligne ci-dessous à .vimrc pour enregistrer la session active (le cas échéant):

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

    Si vous voulez mettre plus de lignes, vous devez utiliser endif:

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

    Il vous suffit de sauvegarder une nouvelle session dans vim avec

     :mks [Session filename] 

    et après avoir commencé

     $ vim -S [Session filename] 

    vim démarre la session et vous n’avez pas à vous soucier de sauvegarder la session chaque fois que vous fermez vim.

    Si vous n’avez pas de session active, .vimrc ne fera rien. Comme avant.

    C’est ce que je cherchais! Merci encore @mathielo!

    Personnellement, je passe juste en sessiondir plugin Obsession de Tim Pope pour permettre de définir un sessiondir et éviter de taper le chemin:

     let g:sessiondir = $HOME . ".vim/sessions" command! -nargs=1 MkSession call MkSession() 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() 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 

    Vous pouvez stocker la session où vous voulez.

    Ex:

     :mksession! D:/session.ses 

    Cela stocke la session dans le lecteur D.

    Cela peut être ouvert en tapant

     :so D:/session.ses 

    dans l’un des fichiers vim.

    Ci-dessous la seule conf. ça a vraiment fonctionné pour moi. Je l’ai pris à partir d’ ici , où vous pouvez également prendre une version plus complète / complexe.

     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 

    Si vous prévoyez d’avoir une seule session pour le projet, faites-le

     :mks 

    qui va créer un fichier Session.vim dans le répertoire en cours, puis ouvrir la session (à partir du même répertoire):

     vim -S 

    Si vous modifiez la session et souhaitez l’enregistrer:

     :mks! 

    Cela enregistre la session, pas les fichiers eux-mêmes!

    Si vous prévoyez d’avoir plusieurs sessions , je préfère les enregistrer dans des fichiers cachés dans le répertoire du projet:

     :mks .session-name.vim 

    Pour l’ouvrir (du même répertoire):

     vim -S .session-name.vim 

    Sauvegarder la session:

     :mks! .session-name.vim 

    Comme les sessions sont enregistrées dans des fichiers cachés, pour les afficher, n’oubliez pas -a

     ls -a 

    Pour gérer plusieurs sessions (par répertoire / référentiel), je suis récemment passé du plug-in vim-session à vim-workspace . Sa gestion de session est relativement simple et fonctionne plutôt bien.