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?
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
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
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.
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.
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
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.
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.
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ą.
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!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
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.
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
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
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.
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