Jak zapisać i przywrócić wiele różnych sesji w Vimie?

367

W zależności od zadania w Vimie mam kilka otwartych kart.

Jak mogę zapisać różne sesje do późniejszego wykorzystania?

Jogusa
źródło
16
@ldigas Myślę, że ppl czuje się bardziej komfortowo, znajdując pytanie tutaj (z dużą czcionką, świetnym formatowaniem ...) niż na oldschoolowym forum lub w dokumentacji terminala lub, nie daj Boże, manstrona
puk
6
@ldigas Ja osobiście zawsze mnie przerażały strony man, bo nie wystarczająco głupie rzeczy. Podobnie jak wszystko inne w systemie Linux, ma stromą krzywą uczenia się.
puk
45
@Idigas - myślę, że brakuje Ci punktu, że między zbiorowymi mądrościami nas, Google i zarządzaniem metakonwertowaniem przepełnienia stosu - jest to po prostu lepszy sposób na uzyskanie odpowiedzi - czego potrzebujesz, a nie długiej listy ezoterycznych opcji, także, ponieważ ta strona ilustruje rzeczywiste wrażenia z pułapek i często naprawdę fajne skróty, aby ułatwić Ci życie. Odnosi się to w równym stopniu do niemal każdego podręcznika, na który patrzyłem ( może z wyjątkiem podręcznika php online). Przepełnienie stosu Viva!
ErichBSchulz
2
@ldigas i ludzie mogą z niego korzystać w przyszłości, ponieważ ktoś inny może go potrzebować.
Mansuro,
4
@idigas Myślę, że te pytania są prawdziwe w tym sensie, że początkujący vim nie wie dużo o systemie pomocy i jak z niego korzystać, ale jeśli będzie bardziej doświadczony, będzie wiedział, jak znaleźć drogę w vimie.
Edgar Klerks

Odpowiedzi:

494

Chcesz coś takiego

:mksession ~/mysession.vim

Następnie możesz pobrać ten plik vim i odzyskać starą sesję:

:source ~/mysession.vim

lub otwórz vim z opcją -S:

$ vim -S ~/mysession.vim
Benj
źródło
27
Ooo, a ja prawie zapomniałem, że możesz załadować go z powrotem, wpisując: gvim -S ~ / mysession.vim
Benj
1
Dzięki @Benj. Jestem nowy w vimie. Jak mogę „źródło” w wierszu poleceń?
Jogusa
1
Ups! Przepraszam Benj, miałem na myśli tryb poleceń. Znalazłem to: ``: source ~ / mysession.vim´´.
Jogusa
8
Krótki to: so ~ / file. Jeśli zechcesz źródła bieżącego pliku, proste: więc% wykona pracę za Ciebie.
Daniel Baulig
14
Jeśli nie określisz nazwy pliku sesji, domyślnie będzie zapisywać i odczytywać Session.vim. Więc jeśli chcesz mieć tylko jedną sesję zapisaną w bieżącym katalogu, możesz użyć :mksessionlub :mksz vima, aby zapisać bieżącą sesję i po prostu vim -Sotworzyć ją ponownie.
anishpatel
59

Możesz ustawić te opcje sesji w swoim vimrc. Szczególnie denerwujące są opcje, gdy zmieniłeś vimrc po zapisaniu sesji.

set ssop-=options    " do not store global and local values in a session
set ssop-=folds      " do not store folds
Jan Christoph
źródło
1
Świetny! Wczoraj miałem dokładnie ten problem. Wielkie dzięki!
Jogusa
40

Zauważ, że: mksession nie zapisze zmian w żadnym utworzonym pliku. Popełniłem ten błąd zamykając vima po zapisaniu sesji, zakładając, że zacznę od tego. Ale kiedy następnym razem otworzyłem sesję, zmiany, które wprowadziłem do plików, zniknęły.

Deepanshu
źródło
11
Powinno to przynieść każdą odpowiedź związaną z :mksession.
Morgan Wilde
1
tak, prawdopodobnie chcesz śledzić:wqa
JonnyRaa
11
lub tylko :xajeden klawisz mniej. Tak!
robin
Możesz także ustawić vim, aby automatycznie zapisywał pliki (jeśli ci się podobają) w twoim .vimrc: vimrc au FocusLost * silent! wa To automatycznie zapisuje się za każdym razem, gdy bufor przestanie być aktywny.
grego
32

