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

W zależności od mojego zadania w Vimie mam kilka zakładek otwartych.

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

 342

14 answers

Chcesz coś takiego

:mksession ~/mysession.vim

Potem możesz pobrać plik vim i odzyskasz swoją starą sesję:

:source ~/mysession.vim

Lub otwórz Vima z opcją-S:

$ vim -S ~/mysession.vim
 459
Author: Benj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-11 12:54:14

Możesz chcieć ustawić te opcje sesji w swoim vimrc. Szczególnie opcje są denerwujące, 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
 58
Author: Jan Christoph,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-22 15:41:54

Zauważ, że: mksession nie zapisze zmian w żadnych wprowadzonych plikach. Popełniłem ten błąd zamykając Vima po zapisaniu sesji, zakładając, że zajmę się stamtąd. Ale następnym razem, gdy otworzyłem sesję, zmiany, które wprowadziłem w plikach, zniknęły.

 37
Author: Deepanshu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-22 22:25:03

Jeśli używasz NERDTreejako eksploratora plików/dash, polecam xolox/vim-session plugin zamiast wbudowanego polecenia :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.

 30
Author: gdso,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-12 17:20:50

Jeśli chcesz zautomatyzować proces bez użycia wtyczek, możesz użyć Go away and come back z Vim Tips Wiki .

Za każdym razem, gdy opuszczasz Vima, zapisuje on bieżącą sesję pod ~/.vim/sessions i ładuje ją ponownie po otwarciu Vima. Jest również oparty na 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 swój plik ~/.vimrc i dodaj po:

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 nieco łatwy do zrozumienia i dostosowania.

Proszę zauważyć ten skrypt będzie działał poprawnie tylko w systemach Unix (MacOS/Linux), musi być dostosowany do pracy w systemie Windows.


UPDATE: dodanie sugestii 0xc0de , możesz zastąpić linię VimEnter dla tych, Jeśli chcesz, aby vim załadował sesję tylko jeśli nie podano argumentów:

if(argc() == 0)
  au VimEnter * nested :call LoadSession()
endif
 12
Author: mathielo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:33

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

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

 5
Author: vivek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-28 09:11:38

Jest to wspaniałe wywołanie wtyczki vim-session. Jest bardzo potężny. Aby go zainstalować:

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

Zmapowałem jego funkcjonalność w moim pliku .vimrc tak:

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>ss i zobaczysz polecenie takie jak to

:SaveSession 

Teraz dodaj nazwę sesji

 :SaveSession namesession
I to wszystko. Kiedy zamkniesz Vima i otworzysz go ponownie, zrób to.]}
 :OpenSession

I zobaczysz swoją sesję otwartą.

Istnieje wiele inne konfiguracje do dodania w pliku .vimrc Zobacz przykładową dokumentację:

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 na YouTube.

 3
Author: WALID BELRHALMIA,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-04 21:01:27

Ponieważ jest to pierwszy hit w Google dla mnie (i prawdopodobnie innych) za to, jak pracować z sesjami w Vimie postanowiłem dodać trochę do odpowiedzi @ mathielo na temat tego, jak zrobić to automatycznie.

Podoba mi się jego kod, ale dodanie rozwiązania "only if without args" wydawało się trochę niewystarczające. 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ą jest opcjonalne nadpisanie. Jeśli otworzysz Vima bez opcji, otworzy On każdą istniejącą sesję i nadpisze wprowadzone zmiany kiedy wyjdziesz. Jeśli Vim jest 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 jej. Następnie możesz otworzyć Vima bez opcji, aby uruchomić sesję. Jeśli sesja nie istnieje, tworzy nową.

 2
Author: PMunch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-05 14:33:55

Dzięki @ mathielo Idąc za przykładem z @ mathielo, dodałem poniższy wiersz do .vimrc zapisuje aktywną sesję (jeśli istnieje):

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

Jeśli chcesz umieścić 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 za pomocą

:mks [Session filename]

I po rozpoczęciu

$ vim -S [Session filename]

Vim rozpocznie sesję i nie musisz się martwić, aby zapisać sesję za każdym razem, gdy zamykasz Vima.

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

Tego właśnie szukałem! Jeszcze raz dzięki @ mathielo!
 1
Author: oml,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-20 08:16:46

Osobiście po prostu zawijam wtyczkę Tima Pope' a Obsession , aby umożliwić zdefiniowanie sessiondir i uniknąć 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
 1
Author: archf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-08 17:15:09

Możesz przechowywać sesję w dowolnym miejscu.

Ex:

:mksession! D:/session.ses

Zapisuje sesję na dysku D.

Można to otworzyć wpisując

:so D:/session.ses

W dowolnym pliku vim.

 0
Author: Sagar Jain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-18 11:20:40

Poniżej znajduje się jedyny conf. to naprawdę zadziałało. Wziąłem go z Tutaj , gdzie można 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
 0
Author: JohnTortugo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-29 02:57:28

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

:mks

, który utworzy plik Session.vim 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 zapisuje sesję, a nie same pliki!

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

: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
 0
Author: cute_ptr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-29 09:08:22

Do zarządzania 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.

 0
Author: jaybay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-07 14:37:30