Как сохранить и восстановить несколько разных сессий в Vim? - PullRequest
356 голосов
/ 29 октября 2009

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

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

Ответы [ 14 ]

479 голосов
/ 29 октября 2009

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

:mksession ~/mysession.vim

Затем вы можете получить исходный файл vim, и ваш старый сеанс будет возвращен:

:source ~/mysession.vim

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

$ vim -S ~/mysession.vim
58 голосов
/ 30 октября 2009

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

set ssop-=options    " do not store global and local values in a session
set ssop-=folds      " do not store folds
39 голосов
/ 23 октября 2012

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

31 голосов
/ 12 ноября 2012

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

14 голосов
/ 13 августа 2015

Если вы хотите автоматизировать процесс без использования каких-либо плагинов, вы можете использовать Уходить и возвращаться из 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
5 голосов
/ 28 марта 2014

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

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

3 голосов
/ 05 декабря 2017

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

3 голосов
/ 19 мая 2015

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

1 голос
/ 08 декабря 2016

Лично я просто обернулся над плагином Тима Папы * 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
1 голос
/ 20 августа 2016

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...