如何在退出时自动保存vim会话并在启动时自动重新加载包括拆分窗口状态?

时间:2011-02-28 12:39:30

标签: session configuration vim

我喜欢将我的vim屏幕拆分为3. one:vsplit和one:split。当我关闭vim时,我想要保存这些窗口和我工作的文件。我还希望这些窗口在我启动vim时自动加载。

我尝试安装gsessions(刚刚将文件添加到插件文件夹中),但没有发生任何事情。我是vim的新手,所以我不确切知道配置是如何工作的。

9 个答案:

答案 0 :(得分:18)

我稍微修改了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()

答案 1 :(得分:16)

您可以使用这个目录进行会话,这是您的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乱丢你的目录,但是你可以很容易地修改它。另外,如果您不想为每个文件添加新窗口并将ssop-=buffers添加到您的vimrc,请将sbuffer更改为badd。

答案 2 :(得分:4)

autosess插件适用于此。也可以在GitHub上找到:powerman/vim-plugin-autosess

来自插件的说明:

  

在没有文件参数的情况下启动Vim以自动加载上一个   当前目录的会话。这使得复杂的工作变得更容易   项目 - 只需chdir到项目目录并启动vim

     

当您退出Vim时,如果有多个打开的标签/窗口,   会话将自动保存。这允许您编辑单个文件   同一目录,不破坏已保存的会话。 (Quickfix和   vimdiff的窗户被忽略了。)

     

如果您在没有打开文件的情况下退出Vim,会话将被删除。这个   让你下次在这个目录中启动常用的空Vim。

答案 3 :(得分:2)

我使用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

我所有打开的文件,标签甚至位置光标都会在退出前保存并在启动后恢复。

答案 4 :(得分:2)

使用gsessions,您仍需要在退出编辑器之前使用 \ s s 保存会话。它将在启动时检测已保存的会话,并询问您是否要打开它们。

答案 5 :(得分:2)

我有一种记忆习惯的肌肉记忆习惯: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";
}

答案 6 :(得分:1)

https://docs.angularjs.org/tutorial/step_01 对我来说效果很好。随着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

答案 7 :(得分:0)

tpope的vim-obsession是目前最好的选择,它是在最初提出问题后发布的。

  

使用:Obsess(带有可选的文件/目录名称)开始记录到   会话文件和:Obsess!停止并丢弃它。而已。加载一个   会话以通常的方式进行:vim -S:source

     
      
  • 不是让我记得紧接在之前捕获会话   退出Vim,允许我随时执行此操作,然后自动重新调用   :mksession即将退出。
  •   
  • 每当布局更改时(尤其是在   :mksession),这样即使Vim异常退出,我也很好。
  •   
  • 如果我加载现有会话,则自动按照上述进行更新。
  •   
  • 如果我尝试在现有会话之上创建一个新会话,请不要拒绝   覆盖它。照我的意思做吧。
  •   

答案 8 :(得分:0)

改进@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