繁体   English   中英

如何在退出时自动保存 vim session 并在启动时自动重新加载包括拆分 window state?

[英]How to auto save vim session on quit and auto reload on start including split window state?

我喜欢将我的 vim 屏幕拆分为 3.one:vsplit 和 one:split。 我希望在关闭 vim 时保存这些 windows 和我处理的文件。我还希望在启动 vim 时自动加载这些 windows。

我尝试安装gsessions (只是将文件添加到插件文件夹),但没有任何反应。 我是 vim 的新手,所以我不知道配置是如何工作的。

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

您可以使用 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 ,但您可以轻松修改它。 此外,如果您不想为每个文件创建新窗口并将ssop-=buffers添加到您的 vimrc,请将ssop-=buffers更改为 badd。

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 上找到: powerman/vim-plugin-autosess

从插件的描述:

不带文件参数启动 Vim 以自动加载当前目录的前一个会话。 这使得复杂项目的工作更容易 - 只需 chdir 到项目目录并启动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 用于项目,并且每个项目在我的项目的根目录中都有 .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你还有退出编辑器前保存与\\ S你的会话。 它会在启动时检测保存的会话,并询问您是否要打开它们。

tpope 的vim- obsession 是现在最好的东西,在最初提出问题后发布。

使用:Obsess (带有可选的文件/目录名称)开始录制到会话文件和:Obsess! 停下来扔掉它。 就是这样。 以通常的方式加载会话: vim -S:source it。

  • 不要让我记住在退出 Vim 之前立即捕获会话,而是允许我随时执行此操作,并在退出前立即自动重新调用:mksession
  • 每当布局更改时(特别是在BufEnter )也调用:mksession ,这样即使 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

您可以将以下行添加到您的.vimrc文件中,以便在您使用:qa退出 Vim 时自动保存 session:

au VimLeave * mksession! .session.vim

然后自动加载它,添加这个:

autocmd VimEnter * source .session.vim

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM