Wie speichere und stelle ich mehrere verschiedene Sitzungen in Vim wieder her?


367

Abhängig von meiner Aufgabe in Vim sind mehrere Registerkarten geöffnet.

Wie kann ich verschiedene Sitzungen für die spätere Verwendung speichern?


16
@ldigas Ich denke, ppl fühlen sich wohler, wenn sie die Frage hier finden (mit der großen Schriftart, der großartigen Formatierung ...) als in einem Forum der alten Schule oder einer Terminaldokumentation oder, himmlisch, auf einer manSeite
puk

6
@ldigas Ich persönlich war immer verängstigt von den Manpages b / c, die nicht dumm genug sind. Ähnlich wie alles andere unter Linux hat es eine steile Lernkurve.
Puk

45
@Idigas - Ich denke, Sie verpassen den Punkt, dass zwischen den kollektiven Smarts von uns, Google und dem Metaknowledge-Management für Stapelüberläufe - dies ist einfach ein besserer Weg, um Ihre Antworten zu erhalten - was Sie brauchen, keine lange Liste esoterischer Optionen, Auch da diese Seite die reale Erfahrung von Fallen und oft sehr raffinierte Verknüpfungen veranschaulicht, um Ihnen das Leben zu erleichtern. Dies gilt gleichermaßen für fast jedes Handbuch, das ich mir angesehen habe (außer vielleicht das PHP-Online-Handbuch). Viva Stackoverflow!
ErichBSchulz

2
@ldigas und Leute können es als zukünftige Referenz verwenden, da jemand anderes es möglicherweise benötigt.
Mansuro

4
@idigas Ich denke, diese Fragen sind real in dem Sinne, dass ein Vim-Anfänger nicht viel über das Hilfesystem und dessen Verwendung weiß, aber wenn er erfahrener wird, weiß er, wie er sich in Vim zurechtfindet.
Edgar Klerks

Antworten:


494

Du willst so etwas wie

:mksession ~/mysession.vim

Später können Sie diese VIM-Datei als Quelle verwenden und haben Ihre alte Sitzung wieder:

:source ~/mysession.vim

oder öffnen Sie vim mit der Option -S:

$ vim -S ~/mysession.vim

27
Ooo, und ich hätte fast vergessen, dass Sie es zurückladen können, indem Sie Folgendes eingeben: gvim -S ~ / mysession.vim
Benj

1
Danke @Benj. Ich bin neu in vim. Wie kann ich in der Befehlszeile "quellen"?
Jogusa

1
Ups! Sorry Benj, ich meinte Befehlsmodus. Ich habe es bereits gefunden: ``: source ~ / mysession.vim´´.
Jogusa

8
Kurz ist: so ~ / file. Wenn Sie die aktuelle Datei einfach als Quelle bereitstellen möchten, erledigt% die Arbeit für Sie.
Daniel Baulig

14
Wenn Sie keinen Sitzungsdateinamen angeben, wird standardmäßig geschrieben und gelesen Session.vim. Wenn Sie also nur eine Sitzung in Ihrem aktuellen Verzeichnis speichern möchten, können Sie mit :mksessionoder :mksvon vim Ihre aktuelle Sitzung speichern und sie einfach vim -Swieder öffnen.
Anishpatel

59

Möglicherweise möchten Sie diese Sitzungsoptionen in Ihrem vimrc festlegen. Besonders Optionen sind ärgerlich, wenn Sie Ihr vimrc nach dem Speichern der Sitzung geändert haben.

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

1
Großartig! Ich hatte gestern genau dieses Problem. Vielen Dank!
Jogusa

40

Beachten Sie Folgendes: mksession speichert die Änderungen nicht an den von Ihnen vorgenommenen Dateien. Ich habe diesen Fehler gemacht, vim zu schließen, nachdem ich die Sitzung gespeichert hatte, vorausgesetzt, ich werde von dort aus weitermachen. Aber als ich das nächste Mal die Sitzung öffnete, waren die Änderungen, die ich an den Dateien vorgenommen hatte, weg.


11
Dies sollte mit jeder Antwort im Zusammenhang mit kommen :mksession.
Morgan Wilde

1
Ja, Sie möchten wahrscheinlich mit einem:wqa
JonnyRaa

11
oder nur :xaein Tastendruck weniger. Yay!
Robin

Sie können vim auch so einstellen, dass Dateien automatisch gespeichert werden (wenn Sie so etwas mögen) in .vimrc: vimrc au FocusLost * silent! wa Dies speichert sich automatisch, wenn der Puffer den Fokus verliert.
Grego

32

