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


367

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

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


16
@ldigas Я думаю, что ppl удобнее находить вопрос здесь (с крупным шрифтом, отличным форматированием ...), чем на старом школьном форуме или в документации терминала, или, боже упаси, на manстранице
puk

6
@ ldigas Меня лично всегда пугали страницы руководства, потому что они не настолько глупы. Как и все остальное в Linux, у него крутая кривая обучения.
puk

45
@Idigas - я думаю, вы упускаете из виду тот факт, что между нами, google и управлением мета-знаний переполнения стека - это просто лучший способ получить ответы - что вам нужно, а не длинный список эзотерических вариантов, также, как эта страница иллюстрирует реальный опыт ловушек, и часто очень удобные ярлыки, чтобы сделать вашу жизнь проще. Это в равной степени относится практически к любому руководству, которое я смотрел (за исключением, может быть, руководства по PHP) Viva StackOverflow!
ErichBSchulz

2
@ldigas и люди могут использовать его для дальнейшего использования, так как это может понадобиться кому-то еще.
Мансуро

4
@idigas Я думаю, что эти вопросы реальны в том смысле, что новичок в vim мало знает о системе помощи и о том, как ее использовать, но если они получат больше опыта, они узнают, как найти свой путь в vim.
Эдгар Клеркс

Ответы:


494

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

:mksession ~/mysession.vim

Затем вы можете получить исходный файл vim и вернуться к старому сеансу:

:source ~/mysession.vim

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

$ vim -S ~/mysession.vim

27
Ооо, и я почти забыл, что вы можете загрузить его обратно, набрав: gvim -S ~ / mysession.vim
Benj

1
Спасибо @ Бендж. Я новичок в VIM. Как я могу «источник» в командной строке?
Йогуса

1
По электронной почте Ой! Извините, Бендж, я имел в виду командный режим. Я уже нашел это: ``: source ~ / mysession.vim´´.
Йогуса

8
Коротко: так ~ / файл. Если вам захочется получить текущий файл просто: так что% сделает всю работу за вас.
Даниэль Баулиг,

14
Если вы не укажете имя файла сеанса, по умолчанию будет выполняться запись и чтение Session.vim. Поэтому, если вы хотите сохранить только один сеанс в текущем каталоге, вы можете использовать :mksessionили :mksиз vim, чтобы сохранить текущий сеанс и просто vim -Sоткрыть его обратно.
анишпатель

59

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

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

1
Большой! У меня была именно эта проблема вчера. Большое спасибо!
Йогуса

40

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


11
Это должно прийти с любым ответом, связанным с :mksession.
Морган Уайлд

1
да, вы, вероятно, хотите следовать с:wqa
JonnyRaa

11
или просто на :xaодно нажатие клавиши меньше. Ура!
Робин

Вы также можете настроить vim на автоматическое сохранение файлов (если вам это нравится) в вашем .vimrc: vimrc au FocusLost * silent! wa Это будет автоматически сохранять каждый раз, когда буфер теряет фокус.
Грего

32

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


Для macvim мне нужно убедиться: let g:nerdtree_tabs_open_on_gui_startup=0и let g:nerdtree_tabs_open_on_new_tab=0чтобы xolox / vim-session работал.
Нянлян

18

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

1
Возможно, вы захотите открыть сессию, только если для vim не указан аргумент, например. if argc() == 0 au VimEnter * nested :call LoadSession() end
0xc0de

Спасибо @ 0xc0de, отличное предложение (я даже сам начал его использовать). Я обновил ответ.
Матьело

как бы я изменил это так, чтобы, если я открою vim с аргументами, он также не сохранит эту сессию
д-р Манхэттен

очень хорошо, но `exe 'source' b: sessionfile` нужна точка там? и проблема в том, что сеанс автозагрузки зависит от текущего домашнего каталога (как быть pwd), как я могу установить его как последний рабочий каталог перед выходом vim? чтобы он мог загрузить последний рабочий сеанс, а не сеанс под ~/?
Ван Абель

Если вы хотите иметь возможность иметь сеансы, но при этом открывать отдельные файлы в каталоге, не перезаписывая его, посмотрите мою измененную версию этого в отдельном ответе: stackoverflow.com/questions/1642611/…
PMunch

6

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

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


5

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


Я только что попробовал ваше выше опубликованное решение в Neovim 0.2.2 и поместил ваш фрагмент, $HOME/.vim/plugin/sessions.vimно он не сохраняет файлы сессии. ¯ \ _ (ツ) _ / ¯
ipatch

Эта ветка, и особенно связанный комментарий, может помочь: superuser.com/questions/404686/… У меня есть это в моем .vimrc, и это прекрасно работает.
PMunch

все заработало, по-видимому, мне нужно выйти (n) vim, чтобы записать сессию вставьте плохую шутку Еще раз спасибо за публикацию 👍
ipatch

3

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


2

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

У меня были конкретные проблемы с плагином и сеансами авиакомпании. Переход на использование Obsession устранил проблемы, это была удивительная находка после нескольких недель борьбы. См github.com/vim-airline/vim-airline/issues/...
icc97

1

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

1

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

:mks

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

vim -S

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

:mks!

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

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

:mks .session-name.vim

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

vim -S .session-name.vim

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

:mks! .session-name.vim

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

ls -a

0

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

Пример:

:mksession! D:/session.ses

Это сохраняет сессию на диске D.

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

:so D:/session.ses

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


0

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

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

0

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.