Як зберегти та відновити кілька різних сеансів у 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
Дякую @Benj. Я новий у vim. Як я можу "джерело" в командному рядку?
Джогуза

1
Оупс! Вибачте Бендж, я мав на увазі командний режим. Я його вже знайшов: ``: source ~ / mysession.vim´´.
Джогуза

8
Короткий: так ~ / файл. Якщо ви хочете джерело поточного файлу просто: так% зробить роботу за вас.
Даніель Бауліг

14
Якщо ви не вказали ім'я файлу сеансу, воно буде за замовчуванням для запису та читання з Session.vim. Отже, якщо ви хочете, щоб у вашому поточному каталозі було збережено лише один сеанс, ви можете скористатися програмою vim :mksessionабо :mksвід vim, щоб зберегти ваш поточний сеанс та просто vim -Sвідкрити його.
anishpatel

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 Це автоматично збереже будь-який час, коли буфер втрачає фокус.
grego

32

Якщо ви використовуєте NERDTree як провідник файлів / тире, я б рекомендував плагін 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-сеанс.
Nianliang

18

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

як би я змінив це так, що якщо я відкрию vim з аргументами, це також не врятує цю сесію
д-р Манхеттен

дуже добре, але 'exe' source 'b: sessionfile' потребує крапки там? і проблема полягає в тому, що сеанс автозавантаження залежить від поточного домашнього каталогу (get by pwd), як я можу встановити, що це остання робоча директорія перед виходом vim? щоб він міг завантажувати останній робочий сеанс, а не сеанс ~/?
van abel

Якщо ви хочете , щоб мати можливість сесії , але по- , як і раніше відкривати окремі файли в каталозі , НЕ переписуючи його перевірити мою модифіковану версію цього в окрему відповідь: 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

Існує цей чудовий плагін вим-сесії . Це дуже потужно. Щоб встановити його:

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

Особисто я просто надягаю плагін Тіма Попса " 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/isissue/…
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

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-робочу область . Управління сеансом відносно просте і працює досить добре.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.