Wenn Sie NERDTree als Datei-Explorer / Dash verwenden, würde ich das xolox / vim-session-Plugin anstelle des integrierten Befehls: mksession empfehlen. Aus irgendeinem Grund: mksession kann NERDTree-Puffer nicht wiederherstellen. Ihr Kilometerstand kann variieren, aber ich dachte, ich würde meine Erfahrungen teilen.


Für macvim muss ich sicherstellen: let g:nerdtree_tabs_open_on_gui_startup=0und let g:nerdtree_tabs_open_on_new_tab=0dass xolox / vim-session funktioniert.
Nianliang

18

Wenn Sie den Prozess ohne Verwendung von Plugins automatisieren möchten, können Sie Go away verwenden und aus dem Vim Tips Wiki zurückkehren .

Jedes Mal, wenn Sie Vim beenden, wird die aktuelle Sitzung unter ~/.vim/sessionsgespeichert und nach dem Öffnen von Vim wieder geladen. Es basiert auch auf Ihrem aktuellen Pfad. Wenn Sie also Vim aus verschiedenen Verzeichnissen öffnen, haben Sie verschiedene Sitzungen, was sehr nützlich ist, wenn Sie an verschiedenen Projekten arbeiten.

Bearbeiten Sie einfach Ihre ~/.vimrcDatei und fügen Sie Folgendes hinzu:

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

Auch für Anfänger ist dieses Skript etwas leicht zu verstehen und anpassen.

Bitte beachten Sie, dass dieses Skript nur für Unix-Systeme (MacOS / Linux) ordnungsgemäß funktioniert. Es muss an Windows angepasst werden.


UPDATE: Wenn Sie den Vorschlag von 0xc0de hinzufügen , können Sie die VimEnterZeile für diese ersetzen , wenn Vim die Sitzung nur laden soll, wenn keine Argumente angegeben sind :

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

1
Möglicherweise möchten Sie die Sitzung nur öffnen, wenn für vim kein Argument angegeben ist, z. if argc() == 0 au VimEnter * nested :call LoadSession() end
0xc0de

Danke @ 0xc0de, toller Vorschlag (ich habe sogar angefangen, es selbst zu benutzen). Ich habe die Antwort aktualisiert.
Mathielo

Wie würde ich dies so ändern, dass, wenn ich vim mit Argumenten öffne, diese Sitzung auch nicht gespeichert wird
Dr. Manhattan

sehr gut, aber "exe" source "b: sessionfile" braucht dort einen Punkt? und das Problem ist, dass die Autoload-Sitzung vom aktuellen Home-Verzeichnis abhängt (Get By pwd). Wie kann ich festlegen, dass es das letzte Arbeitsverzeichnis vor dem Beenden von vim ist? damit es die letzte Arbeitssitzung anstatt der Sitzung unter laden kann ~/?
van abel

Wenn Sie Sitzungen haben möchten, aber dennoch einzelne Dateien im Verzeichnis öffnen möchten, ohne es zu überschreiben, lesen Sie meine geänderte Version in der separaten Antwort: stackoverflow.com/questions/1642611/…
PMunch

6

Es gibt ein sehr nützliches Plugin für diese Aufgabe vim-startify, das viele andere Dinge wie kürzlich geöffnete Dateien usw. behandelt. Es hat auch eine sehr einfache Oberfläche.

Ich benutze es seit ein paar Tagen und bis jetzt funktioniert es perfekt. Hoffe es hilft dir.


5

Da dies für mich (und wahrscheinlich auch für andere) der erste Treffer bei Google ist, um mit Sitzungen in Vim zu arbeiten, habe ich beschlossen, @ mathielos Antwort, wie dies automatisch erfolgen soll, ein wenig hinzuzufügen.

Ich mag seinen Code, aber die Hinzufügung der Lösung "nur wenn ohne Argumente" schien etwas zu fehlen. Dies ist meine modifizierte Version:

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

Die bemerkenswerte Änderung hier ist die optionale Überschreibung. Wenn Sie Vim ohne Optionen öffnen, werden alle vorhandenen Sitzungen geöffnet und die beim Verlassen vorgenommenen Änderungen überschrieben. Wenn Vim mit Optionen geöffnet wird, wird nur dann eine neue Sitzung erstellt, wenn keine vorhanden ist. Dies bedeutet, dass Sie einzelne Dateien in einem Verzeichnis mit einer Sitzung öffnen können, ohne sie zu überschreiben. Anschließend können Sie Vim ohne Optionen öffnen, um stattdessen die Sitzung auszuführen. Wenn keine Sitzung vorhanden ist, wird eine neue erstellt.


