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


367

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

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


16
@ldigas Je pense que ppl se sent plus à l'aise de trouver la question ici (avec la grande police, la mise en forme excellente ...) que sur un forum de la vieille école ou une documentation de terminal, ou, Dieu nous en préserve, une manpage
puk

6
@ldigas Personnellement, j'ai toujours été effrayé par les pages de manuel b / c, ils ne sont pas suffisamment stupides. Comme tout le reste sous Linux, il a une courbe d'apprentissage abrupte.
puk

45
@Idigas - Je pense que vous manquez le point qu'entre l'intelligence collective de nous, google, et la gestion des méta-connaissances de débordement de pile - c'est simplement une meilleure façon d'obtenir vos réponses - ce dont vous avez besoin, pas une longue liste d'options ésotériques, également car cette page illustre l'expérience réelle des pièges et des raccourcis souvent très astucieux pour vous faciliter la vie. Cela s'applique également à presque tous les manuels que j'ai consultés (sauf peut - être le manuel php en ligne). Viva stackoverflow!
ErichBSchulz

2
@ldigas et les gens peuvent l'utiliser pour référence future, car quelqu'un d'autre pourrait en avoir besoin.
Mansuro

4
@idigas Je pense que ces questions sont réelles dans le sens où un débutant vim ne sait pas grand-chose sur le système d'aide et comment l'utiliser, mais s'il devient plus expérimenté, il saura trouver son chemin dans vim.
Edgar Klerks

Réponses:


494

Tu veux quelque chose comme

:mksession ~/mysession.vim

Ensuite, vous pourrez récupérer ce fichier vim et vous récupérerez votre ancienne session:

:source ~/mysession.vim

ou ouvrez vim avec l'option -S:

$ vim -S ~/mysession.vim

27
Ooo, et j'ai presque oublié que vous pouvez le recharger en tapant: gvim -S ~ / mysession.vim
Benj

1
Merci @Benj. Je suis nouveau à Vim. Comment puis-je «source» dans la ligne de commande?
Jogusa

1
Oups! Désolé Benj, je voulais dire le mode commande. Je l'ai déjà trouvé: ``: source ~ / mysession.vim´´.
Jogusa

8
Court est: donc ~ / fichier. Si vous souhaitez simplement source le fichier actuel:% fera le travail pour vous.
Daniel Baulig

14
Si vous ne spécifiez pas de nom de fichier de session, il sera par défaut écrit et lu Session.vim. Donc, si vous ne souhaitez enregistrer qu'une seule session dans votre répertoire actuel, vous pouvez utiliser :mksessionou à :mkspartir de vim pour enregistrer votre session actuelle et simplement l' vim -Souvrir.
anishpatel

59

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

1
Génial! J'ai eu exactement ce problème hier. Merci beaucoup!
Jogusa

40

Notez que: mksession n'enregistrera pas les modifications apportées aux fichiers que vous avez créés. J'ai fait cette erreur de fermer 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 que j'avais apportées aux fichiers avaient disparu.


11
Cela devrait venir avec toute réponse liée à :mksession.
Morgan Wilde

1
oui, vous voulez probablement suivre avec un:wqa
JonnyRaa

11
ou juste :xaune frappe de moins. Yay!
robin

Vous pouvez également configurer vim pour enregistrer automatiquement les fichiers (si vous aimez ce genre de chose) dans votre .vimrc: vimrc au FocusLost * silent! wa Cela enregistrera automatiquement chaque fois que le tampon perd le focus.
grego

32

Si vous utilisez NERDTree comme explorateur de fichiers / dash, je recommanderais le plugin 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.


Pour macvim, je dois m'assurer: let g:nerdtree_tabs_open_on_gui_startup=0et let g:nerdtree_tabs_open_on_new_tab=0faire fonctionner xolox / vim-session.
Nianliang

18

Si vous souhaitez automatiser le processus sans utiliser de plugins, vous pouvez utiliser Go away et revenir du wiki Vim Tips .

Chaque fois que vous quittez Vim, il enregistre la session en cours ~/.vim/sessionset la charge à nouveau une fois Vim 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.

Modifiez simplement votre ~/.vimrcfichier 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 quelque peu 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.


