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

Session 如何在退出时自动保存vim会话,并在启动时自动重新加载,包括拆分窗口状态?,session,configuration,vim,Session,Configuration,Vim,我喜欢把我的vim屏幕一分为三。一个:vsplit,一个:split。我希望在关闭vim时保存这些窗口和我处理的文件。我还希望在启动vim时自动加载这些窗口 我试图安装(只是将文件添加到插件文件夹),但什么也没发生。我是vim新手,所以我不知道配置是如何工作的 我对项目使用vim,每个项目的根目录中都有.vim文件夹。 我使用vim的启动脚本 #!/bin/bash if [[ $# != 1 ]] then zenity --title "Vim IDE usage error

我喜欢把我的vim屏幕一分为三。一个:vsplit,一个:split。我希望在关闭vim时保存这些窗口和我处理的文件。我还希望在启动vim时自动加载这些窗口


我试图安装(只是将文件添加到插件文件夹),但什么也没发生。我是vim新手,所以我不知道配置是如何工作的

我对项目使用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执行每个目录会话:

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,但您可以轻松地修改它。另外,如果您不想为每个文件添加新窗口,请将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()

我有一个肌肉记忆的习惯,就是键入“: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_会话。?到处躺着,所以我定期清理。(实际上,我可能会重新考虑这一点,因为如果我的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";
}
这个插件可以很好地实现这一点。也可在GitHub上获得:

根据插件的描述:

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

从Vim退出时,如果有多个打开的选项卡/窗口, 会话将自动保存。这使您可以在中编辑单个文件 相同的目录,而不中断保存的会话。(快速修复和 vimdiff的窗口被忽略。)

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

对我来说很好。使用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

t在最初提出问题后发布的Ope是最好的选择

使用
:consold
(可选文件/目录名)开始录制到 会话文件和
:痴迷停止并扔掉它。就这样。装载
会话的常规方式:
vim-S
,或
:source

  • 而不是让我记得在开始之前抓拍会话 退出Vim,允许我随时执行,并自动重新调用
    :退出前的mksession
  • 每当布局更改时(特别是在
    BufEnter
    ),这样即使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

我使用windows,我可以不用bash脚本来完成此操作吗?我不知道如何编写win脚本。您知道vim的内置会话管理吗?它不是自动的,但可以节省大量的时间<代码>:mksession
在离开vim之前,
vim-S Session.vim
在以后加载该会话。关于退出时自动保存会话的注意事项:如果您不小心,如果vim在退出时崩溃,您可能会用损坏的会话文件覆盖会话文件(我曾经遇到过这种情况)。或者,当Vim失去焦点时,您可能真的想让它保存,但您不知道您可以这样做:您是什么意思。我不知道如何保存执行
\ss
命令…在正常模式下按
\s
键。这将保存您的会话,如果没有会话文件,则创建一个会话文件。值得注意的是,
`(标准引线键)和
s`必须快速按下,否则,
`将失去作为
`修饰符的含义。我喜欢“语法打开”。。。但也许它不属于这里?@ErichBSchulz:不知怎的,没有它,我就无法打开语法高亮显示。但它可能是我的设置或其他特定的东西。天哪,这是很多尾随空格。当你把它复制出来的时候,你的终端一定是全屏的。我试着把它添加到我的vimrc中,但是在RestoreSess和after/plugin/*.vim脚本中得到了一些非常奇怪的交互。基本上,每当它运行RestoreSess时,我的after/plugin/*.vim脚本都无法运行。无法真正理解它,因此我必须找到另一种方法来自动保存会话…它不应该真正与其他脚本交互,而是恢复状态ca