В зависимости от моей задачи в Vim у меня есть несколько открытых вкладок.
Как я могу сохранить разные сессии для последующего использования?
В зависимости от моей задачи в Vim у меня есть несколько открытых вкладок.
Как я могу сохранить разные сессии для последующего использования?
Ответы:
Вы хотите что-то вроде
:mksession ~/mysession.vim
Затем вы можете получить исходный файл vim и вернуться к старому сеансу:
:source ~/mysession.vim
или откройте vim с опцией -S:
$ vim -S ~/mysession.vim
Session.vim
. Поэтому, если вы хотите сохранить только один сеанс в текущем каталоге, вы можете использовать :mksession
или :mks
из vim, чтобы сохранить текущий сеанс и просто vim -S
открыть его обратно.
Возможно, вы захотите установить эти параметры сеанса в вашем vimrc. Особенно раздражает опция, когда вы меняете свой vimrc после сохранения сеанса.
set ssop-=options " do not store global and local values in a session
set ssop-=folds " do not store folds
Обратите внимание: mksession не будет сохранять изменения в файлы, которые вы сделали. Я сделал эту ошибку, закрыв vim после сохранения сессии, предполагая, что я займусь этим. Но в следующий раз, когда я открыл сессию, внесенные в файлы изменения исчезли.
:mksession
.
:wqa
:xa
одно нажатие клавиши меньше. Ура!
.vimrc
: vimrc au FocusLost * silent! wa
Это будет автоматически сохранять каждый раз, когда буфер теряет фокус.
Если вы используете NERDTree в качестве проводника / dash, я бы порекомендовал подключаемый модуль xolox / vim-session вместо встроенной команды: mksession. По некоторым причинам: mksession не может восстановить буферы NERDTree. Ваш пробег может отличаться, но я поделился своим опытом.
let g:nerdtree_tabs_open_on_gui_startup=0
и let g:nerdtree_tabs_open_on_new_tab=0
чтобы xolox / vim-session работал.
Если вы хотите автоматизировать процесс без использования каких-либо плагинов, вы можете использовать Go away и вернуться из Vim Tips Wiki .
Каждый раз, когда вы выходите из Vim, он сохраняет текущий сеанс ~/.vim/sessions
и загружает его снова после открытия Vim. Он также основан на вашем текущем пути, поэтому, если вы откроете Vim из разных каталогов, у вас будут разные сессии, что весьма полезно при работе над разными проектами.
Просто отредактируйте свой ~/.vimrc
файл и добавьте следующее:
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()
Даже для начинающего этот скрипт несколько легко понять и настроить.
Обратите внимание, что этот скрипт будет правильно работать только для систем Unix (MacOS / Linux), его необходимо адаптировать для работы в Windows.
ОБНОВЛЕНИЕ: добавив предложение 0xc0de , вы можете заменить VimEnter
строку для этих, если вы хотите, чтобы Vim загружал сессию, только если не предоставлено никаких аргументов :
if(argc() == 0)
au VimEnter * nested :call LoadSession()
endif
if argc() == 0 au VimEnter * nested :call LoadSession() end
pwd
), как я могу установить его как последний рабочий каталог перед выходом vim? чтобы он мог загрузить последний рабочий сеанс, а не сеанс под ~/
?
Для этой задачи есть очень полезный плагин vim-startify, который обрабатывает многие другие вещи, такие как недавно открытые файлы и т. Д. Он также имеет очень простой интерфейс.
Я использую его с нескольких дней, и до сих пор он работает отлично. Надеюсь, это поможет вам.
Поскольку для меня (и, возможно, для других) это первый хит в Google для работы с сессиями в Vim, я решил немного добавить к ответу @ mathielo о том, как сделать это автоматически.
Мне нравится его код, но добавление решения «только если без аргументов», похоже, немного не хватает. Это моя модифицированная версия:
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
Заметным изменением здесь является необязательное переопределение. Если вы откроете Vim без параметров, он откроет любой существующий сеанс и перезапишет изменения, сделанные при выходе. Если Vim открывается с опциями, он создает новый сеанс, только если он не существует, это означает, что вы можете открывать отдельные файлы в каталоге, в котором есть сеанс, без его перезаписи. Затем вы можете открыть Vim без параметров, чтобы запустить сеанс. Если сеанса не существует, он создает новый.
$HOME/.vim/plugin/sessions.vim
но он не сохраняет файлы сессии. ¯ \ _ (ツ) _ / ¯
Есть этот замечательный плагин call vim-session . Это очень мощно. Чтобы установить это:
cd ~/.vim/bundle
git clone https://github.com/xolox/vim-session.git
Я сопоставил его функциональность в моем .vimrc
файле следующим образом:
nnoremap <leader>so :OpenSession
nnoremap <leader>ss :SaveSession
nnoremap <leader>sd :DeleteSession<CR>
nnoremap <leader>sc :CloseSession<CR>
Теперь в обычном режиме просто наберите, <leader>ss
и вы увидите такую команду
:SaveSession
Теперь добавьте название вашей сессии
:SaveSession namesession
и это все.
Когда вы закрываете Vim и снова открываете его, просто
:OpenSession
и вы увидите вашу сессию открытой.
Существует много других настроек, которые можно добавить в ваш .vimrc
файл, см. Документацию для примеров:
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
На YouTube есть хороший учебник .
Лично я просто обертываю плагин Tim Pope's Obsession, чтобы дать возможность определить sessiondir
и избежать ввода пути:
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
Спасибо @mathielo Следуя примеру @mathielo, я добавил следующую строку в .vimrc, чтобы сохранить активный сеанс (если есть):
au VimLeave * if this_session != "" | exe "mksession! ".this_session
Если вы хотите поместить больше строк, вам нужно использовать endif:
au VimLeave * if v:this_session != ""
au VimLeave * exe "mksession! ".this_session
au VimLeave * endif
Вам нужно только сохранить новый сеанс в VIM с
:mks [Session filename]
и после начала с
$ vim -S [Session filename]
vim начнет сеанс, и вам не нужно беспокоиться о том, чтобы сохранять сеанс каждый раз, когда вы закрываете vim.
Если у вас нет активного сеанса .vimrc ничего не сделает. Как прежде.
Вот что я искал! Еще раз спасибо @mathielo!
:q
вместо :bd
... Спасибо!
Если вы планируете провести только 1 сеанс для проекта, просто сделайте
:mks
который создаст Session.vim
файл в текущем каталоге, а затем откроет сеанс (из того же каталога):
vim -S
Если вы изменили сеанс и хотите сохранить его:
:mks!
Это сохраняет сеанс, а не сами файлы!
Если вы планируете иметь несколько сессий , я предпочитаю сохранять их в скрытых файлах в каталоге проекта:
:mks .session-name.vim
Чтобы открыть его (из того же каталога):
vim -S .session-name.vim
Сохранить сессию:
:mks! .session-name.vim
Поскольку сеансы сохраняются в скрытых файлах, для их просмотра не забудьте -a
ls -a
Вы можете хранить сессию где угодно.
Пример:
:mksession! D:/session.ses
Это сохраняет сессию на диске D.
Это можно открыть, набрав
:so D:/session.ses
в любом из файлов VIM.
Ниже приведен единственный конф. это действительно сработало для меня. Я взял его отсюда , где вы также можете взять более полную / сложную версию.
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
Для управления несколькими сессиями (для каждого каталога / репо) я недавно переключился с плагина vim-session на vim-workspace . Его управление сессиями относительно простое и работает довольно хорошо.
man
странице