Как сохранить и восстановить несколько различных сеансов в Vim?



в зависимости от моей задачи в Vim у меня есть несколько открытых вкладок.



Как я могу сохранить различные сеансы для последующего использования?

640   14  
vim

14 ответов:

вы хотите что-то вроде

:mksession ~/mysession.vim

затем вы можете отправить этот файл vim, и вы вернете свой старый сеанс:

:source ~/mysession.vim

или откройте vim с опцией-S:

$ vim -S ~/mysession.vim

вы можете установить эти параметры сеанса в ваш vimrc. Особенно параметры раздражает, когда вы изменили свой vimrc после сохранения сеанса.

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

обратите внимание, что :mksession не будет сохранить изменения в любые файлы, которые вы сделали. Я сделал эту ошибку, закрыв vim после сохранения сеанса, предполагая, что я возьмусь оттуда. Но в следующий раз, когда я открыл сеанс, изменения, которые я внес в файлы, исчезли.

Если вы используете NERDTree как ваш проводник/тире, я бы порекомендовал xolox/vim-session плагин вместо встроенной команды mksession. По какой-то причине :mksession не удается восстановить буферы NERDTree. Ваш пробег может отличаться, но я подумал, что поделюсь своим опытом.

если вы хотите автоматизировать процесс без использования каких-либо плагинов, вы могли бы использовать уходи и возвращайся С ВИМ Советы Вики.

каждый раз, когда вы выходите из 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's предложение, вы можете заменить VimEnter линия для этих, Если вы хотите Vim для загрузки сессия только если аргументы не указаны:

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

есть очень полезный плагин для этой задачи vim-startify который обрабатывает многие другие вещи, такие как недавно открытые файлы и т. д., Он также имеет очень простой интерфейс.

Я использую его с пару дней и до сих пор его работает отлично. Надеюсь, это поможет вам.

есть этот замечательный плагин вызова vim-сессия. Он очень мощный. Чтобы установить его:

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

я сопоставил его функциональность в моем такой:

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.

поскольку это первый хит в Google для меня (и, вероятно, других) для работы с сессиями в Vim, я решил добавить немного к ответу @mathielo о том, как сделать это автоматически.

Мне нравится его код, но добавление "только если без args" решение, казалось, немного не хватает. Это моя измененная версия:

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 без параметров для запуска сеанса вместо этого. Если сеанс не существует, он создает новый.

спасибо @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!

лично я просто обертываю Тима Поупа одержимость плагин, чтобы разрешить определение 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

вы можете хранить сессии, где вы хотите.

Ex:

:mksession! D:/session.ses

это сохраняет сеанс в диске D.

Это можно открыть, введя

:so D:/session.ses

в любом из файлов vim.

Ниже приведен только conf. это действительно сработало для меня. Я взял его у здесь, где вы также можете взять более полную/сложную версию.

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

если вы планируете иметь только 1 сеанс для проекта просто сделать

:mks

который создаст Session.vim файл в текущем каталоге, а затем открыть сеанс (из того же каталога):

vim -S

если вы измените сеанс и хотите сохранить его:

:mks!

это сохраняет сеанс, а не сами файлы!

если вы планируете иметь несколько сессий, Я предпочитаю сохранить их в скрытых файлах в каталоге проекта:

:mks .session-name.vim

чтобы открыть его (из того же каталога):

vim -S .session-name.vim

сохранить сеанс:

:mks! .session-name.vim

так как сеансы сохраняются в скрытых файлах, для их просмотра не забывайте -a

ls -a

для управления несколькими сеансами (на основе каталога/РЕПО) я недавно переключился с плагина vim-session на vim-workspace. Его управление сеансами относительно простое и работает довольно хорошо.

Comments

    Ничего не найдено.