Jeśli używasz NERDTree jako eksploratora plików / dash, poleciłbym wtyczkę xolox / vim-session zamiast wbudowanej komendy: mksession. Z jakiegoś powodu: mksession nie przywraca buforów NERDTree. Twój przebieg może się różnić, ale pomyślałem, że podzielę się moim doświadczeniem.

gdso
źródło
W przypadku macvim muszę zapewnić: let g:nerdtree_tabs_open_on_gui_startup=0i let g:nerdtree_tabs_open_on_new_tab=0aby xolox / vim-session działał.
Nianliang
18

Jeśli chcesz zautomatyzować proces bez korzystania z żadnych wtyczek, możesz skorzystać z funkcji Przejdź i wróć z Wiki Vim Tips .

Za każdym razem, gdy wyjdziesz z Vima, zapisze bieżącą sesję ~/.vim/sessionsi załaduje ją ponownie po otwarciu Vima. Opiera się również na twojej bieżącej ścieżce, więc jeśli otworzysz Vima z różnych katalogów, będziesz miał różne sesje, co jest bardzo przydatne podczas pracy nad różnymi projektami.

Po prostu edytuj ~/.vimrcplik i dodaj:

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

Nawet dla początkujących ten skrypt jest dość łatwy do zrozumienia i dostosowania.

Uwaga: ten skrypt będzie działał poprawnie tylko w systemach Unix (MacOS / Linux), należy go dostosować do pracy w systemie Windows.


AKTUALIZACJA: Dodając sugestię 0xc0de , możesz zastąpić VimEnterwiersz tymi, jeśli chcesz, aby Vim ładował sesję tylko wtedy, gdy nie podano argumentów :

if(argc() == 0)
  au VimEnter * nested :call LoadSession()
endif
mathielo
źródło
1
Możesz chcieć otworzyć sesję tylko wtedy, gdy nie podano argumentu dla vima, np. if argc() == 0 au VimEnter * nested :call LoadSession() end
0xc0de,
Dzięki @ 0xc0de, świetna sugestia (nawet sam zacząłem z niej korzystać). Zaktualizowałem odpowiedź.
mathielo,
jak bym to zmodyfikował, aby po otwarciu vima z argumentami nie zapisał on również tej sesji
Dr Manhattan
bardzo dobrze, ale `exe 'source' b: sessionfile` potrzebuje tam kropki? problem polega na tym, że sesja autoloadu zależy od bieżącego katalogu domowego (get by pwd). Jak ustawić go jako ostatni katalog roboczy przed wyjściem z vima? aby mógł załadować ostatnią sesję roboczą, a nie sesję poniżej ~/?
van abel
Jeśli chcesz mieć sesje, ale nadal otwierasz pojedyncze pliki w katalogu bez nadpisywania, sprawdź moją zmodyfikowaną wersję w osobnej odpowiedzi: stackoverflow.com/questions/1642611/…
PMunch
6

Istnieje bardzo przydatna wtyczka do tego zadania vim-startify, która obsługuje wiele innych rzeczy, takich jak ostatnio otwierane pliki itp. Ma również bardzo łatwy interfejs.

Używam go od kilku dni i do tej pory działa idealnie. Mam nadzieję, że to ci pomoże.

vivek
źródło
5

Ponieważ jest to dla mnie (i prawdopodobnie innych) pierwsze trafienie w Google dotyczące pracy z sesjami w Vimie, postanowiłem dodać trochę do odpowiedzi @ mathielo na temat tego, jak to zrobić automatycznie.

Podobał mi się jego kod, ale trochę brakowało dodania rozwiązania „tylko jeśli bez argumentów”. To jest moja zmodyfikowana wersja:

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

Istotną zmianą tutaj jest opcjonalne zastąpienie. Jeśli otworzysz Vima bez opcji, otworzy on każdą istniejącą sesję i zastąpi zmiany dokonane podczas wychodzenia. Jeśli Vim zostanie otwarty z opcjami, utworzy nową sesję tylko wtedy, gdy żadna nie istnieje, oznacza to, że możesz otwierać pojedyncze pliki w katalogu, który ma sesję bez nadpisywania. Następnie możesz otworzyć Vima bez opcji, aby zamiast tego uruchomić sesję. Jeśli sesja nie istnieje, tworzona jest nowa.

