首页 文章

如何在Vim中保存和恢复多个不同的会话?

提问于
浏览
345

根据我在Vim中的任务,我打开了几个标签 .

如何保存不同的会话供以后使用?

14 回答

  • 13

    您可以在任何地方存储会话 .

    例如:

    :mksession! D:/session.ses
    

    这会将会话存储在D盘中 .

    这可以通过输入打开

    :so D:/session.ses
    

    在任何vim文件中 .

  • 58

    为了管理多个会话(基于每个目录/ repo),我最近从vim-session插件切换到vim-workspace . 它的会话管理相对简单,运行良好 .

  • 38

    谢谢@mathielo以下来自@mathielo的示例,我将以下行添加到.vimrc以保存活动会话(如果有):

    au VimLeave * if this_session != "" | exe "mksession! ".this_session
    

    如果你想放更多行,你需要使用endif:

    au VimLeave * if v:this_session != ""
    au VimLeave *   exe "mksession! ".this_session
    au VimLeave * endif
    

    您只需要在vim中保存一个新会话

    :mks [Session filename]
    

    并在开始之后

    $ vim -S [Session filename]
    

    vim将启动会话,每次关闭vim时都不必担心保存会话 .

    如果您没有活动会话.vimrc将不会执行任何操作 . 像之前一样 .

    那就是我在寻找的东西!再次感谢@mathielo!

  • 3

    如果您使用NERDTree作为文件资源管理器/破折号,我建议使用xolox/vim-session plugin而不是内置:mksession命令 . 出于某种原因,:mksession无法恢复NERDTree缓冲区 . 您的里程可能会有所不同,但我想我会分享我的经验 .

  • 0

    这个任务有一个非常有用的插件vim-startify,它处理许多其他的东西,比如最近打开的文件等,它也有一个非常简单的界面 .

    我使用它几天,直到现在它的工作完美 . 希望它能帮到你 .

  • 1

    有这个精彩的插件电话vim-session . 它非常强大 . 要安装它:

    cd ~/.vim/bundle
    git clone https://github.com/xolox/vim-session.git
    

    我在我的 .vimrc 文件中映射了它的功能,如下所示:

    nnoremap <leader>so :OpenSession 
    nnoremap <leader>ss :SaveSession 
    nnoremap <leader>sd :DeleteSession<CR>
    nnoremap <leader>sc :CloseSession<CR>
    

    现在在正常模式下输入 <leader>ss ,你会看到这样的命令

    :SaveSession
    

    现在添加会话名称

    :SaveSession namesession
    

    就这样 .

    当你关闭Vim并重新打开它时

    :OpenSession
    

    你会看到你的会话开放 .

    要在 .vimrc 文件中添加许多其他配置,请参阅文档以获取示例:

    let g:session_directory = "~/.vim/tmp/session"  // the directory must be created before the sessions will be saved there
    let g:session_autoload = "no"                   // automatic reload sessions
    let g:session_autosave = "no"                   // autosave
    let g:session_command_aliases = 1
    

    YouTube上有一个很好的tutorial .

  • 30

    就个人而言,我只是将Tim Pope的Obsession插件包裹起来以允许定义 sessiondir 并避免输入路径:

    let g:sessiondir = $HOME . ".vim/sessions"
    
    command! -nargs=1 MkSession call MkSession(<f-args>)
    function! MkSession(sessionfile)
      if !isdirectory(g:sessiondir)
        call mkdir(g:sessiondir, "p")
      endif
      exe 'Obsession' g:sessiondir . '/' . a:sessionfile
    endfunction
    
    command! -nargs=1 LoadSession call LoadSession(<f-args>)
    function! LoadSession(sessionfile)
    
      let a:sessionpath = g:sessiondir . a:sessionfile
      if (filereadable(a:sessionpath))
        exe 'source ' a:sessionpath
      else
        echo "No session loaded."
      endif
    endfunction
    
  • 3

    您可能希望在vimrc中设置这些会话选项 . 特别是在保存会话后更改vimrc时,选项很烦人 .

    set ssop-=options    " do not store global and local values in a session
    set ssop-=folds      " do not store folds
    
  • 463

    If you plan having only 1 session for the project just do

    :mks
    

    这将在当前目录中创建 Session.vim 文件,然后打开会话(来自同一目录):

    vim -S
    

    如果您更改会话并想要保存它:

    :mks!
    

    这会保存会话,而不是文件本身!

    If you plan having multiple sessions ,我更喜欢将它们保存在项目目录中的隐藏文件中:

    :mks .session-name.vim
    

    要打开它(从同一目录):

    vim -S .session-name.vim
    

    保存 Session :

    :mks! .session-name.vim
    

    由于会话保存在隐藏文件中,要查看它们不要忘记 -a

    ls -a
    
  • 1

    如果要在不使用任何插件的情况下自动执行该过程,可以使用Vim Tips Wiki来自Vim Tips Wiki .

    每次退出Vim时,它都会将当前会话保存在 ~/.vim/sessions 下,并在打开Vim后再次加载 . 它也基于您当前的路径,因此如果您从不同的目录打开Vim,您将拥有不同的会话,这在处理不同的项目时非常有用 .

    只需编辑 ~/.vimrc 文件并添加以下内容:

    function! MakeSession()
      let b:sessiondir = $HOME . "/.vim/sessions" . getcwd()
      if (filewritable(b:sessiondir) != 2)
        exe 'silent !mkdir -p ' b:sessiondir
        redraw!
      endif
      let b:filename = b:sessiondir . '/session.vim'
      exe "mksession! " . b:filename
    endfunction
    
    function! LoadSession()
      let b:sessiondir = $HOME . "/.vim/sessions" . getcwd()
      let b:sessionfile = b:sessiondir . "/session.vim"
      if (filereadable(b:sessionfile))
        exe 'source ' b:sessionfile
      else
        echo "No session loaded."
      endif
    endfunction
    
    " Adding automatons for when entering or leaving Vim
    au VimEnter * nested :call LoadSession()
    au VimLeave * :call MakeSession()
    

    即使是初学者,这个脚本也有点容易理解和定制 .

    Please note 此脚本仅适用于Unix系统(MacOS / Linux),需要适应在Windows上运行 .


    UPDATE: 添加0xc0de的建议,如果你想让Vim加载会话 only if no arguments are provided ,你可以替换这些的 VimEnter 行:

    if(argc() == 0)
      au VimEnter * nested :call LoadSession()
    endif
    
  • 0

    请注意:mksession不会将更改保存到您所创建的任何文件中 . 假设我将从那里开始,我在保存会话后犯了关闭vim的错误 . 但是下次我打开会话时,我对文件所做的更改就消失了 .

  • 0

    由于这是我第一次在谷歌(以及其他人)对Vim如何使用会话的打击,我决定在@ mathielo上添加一些关于如何使其自动化的答案 .

    我喜欢他的代码,但添加“只有没有args”的解决方案似乎有点缺乏 . 这是我修改过的版本:

    function! MakeSession(overwrite)
      let b:sessiondir = $HOME . "/.vim/sessions" . getcwd()
      if (filewritable(b:sessiondir) != 2)
        exe 'silent !mkdir -p ' b:sessiondir
        redraw!
      endif
      let b:filename = b:sessiondir . '/session.vim'
      if a:overwrite == 0 && !empty(glob(b:filename))
        return
      endif
      exe "mksession! " . b:filename
    endfunction
    
    function! LoadSession()
      let b:sessiondir = $HOME . "/.vim/sessions" . getcwd()
      let b:sessionfile = b:sessiondir . "/session.vim"
      if (filereadable(b:sessionfile))
        exe 'source ' b:sessionfile
      else
        echo "No session loaded."
      endif
    endfunction
    
    " Adding automatons for when entering or leaving Vim
    if(argc() == 0)
      au VimEnter * nested :call LoadSession()
      au VimLeave * :call MakeSession(1)
    else
      au VimLeave * :call MakeSession(0)
    endif
    

    这里值得注意的变化是可选的覆盖 . 如果您在没有选项的情况下打开Vim,它将打开任何现有会话并覆盖您离开时所做的更改 . 如果使用选项打开Vim,它将仅创建一个新会话(如果不存在),这意味着您可以在具有会话的目录中打开单个文件而不覆盖它 . 然后,您可以打开Vim而无需选项来运行会话 . 如果没有会话,则会创建一个新会话 .

  • 5

    你想要的东西

    :mksession ~/mysession.vim
    

    然后你可以来源那个vim文件,你将恢复旧会话:

    :source ~/mysession.vim
    

    或使用-S选项打开vim:

    $ vim -S ~/mysession.vim
    
  • 0

    以下是唯一的conf . 这真的对我有用 . 我从here开始,你可以在那里采用更完整/复杂的版本 .

    set viewoptions+=cursor,folds,slash,unix
    set viewoptions-=options
    
    augroup vimrc
        autocmd BufWritePost *
        \   if expand('%') != '' && &buftype !~ 'nofile'
        \|      mkview
        \|  endif
        autocmd BufRead *
        \   if expand('%') != '' && &buftype !~ 'nofile'
        \|      silent loadview
        \|  endif
    augroup END
    

相关问题