Залежно від мого завдання в Vim, у мене відкрито кілька вкладок.
Як я можу зберегти різні сеанси для подальшого використання?
Залежно від мого завдання в Vim, у мене відкрито кілька вкладок.
Як я можу зберегти різні сеанси для подальшого використання?
Відповіді:
Ти хочеш чогось подібного
:mksession ~/mysession.vim
Потім пізніше ви можете надіслати цей файл vim, і ви матимете назад свій старий сеанс:
:source ~/mysession.vim
або відкрити vim з опцією -S:
$ vim -S ~/mysession.vim
Session.vim
. Отже, якщо ви хочете, щоб у вашому поточному каталозі було збережено лише один сеанс, ви можете скористатися програмою vim :mksession
або :mks
від vim, щоб зберегти ваш поточний сеанс та просто vim -S
відкрити його.
Ви можете встановити ці параметри сеансу у своєму vimrc. Особливо дратує варіанти, коли ви змінили свій vimrc після збереження сеансу.
set ssop-=options " do not store global and local values in a session
set ssop-=folds " do not store folds
Зауважте, що: mksession не збереже зміни до жодного створеного вами файлу. Я допустив цю помилку, коли закрив vim, зберігаючи сесію, припускаючи, що я зроблюся звідти. Але наступного разу, коли я відкрив сеанс, зміни, внесені до файлів, не відбулися.
:mksession
.
:wqa
:xa
Один менш натискання клавіш. Так!
.vimrc
: vimrc au FocusLost * silent! wa
Це автоматично збереже будь-який час, коли буфер втрачає фокус.
Якщо ви використовуєте NERDTree як провідник файлів / тире, я б рекомендував плагін xolox / vim-session замість вбудованої команди: mksession. Чомусь: mksession не може відновити буфери NERDTree. Ваш пробіг може відрізнятися, але я подумав, що поділюсь своїм досвідом.
let g:nerdtree_tabs_open_on_gui_startup=0
і let g:nerdtree_tabs_open_on_new_tab=0
зробити xolox / vim-сеанс.
Якщо ви хочете автоматизувати процес без використання жодних плагінів, ви можете скористатися Перейти та повернутися з 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
if argc() == 0 au VimEnter * nested :call LoadSession() end
pwd
), як я можу встановити, що це остання робоча директорія перед виходом vim? щоб він міг завантажувати останній робочий сеанс, а не сеанс ~/
?
Для цього завдання vim-startify є дуже корисний плагін, який обробляє багато інших речей, як нещодавно відкриті файли тощо, також має дуже простий інтерфейс.
Я використовую його з декількох днів і до цього часу він працює чудово. Сподіваюся, це допоможе вам.
Оскільки це для мене (і, мабуть, інших) це перше звернення в 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 без опцій, щоб замість цього запустити сеанс. Якщо сеансу не існує, він створює новий.
$HOME/.vim/plugin/sessions.vim
але це не збереження файлів сеансу. ¯ \ _ (ツ) _ / ¯
Існує цей чудовий плагін вим-сесії . Це дуже потужно. Щоб встановити його:
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 є хороший підручник .
Особисто я просто надягаю плагін Тіма Попса " 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
Дякую @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
... Спасибі!
Якщо ви плануєте провести лише 1 сеанс для проекту, просто зробіть це
:mks
який створить Session.vim
файл у поточному каталозі, а потім відкриє сеанс (з тієї ж директорії):
vim -S
Якщо ви змінили сеанс і хочете зберегти його:
:mks!
Це економить сеанс, а не самі файли!
Якщо ви плануєте проводити кілька сеансів , я вважаю за краще зберігати їх у прихованих файлах у каталозі проекту:
:mks .session-name.vim
Щоб відкрити його (з того самого каталогу):
vim -S .session-name.vim
Зберегти сеанс:
:mks! .session-name.vim
Оскільки сеанси зберігаються у прихованих файлах, для їх перегляду не забувайте -a
ls -a
Ви можете зберігати сеанс де завгодно.
Наприклад:
:mksession! D:/session.ses
Це зберігає сеанс у D-накопичувачі.
Це можна відкрити, набравши текст
:so D:/session.ses
у будь-якому з файлів vim.
Нижче - єдиний конф. що справді працювало для мене. Я взяв це звідси , де ви також можете взяти більш повну / складну версію.
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
Для управління кількома сеансами (на основі каталогу / репо) я нещодавно перейшов з плагіна vim-session на vim-робочу область . Управління сеансом відносно просте і працює досить добре.
man
сторінці