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

0wi1tuuw  于 2022-11-24  发布在  其他
关注(0)|答案(9)|浏览(249)

我喜欢把我的vim屏幕分成3个部分。一个是vsplit,另一个是split。我希望当我关闭vim时,这些窗口和我处理过的文件能被保存。我还希望当我启动vim时,这些窗口能自动加载。
我试着安装gsessions(只是把文件添加到插件文件夹),但是什么都没有发生。我是Vim的新手,所以我不知道具体的配置是如何工作的。

gkn4icbw

gkn4icbw1#

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

yftpprvb2#

你可以做每个目录会话与这是你的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,并在vimrc中添加ssop-=buffers

kyvafyod

kyvafyod3#

**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中。

332nm8kg

332nm8kg4#

autosess插件可以很好地实现这一点。GitHub上也有:是的。
从插件的描述:
启动Vim时不带文件参数,自动加载当前目录的前一个会话。这使得处理复杂项目变得更容易-只需chdir到项目目录,然后启动vim
当你退出Vim时,如果有多个打开的标签/窗口,会话会被自动保存。这让你可以在同一个目录下编辑单个文件而不会中断你保存的会话。(Quickfix和vimdiff的窗口会被忽略。)
如果您退出Vim时没有打开文件,会话将被删除。这将允许您下次在此目录中启动通常的空Vim。

huwehgph

huwehgph5#

我使用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/版本.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

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

plicqrtu

plicqrtu6#

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

xv8emn3q

xv8emn3q7#

我有一个肌肉记忆的习惯,我一直无法摆脱键入“: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";
}
z9zf31ra

z9zf31ra8#

tpope的vim-obsession是现在最好的,在最初提出这个问题后发布。
使用:Obsess(文件/目录名可选)开始记录到会话文件,使用:Obsess!停止并丢弃它。就是这样。以通常的方式加载会话:vim -S,或者:source它。

  • 不要让我记得在退出Vim之前立即捕获会话,而是允许我在任何时候捕获会话,并在退出之前立即自动重新调用:mksession
  • 每当布局发生变化时(特别是在BufEnter上),还要调用:mksession,这样即使Vim异常退出,我也可以继续运行。
  • 如果加载现有会话,则自动保持如上所述的更新。
  • 如果我试图在现有会话的基础上创建一个新会话,不要拒绝覆盖它。按照我的意思去做就行了。
368yc8dk

368yc8dk9#

在@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

相关问题