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

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

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

Ответ 1

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

:mksession ~/mysession.vim

Затем вы можете загрузить этот файл vim, и у вас будет старый сеанс:

:source ~/mysession.vim

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

$ vim -S ~/mysession.vim

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

Если вы хотите автоматизировать процесс без использования каких-либо плагинов, вы можете использовать Уйти и вернуться из 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()

Даже для новичков это script несколько легко понять и настроить.

Обратите внимание: этот script будет работать только для Unix-систем (MacOS/Linux), его необходимо адаптировать для работы в Windows.


UPDATE: Добавив 0xc0de, вы можете заменить строку VimEnter для этих, если вы хотите, чтобы Vim загружал сеанс , если аргументы не указаны:

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

Ответ 6

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

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

Ответ 7

Этот замечательный плагин вызывает 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 есть хороший учебник.

Ответ 8

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

Ответ 9

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

Пример:

:mksession! D:/session.ses

Сохраняет сеанс в драйвере D.

Это можно открыть, набрав

:so D:/session.ses

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

Ответ 10

Ниже приведен только 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

Ответ 11

Лично я просто обернуваю плагин 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

Ответ 12

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

:mks

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

vim -S

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

:mks!

Это сохраняет сеанс, а не файлы!

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

:mks .session-name.vim

Чтобы открыть его (из той же директории):

vim -S .session-name.vim

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

:mks! .session-name.vim

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

ls -a

Ответ 13

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