En fonction de ma tâche dans Vim, plusieurs onglets sont ouverts.
Comment puis-je sauvegarder différentes sessions pour une utilisation ultérieure?
Vous voulez quelque chose comme
:mksession ~/mysession.vim
Ensuite, vous pourrez source ce fichier vim et vous retrouverez 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. En particulier, les options sont gênantes 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'enregistrera les modifications dans aucun des fichiers que vous avez créés. J'ai commis cette erreur en fermant vim après avoir enregistré la session en supposant que je reprendrais à partir de là. Mais la prochaine fois que j'ai ouvert la session, les modifications que j'avais apportées aux fichiers avaient disparu.
Si vous utilisez NERDTree comme explorateur de fichiers/tiret, je vous recommanderais 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 je pensais partager mon expérience.
Si vous souhaitez automatiser le processus sans utiliser de plug-ins, vous pouvez utiliser Allez-vous-en et revenez à partir de Wiki Vim Tips .
Chaque fois que vous quittez Vim, il enregistre la session en cours sous ~/.vim/sessions
et le recharge à nouveau une fois Vim ouvert. Il est également basé sur votre chemin actuel. Par conséquent, 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.
Modifiez simplement votre fichier ~/.vimrc
et ajoutez les éléments suivants:
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 un peu facile à comprendre et à personnaliser.
Veuillez noter que ce script ne fonctionnera correctement que sur les systèmes Unix (MacOS/Linux), il doit être adapté pour fonctionner sous Windows.
UPDATE: Ajout de la suggestion de xc0de , vous pouvez remplacer la ligne VimEnter
si vous voulez Vim pour charger la session uniquement si aucun argument n'est fourni :
if(argc() == 0)
au VimEnter * nested :call LoadSession()
endif
Il existe 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 possède également 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 cet appel de plugin merveilleux 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é sa fonctionnalité dans mon fichier .vimrc
comme ceci:
nnoremap <leader>so :OpenSession
nnoremap <leader>ss :SaveSession
nnoremap <leader>sd :DeleteSession<CR>
nnoremap <leader>sc :CloseSession<CR>
Maintenant, en mode normal, tapez <leader>ss
et vous verrez une commande comme celle-ci.
:SaveSession
Ajoutez maintenant le nom de votre session
:SaveSession namesession
et c'est tout.
Lorsque vous fermez Vim et rouvrez-le, faites-le
:OpenSession
et vous verrez votre session ouverte.
Il y a beaucoup d'autres configurations à ajouter 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 y a un bon tutoriel sur YouTube.
Comme c’est le premier coup sur Google (et probablement d’autres) pour savoir comment travailler avec des sessions dans Vim, j’ai décidé d’ajouter un peu à la réponse de @ mathielo sur la façon de rendre cela automatique.
J'aime son code, mais l'ajout de la solution "seulement si sans arguments" 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 la substitution facultative. Si vous ouvrez Vim sans options, il ouvrira toute session existante et écrasera les modifications apportées à votre départ. Si Vim est ouvert avec des options, il ne créera une nouvelle session que s'il n'en existe aucune. Cela signifie que vous pouvez ouvrir des fichiers uniques dans un répertoire qui contient une session sans l'écraser. Ensuite, vous pouvez ouvrir Vim sans options pour exécuter la session à la place. S'il n'y a pas de session, elle en crée une nouvelle.
Personnellement, je viens de passer au dessus du 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(<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
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é avec
$ vim -S [Session filename]
vim va démarrer 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!
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.
Ci-dessous est la seule conf. cela a vraiment fonctionné pour moi. Je l'ai pris de 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
Vous pouvez stocker la session où vous voulez.
Ex:
:mksession! D:/session.ses
Ceci stocke la session dans le lecteur D.
Cela peut être ouvert en tapant
:so D:/session.ses
dans l'un des fichiers vim.
Si vous envisagez de n'avoir qu'une session pour le projet, faites-le
:mks
qui créera un fichier Session.vim
dans le répertoire en cours, puis ouvrira la session (à partir du même répertoire):
vim -S
Si vous changez de session et souhaitez le sauvegarder:
: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 (à partir du même répertoire):
vim -S .session-name.vim
Sauver la session:
:mks! .session-name.vim
Les sessions étant enregistrées dans des fichiers cachés, n'oubliez pas de les consulter -a
ls -a