MISE À JOUR: En ajoutant la suggestion de 0xc0de , vous pouvez remplacer la VimEnterligne 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

1
Vous voudrez peut-être ouvrir la session uniquement si aucun argument n'est fourni pour vim, par exemple. if argc() == 0 au VimEnter * nested :call LoadSession() end
0xc0de

Merci @ 0xc0de, excellente suggestion (j'ai même commencé à l'utiliser moi-même). J'ai mis à jour la réponse.
mathielo

comment pourrais-je modifier cela afin que si j'ouvre vim avec des arguments, il ne sauvegarde pas non plus cette session
Dr Manhattan

très bien, mais «exe» source «b: sessionfile» a besoin d'un point là-bas? et le problème est que la session de chargement automatique dépend du répertoire personnel actuel (get by pwd) comment puis-je le définir comme le dernier répertoire de travail avant de quitter vim? pour qu'il puisse charger la dernière session de travail plutôt que la session en dessous ~/?
van abel

Si vous voulez pouvoir avoir des sessions mais toujours ouvrir des fichiers uniques dans le répertoire sans l'écraser, consultez ma version modifiée de cela dans la réponse séparée: stackoverflow.com/questions/1642611/…
PMunch

6

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 a également une interface très simple.

Je l'utilise depuis quelques jours et jusqu'à présent, il fonctionne parfaitement. J'espère que cela vous aide.


5

Comme c'est le premier hit sur Google pour moi (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 un peu manquer. 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, il ouvrira toute session existante et écrasera les modifications apportées lorsque vous quitterez. Si Vim est ouvert avec des options, il ne créera une nouvelle session que s'il n'en existe pas, cela signifie que vous pouvez ouvrir des fichiers uniques dans un répertoire qui a une session sans l'écraser. Ensuite, vous pouvez ouvrir Vim sans options pour exécuter la session à la place. S'il n'existe pas de session, il en crée une nouvelle.


Je viens d'essayer votre solution publiée ci-dessus dans Neovim 0.2.2 et de placer votre extrait de code, $HOME/.vim/plugin/sessions.vimmais il n'enregistre pas les fichiers de session. ¯ \ _ (ツ) _ / ¯
ipatch

Ce fil, et en particulier le commentaire lié, pourrait aider: superuser.com/questions/404686/… Je l'ai dans mon .vimrc et cela fonctionne très bien.
PMunch

Je l'ai fait fonctionner, apparemment je dois quitter (n) vim pour que la session soit écrite insérer une mauvaise blague Merci encore pour le partage
ip

3

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é sa fonctionnalité dans mon .vimrcfichier 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 simplement <leader>sset 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 que vous le rouvrez, faites-le

 :OpenSession

et vous verrez votre session ouverte.

Il y a beaucoup d'autres configurations à ajouter dans votre .vimrcfichier 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.


2

Personnellement, je passe simplement le plugin Obsession de Tim Pope pour permettre de définir un sessiondiret é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

j'ai eu des problèmes spécifiques avec le plugin et les sessions Airline. Passer à l'utilisation d'Obsession a résolu les problèmes, c'était une découverte incroyable après des semaines de difficultés. Voir github.com/vim-airline/vim-airline/issues/…
icc97

1

Merci @mathielo Exemple suivant 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émarrera la session et vous n'avez pas à vous soucier d'enregistrer la session à chaque fois que vous fermez vim.

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

Voilà ce que je cherchais! Merci encore @mathielo!


C'est ce que je cherchais aussi. Génial ! Je ne me souviens pas combien de fois j'ai perdu ma séance :qau lieu de :bd... Merci!
Joel.O

1

Si vous prévoyez de n'avoir qu'une seule session pour le projet, faites-le

:mks

qui va créer un Session.vimfichier dans le répertoire courant, puis pour 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 (à partir du même répertoire):

vim -S .session-name.vim

Sauvegarder la session:

:mks! .session-name.vim

Puisque les sessions sont enregistrées dans des fichiers cachés, pour les visualiser n'oubliez pas -a

ls -a

0

Vous pouvez stocker la session où vous le souhaitez.

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.


0

Ci-dessous est la seule conf. cela a vraiment fonctionné pour moi. Je l'ai pris 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

0

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.