PMunch
źródło
Właśnie wypróbowałem powyższe rozwiązanie w Neovim 0.2.2 i umieściłem twój fragment kodu, $HOME/.vim/plugin/sessions.vimale nie zapisuje on plików sesji. ¯ \ _ (ツ) _ / ¯
ipatch
Ten wątek, a zwłaszcza powiązany komentarz, może pomóc: superuser.com/questions/404686/... Mam go w moim pliku .vimrc i działa dobrze.
PMunch
działało, najwyraźniej muszę wyjść (n) vim, aby sesja została napisana wstaw zły dowcip Jeszcze raz dziękuję za udostępnienie 👍
ipatch
3

Jest taka cudowna sesja wywołania wtyczki vim-session . Jest bardzo potężny. Aby zainstalować:

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

Zamapowałem jego funkcjonalność w moim .vimrcpliku w następujący sposób:

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

Teraz w trybie normalnym po prostu wpisz, <leader>ssa zobaczysz takie polecenie

:SaveSession 

Teraz dodaj nazwę swojej sesji

 :SaveSession namesession

i to wszystko.

Kiedy zamkniesz Vima i otworzysz go ponownie, po prostu zrób to

 :OpenSession

i zobaczysz swoją sesję otwartą.

Istnieje wiele innych konfiguracji do dodania w .vimrcpliku, patrz przykłady w dokumentacji:

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

Jest dobry tutorial YouTube .

WALID BELRHALMIA
źródło
2

Osobiście po prostu owijam wtyczkę Obsesji Tima Pope'a, aby umożliwić zdefiniowanie sessiondiri unikanie wpisywania ścieżki:

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
archf
źródło
miałem określone problemy z wtyczką i sesjami Airline. Przejście na korzystanie z Obsession naprawiło problemy, było to niesamowite odkrycie po tygodniach zmagań. Zobacz github.com/vim-airline/vim-airline/issues/…
icc97
1

Dzięki @mathielo Zgodnie z przykładem z @mathielo dodałem poniższy wiersz do .vimrc, aby zapisać aktywną sesję (jeśli istnieje):

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

Jeśli chcesz wstawić więcej linii, musisz użyć endif:

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

Musisz tylko zapisać nową sesję w vimie

:mks [Session filename]

i po rozpoczęciu z

$ vim -S [Session filename]

vim rozpocznie sesję i nie musisz się martwić, aby zapisać sesję za każdym razem, gdy zamkniesz vima.

Jeśli nie masz aktywnej sesji .vimrc nic nie zrobi. Jak wcześniej.

Właśnie tego szukałem! Jeszcze raz dziękuję @mathielo!

oml
źródło
Tego też szukałem. Wspaniały ! Nie pamiętam, ile razy straciłem sesję :qzamiast :bd... Dzięki!
Joel.O
1

Jeśli planujesz mieć tylko 1 sesję dla projektu, po prostu zrób

:mks

który utworzy Session.vimplik w bieżącym katalogu, a następnie otworzy sesję (z tego samego katalogu):

vim -S

Jeśli zmienisz sesję i chcesz ją zapisać:

:mks!

To oszczędza sesję, a nie same pliki!

Jeśli planujesz mieć wiele sesji , wolę zapisać je w ukrytych plikach w katalogu projektu:

:mks .session-name.vim

Aby go otworzyć (z tego samego katalogu):

vim -S .session-name.vim

Zapisz sesję:

:mks! .session-name.vim

Ponieważ sesje są zapisywane w ukrytych plikach, aby je wyświetlić, nie zapomnij -a

ls -a
cute_ptr
źródło
0

Możesz przechowywać sesję w dowolnym miejscu.

Dawny:

:mksession! D:/session.ses

Spowoduje to zapisanie sesji na dysku D.

Można to otworzyć, pisząc

:so D:/session.ses

w dowolnym pliku vim.

Sagar Jain
źródło
0

Poniżej znajduje się jedyny conf. to naprawdę dla mnie zadziałało. Wziąłem go stąd , gdzie możesz również wziąć bardziej kompletną / złożoną wersję.

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
JohnTortugo
źródło
0

Aby zarządzać wieloma sesjami (na podstawie katalogu / repo), niedawno przełączyłem się z wtyczki vim-session na vim-workspace . Zarządzanie sesjami jest stosunkowo proste i działa całkiem dobrze.

jaybay
źródło