Ich habe gerade Ihre oben veröffentlichte Lösung in Neovim 0.2.2 ausprobiert und Ihr Snippet platziert, $HOME/.vim/plugin/sessions.vimaber die Sitzungsdateien werden nicht gespeichert. ¯ \ _ (ツ) _ / ¯
ipatch

Dieser Thread und insbesondere der verlinkte Kommentar könnten helfen: superuser.com/questions/404686/… Ich habe ihn in meiner .vimrc und das funktioniert gut.
PMunch

habe es funktioniert, anscheinend habe ich bis Ausfahrt (n) vim , um für die Sitzung geschrieben wird Einsatz schlechten Witz Thanks for sharing wieder 👍
iPatch

3

Es gibt diese wunderbare Plugin Call Vim-Session . Es ist sehr mächtig. So installieren Sie es:

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

Ich habe seine Funktionalität in meiner .vimrcDatei folgendermaßen zugeordnet:

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

Geben <leader>ssSie jetzt im normalen Modus einfach ein und Sie sehen einen Befehl wie diesen

:SaveSession 

Fügen Sie nun den Namen Ihrer Sitzung hinzu

 :SaveSession namesession

und das ist alles.

Wenn Sie Vim schließen und erneut öffnen, tun Sie es einfach

 :OpenSession

und Sie werden sehen, dass Ihre Sitzung geöffnet ist.

Es gibt viele andere Konfigurationen, die Sie in Ihre .vimrcDatei einfügen können. Beispiele finden Sie in der Dokumentation:

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

Auf YouTube gibt es ein gutes Tutorial .


2

Persönlich wickle ich einfach das Obsession- Plugin von Tim Pope ein, um die Definition eines sessiondirPfads zu ermöglichen und die Eingabe des Pfads zu vermeiden:

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

Ich hatte spezielle Probleme mit dem Airline-Plugin und den Sitzungen. Die Umstellung auf Obsession hat die Probleme behoben. Nach wochenlangen Kämpfen war dies ein erstaunlicher Fund. Siehe github.com/vim-airline/vim-airline/issues/…
icc97

1

Danke @mathielo Nach dem Beispiel von @mathielo habe ich die folgende Zeile zu .vimrc hinzugefügt, um die aktive Sitzung (falls vorhanden) zu speichern:

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

Wenn Sie mehr Zeilen einfügen möchten, müssen Sie endif verwenden:

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

Sie müssen nur eine neue Sitzung in vim mit speichern

:mks [Session filename]

und nach dem Start mit

$ vim -S [Session filename]

vim startet die Sitzung und Sie müssen sich keine Sorgen machen, um die Sitzung jedes Mal zu speichern, wenn Sie vim schließen.

Wenn Sie keine aktive Sitzung haben, führt .vimrc nichts aus. Wie vorher.

Das habe ich gesucht! Nochmals vielen Dank @mathielo!


Das habe ich auch gesucht. Großartig ! Ich kann mich nicht erinnern, wie oft ich meine Sitzung verloren habe, :qanstatt :bd... Danke!
Joel.O

1

Wenn Sie nur eine Sitzung für das Projekt planen, tun Sie dies einfach

:mks

Dadurch wird eine Session.vimDatei im aktuellen Verzeichnis erstellt und anschließend die Sitzung (aus demselben Verzeichnis) geöffnet:

vim -S

Wenn Sie die Sitzung ändern und speichern möchten:

:mks!

Dies speichert die Sitzung, nicht die Dateien selbst!

Wenn Sie mehrere Sitzungen planen, möchte ich diese lieber in versteckten Dateien im Projektverzeichnis speichern:

:mks .session-name.vim

So öffnen Sie es (aus demselben Verzeichnis):

vim -S .session-name.vim

Sitzung speichern:

:mks! .session-name.vim

Da die Sitzungen in versteckten Dateien gespeichert sind, vergessen Sie nicht, sie anzuzeigen -a

ls -a

0

Sie können die Sitzung speichern, wo immer Sie möchten.

Ex:

:mksession! D:/session.ses

Dadurch wird die Sitzung im Laufwerk D gespeichert.

Dies kann durch Eingabe geöffnet werden

:so D:/session.ses

in einer der vim-Dateien.


0

Unten ist die einzige conf. das hat bei mir wirklich geklappt. Ich habe es von hier genommen , wo Sie auch eine vollständigere / komplexere Version nehmen können.

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

Für die Verwaltung mehrerer Sitzungen (pro Verzeichnis / Repo-Basis) habe ich kürzlich vom vim-session-Plugin zum vim-workspace gewechselt . Das Sitzungsmanagement ist relativ einfach und funktioniert ziemlich gut.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.