Как автоматически сохранить сессию vim при выходе и автоматическую перезагрузку при запуске, включая состояние разделенного окна? - PullRequest
21 голосов
/ 28 февраля 2011

Мне нравится разделять экран vim на 3. one: vsplit и one: split.Я хочу, чтобы эти окна и файлы, над которыми я работал, были сохранены при закрытии vim.Я также хочу, чтобы эти окна автоматически загружались при запуске vim.

Я пытался установить gsessions (только что добавил файл в папку плагина), но ничего не произошло.Я новичок в vim, поэтому не знаю точно, как работает конфигурация.

Ответы [ 8 ]

18 голосов
/ 19 мая 2011

Я немного изменил сценарий 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()
16 голосов
/ 01 марта 2011

Вы можете выполнять в сеансах каталогов с этим свой 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.

4 голосов
/ 16 января 2015

Плагин autosess хорошо работает для этого. Также доступно на GitHub: powerman / vim-plugin-autosess .

Из описания плагина:

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

Когда вы выходите из Vim, если открыто более одной вкладки / окна, сессия будет автоматически сохранена. Это позволит вам редактировать отдельные файлы в тот же каталог, не нарушая сохраненную сессию. (Quickfix и Окна vimdiff игнорируются.)

Если вы выйдете из Vim без открытых файлов, сессия будет удалена. это пусть в следующий раз вы запустите обычный пустой Vim в этом каталоге.

2 голосов
/ 03 февраля 2014

У меня есть привычка мышечной памяти набирать «: 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";
}
2 голосов
/ 28 февраля 2011

С gsessions вам все еще нужно сохранить свои сессии с \ s s перед выходом из редактора.Он обнаружит сохраненные сессии при запуске и спросит вас, хотите ли вы их открыть.

2 голосов
/ 28 февраля 2011

Я использую 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

Все моиоткрытые файлы, вкладки и даже курсоры положения сохраняются перед выходом и восстанавливаются после запуска.

1 голос

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.

0 голосов
/ 30 ноября 2018

tpope's vim-obsession - лучшая вещь для этого сейчас, выпущенная после того, как вопрос был первоначально задан.

Используйте :Obsess (с необязательным именем файла / каталога), чтобы начать запись в файл сеанса и :Obsess!, чтобы остановить и выбросить его. Вот и все. Загрузить сеанс в обычном порядке: vim -S или :source it.

  • Вместо того, чтобы заставить меня вспомнить сеанс непосредственно перед Выйдя из Vim, позвольте мне сделать это в любое время и автоматически повторно вызвать :mksession непосредственно перед выходом.
  • Также вызывайте :mksession всякий раз, когда изменяется макет (в частности, на BufEnter), так что даже если Вим выйдет ненормально, я уйду.
  • Если я загружаю существующий сеанс, автоматически поддерживаю его обновление, как указано выше.
  • Если я попытаюсь создать новый сеанс поверх существующего, не отказывайтесь переписать это. Просто сделай то, что я имею в виду.
...