web-dev-qa-db-fra.com

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

En fonction de ma tâche dans Vim, plusieurs onglets sont ouverts.

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

358
Jogusa

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
480
Benj

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
58
Jan Christoph

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.

40
Deepanshu

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.

32
gdso

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
14
mathielo

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.

6
vivek

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.

3
WALID BELRHALMIA

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.

3
PMunch

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
1
archf

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!

1
oml

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.

0
jaybay

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
0
JohnTortugo

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.

0
Sagar Jain

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
0
cute_ptr