Как автоматически сохранить сессию vim при выходе и автоматическую перезагрузку при запуске, включая состояние разделенного окна?
Мне нравится разделять экран vim на 3. один: всплит и один: сплит. Я хочу, чтобы эти окна и файлы, над которыми я работал, были сохранены при закрытии vim. Я также хочу, чтобы эти окна автоматически загружались при запуске vim.
Я пытался установить gsessions (только что добавил файл в папку плагина), но ничего не произошло. Я новичок в vim, поэтому не знаю точно, как работает конфигурация.
10 ответов
Вы можете делать по каталогам сессий с этим вашим vimrc:
fu! SaveSess()
execute 'call mkdir(%:p:h/.vim)'
execute 'mksession! %:p:h/.vim/session.vim'
endfunction
fu! RestoreSess()
execute 'so %:p:h/.vim/session.vim'
if bufexists(1)
for l in range(1, bufnr('$'))
if bufwinnr(l) == -1
exec 'sbuffer ' . l
endif
endfor
endif
endfunction
autocmd VimLeave * call SaveSess()
autocmd VimEnter * call RestoreSess()
Это засоряет ваши каталоги с помощью.vim s, но вы можете легко это изменить. Кроме того, измените sbuffer на badd, если вы не хотите новых окон для каждого файла, и добавьте ssop-=buffers
к вашему vimrc.
Я немного изменил скрипт 2ck, чтобы сохранить .session.vim
в текущем рабочем каталоге вместо каталога, в котором находится текущий открытый файл.
Кроме того, он проверяет, существует ли файл, перед его поиском.
fu! SaveSess()
execute 'mksession! ' . getcwd() . '/.session.vim'
endfunction
fu! RestoreSess()
if filereadable(getcwd() . '/.session.vim')
execute 'so ' . getcwd() . '/.session.vim'
if bufexists(1)
for l in range(1, bufnr('$'))
if bufwinnr(l) == -1
exec 'sbuffer ' . l
endif
endfor
endif
endif
endfunction
autocmd VimLeave * call SaveSess()
autocmd VimEnter * nested call RestoreSess()
https://github.com/xolox/vim-session хорошо работает для меня. С Vundle:
Plugin 'xolox/vim-misc'
Plugin 'xolox/vim-session'
let g:session_autoload = 'yes'
let g:session_autosave = 'yes'
let g:session_autosave_to = 'default'
let g:session_verbose_messages = 0
Сессия хранится в ~/.vim/sessions/default.vim
,
Плагин autosess хорошо работает для этого. Также доступно на GitHub: https://github.com/powerman/vim-plugin-autosess.
Из описания плагина:
Запустите Vim без аргументов файла, чтобы автоматически загрузить предыдущий сеанс для текущего каталога. Это облегчает работу со сложными проектами - просто перейдите в каталог проекта и запустите
vim
,Когда вы выходите из Vim, если открыто более одной вкладки / окна, сессия будет автоматически сохранена. Это позволяет редактировать отдельные файлы в одном каталоге, не прерывая сохраненный сеанс. (Окна Quickfix и vimdiff игнорируются.)
Если вы выйдете из Vim без открытых файлов, сессия будет удалена. Это позволит вам в следующий раз запустить обычный пустой Vim в этом каталоге.
У меня есть привычка мышечной памяти набирать ":q!", Которую я не смог поколебать. Это становится очень утомительным, если у меня открыто несколько буферов в сеансе vi. Итак, мне нужен был способ просто прийти в себя, когда я случайно выстрелил себе в ногу. Снова.
Это немного усложняется тем фактом, что у меня может быть открыто несколько сессий ssh одновременно, каждый с разным набором буферов / окон, открытых в vi. Мне нужен был способ сохранения сессии отдельно для каждой отдельной сессии ssh.
Решение, которое я придумал, основано на ответе 2ck и состоит в следующем. В вашем ~/.vimrc:
" tty is unique to the ssh session
let my_full_tty=$SSH_TTY
" scoop the number off the end of it
let my_tty_num = matchstr(my_full_tty, '\d\{1,}$')
" create a unique filename
let g:my_vim_session = "~/vim_session." . my_tty_num
fu! SaveSess()
execute 'mksession! ' . g:my_vim_session
endfunction
fu! RestoreSess()
let file = expand(g:my_vim_session)
if filereadable(file)
execute 'source ' . g:my_vim_session
endif
endfunction
autocmd VimLeave * call SaveSess()
" only restore the session if the user has -not- requested a specific filename
autocmd VimEnter * if !argc() | call RestoreSess() | endif
Но, конечно, я не хочу загружать ~/vim_session. валяется, поэтому я периодически убираюсь. (Я могу переосмыслить это, на самом деле, потому что, что произойдет, если мой ssh неожиданно отключится? Хммм)
В вашем.bashrc:
trap ~/bash_exit_script.pl EXIT
и в bash_exit_script.pl:
#! /usr/bin/perl
use warnings;
use strict;
my $ssh_tty = $ENV{SSH_TTY};
$ssh_tty =~ /(\d{1,}$)/;
my $my_tty_number = $1;
my $filename = "/home/dominic.pain/vim_session.$my_tty_number";
if(-e $filename) {
print "tried to remove $filename...\n";
system("rm $filename");
}
else {
print "Couldn't find $filename\n";
}
Vim-одержимость tpope - лучшая вещь для этого сейчас, выпущенная после того, как вопрос был первоначально задан.
использование
:Obsess
(с необязательным именем файла / каталога), чтобы начать запись в файл сеанса и:Obsess!
остановиться и выбросить. Вот и все. Загрузите сеанс обычным способом:vim -S
, или же:source
Это.
- Вместо того, чтобы заставлять меня не забывать записывать сеанс непосредственно перед выходом из Vim, позвольте мне сделать это в любое время и автоматически повторно вызывать
:mksession
непосредственно перед выходом.- Также вызвать
:mksession
всякий раз, когда макет меняется (в частности, наBufEnter
), так что даже если Вим выйдет ненормально, я ухожу.- Если я загружаю существующий сеанс, автоматически обновляю его, как указано выше.
- Если я пытаюсь создать новый сеанс поверх существующего, не отказывайтесь перезаписать его. Просто делай то, что я имею в виду.
Я использую vim для проектов, и у каждого проекта есть папка.vim в корне моего проекта. и я использую скрипт запуска для vim
#!/bin/bash
if [[ $# != 1 ]]
then
zenity --title "Vim IDE usage error" --error --text "Usage: vim_ide /path/to/project/dir."
exit 1
fi
if [[ ! -e "$1/.vim/ide.vim" ]]
then
zenity --title "Vim IDE usage error" --error --text "'$1' is not a Vim IDE project directory."
exit 1
fi
cd "$1" || { zenity --title "Vim IDE usage error" --error --text "Can't change current directory to Vim IDE project directory '$1'."; exit 1; }
.vim / ide.vim
set sessionoptions-=options
au VimLeave * :mksession! .vim/ide.session
if getfsize(".vim/ide.session") >= 0
source .vim/ide.session
endif
так что я начинаю свой VIM следующей командой
$~/ide.sh /path/to/project
Все мои открытые файлы, вкладки и даже курсоры положения сохраняются перед выходом и восстанавливаются после запуска.
С gsessions
Вы все еще должны сохранить свои сессии с \ss перед выходом из редактора. Он обнаружит сохраненные сессии при запуске и спросит вас, хотите ли вы их открыть.
Вы можете добавить следующую строку в свой.vimrc
файл для автоматического сохранения сеанса при выходе из Vim с помощью:qa
:
au VimLeave * mksession! .session.vim
Затем, чтобы автоматически загрузить его, добавьте следующее:
autocmd VimEnter * source .session.vim
Улучшение @Wolph - это более надежный код, который обрабатывает каждый сеанс для каждого файла отдельно:
" vim auto-save session
fu! SaveSess()
execute 'mksession! ' . getcwd() . '/.' . expand('%:t') . '.vim'
endfunction
fu! RestoreSess()
if filereadable(getcwd() . '/.' . expand('%:t') . '.vim')
execute 'so ' . getcwd() . '/.' . expand('%:t') . '.vim'
if bufexists(1)
for l in range(1, bufnr('$'))
if bufwinnr(l) == -1
exec 'sbuffer ' . l
endif
endfor
endif
endif
endfunction
autocmd VimLeavePre * call SaveSess()
autocmd VimEnter * nested call RestoreSess()
Поместите этот код на
.vimrc