2009-10-29 50 views
326

根據我在Vim中的任務,我打開了幾個選項卡。如何在Vim中保存和恢復多個不同的會話?

如何保存不同會話供以後使用?

+15

@ldigas我認爲在這裏找到問題比使用舊的學校論壇或終端文檔或天堂禁止更容易在這裏找到問題(與大字體,很棒的格式...),「人」頁 – puk 2012-01-10 00:19:00

+1

@ puk - 也沒有太多的格式。你可以在Vim中更改字體:) – Rook 2012-01-10 20:44:45

+4

@ldigas我個人一直都很害怕他們沒有足夠愚蠢的東西。就像linux中的其他所有東西一樣,它有一個陡峭的學習曲線。 – puk 2012-01-10 22:35:40

回答

438

你想要的東西像

:mksession ~/mysession.vim 

後來的後來,你可以來源,VIM文件,你就會有你的舊會話回:

:source ~/mysession.vim 

或打開VIM和-S選項:

$ vim -S ~/mysession.vim 
+25

噢,我差點忘了你可以通過輸入回加載: gvim -S〜/ mysession.vim – Benj 2009-10-29 10:01:26

+1

謝謝@Benj。我是vim的新手。我如何在命令行中「源」? – Jogusa 2009-10-29 10:17:20

+0

嗨Jogusa, 這幾乎是上述意見。 vim -S – Benj 2009-10-29 10:31:50

54

您可能希望在vimrc中設置這些會話選項。尤其是當你保存了會話後你改變了你的vimrc時,選項很煩人。

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

太棒了!昨天我遇到了這個問題。非常感謝! – Jogusa 2009-10-31 16:56:18

36

請注意:mksession不會保存對所做文件的更改。假設我會從這裏開始,保存會話後,我犯了關閉vim的這個錯誤。但是,下次我打開會話時,我對文件所做的更改就消失了。

+10

這應該帶有與':mksession'有關的任何答案。 – 2014-02-25 18:31:13

+0

是的,你可能想要按照':wqa' – 2015-03-11 16:36:42

+6

或者只是':xa'少一個按鍵。好極了! – robin 2015-07-09 05:20:19

29

如果您使用NERDTree作爲文件資源管理器/短劃線,我建議使用xolox/vim-session plugin而不是內置的mksession命令。出於某種原因,:mksession無法恢復NERDTree緩衝區。你的里程可能會有所不同,但我想我會分享我的經驗。

+0

對於macvim,我需要確保:'let g:nerdtree_tabs_open_on_gui_startup = 0'和'let g:nerdtree_tabs_open_on_new_tab = 0'來使xolox/vim-session正常工作。 – Nianliang 2014-09-01 06:40:05

5

有這個任務vim-startify它處理像最近打開的文件等許多其他的東西非常有用的插件,它有一個非常簡單的界面了。

我使用它,因爲幾天,直到現在它的工作完美。希望它可以幫助你。

3

有這樣好的插件調用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

12

如果您希望在不使用任何插件的情況下自動執行此過程,則可以使用Vim Tips Wiki中的Go away and come back

每次退出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() 

這個腳本是有些容易理解和定製。

請注意這個腳本只適用於Unix系統(MacOS/Linux),它需要適應在Windows上工作。


UPDATE:添加0xc0de的建議,你可以,如果你想Vim載入會議更換VimEnter行這些的只有提供沒有參數:

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

只有在沒有爲vim提供參數的情況下,您纔可以打開會話。 'if argc()== 0 au VimEnter *嵌套:調用LoadSession() end' – 0xc0de 2015-08-17 04:57:24

+0

謝謝@ 0xc0de,很好的建議(我甚至開始使用它自己)。我已經更新了答案。 – mathielo 2015-08-17 22:19:31

+0

我怎麼會修改這個,所以如果我打開vim的參數它也不會保存該會話 – 2016-06-30 12:59:33

0

你可以存儲任何你想要的會話。

例:

:mksession! D:/session.ses 

此存儲在d驅動器會話。

這可以通過在任何VIM文件的輸入

:so D:/session.ses 

打開。

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 
1

由於@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!

+0

這也是我一直在尋找的東西。太好了!我不記得有多少次我失去了我的會議做':q'而不是':bd' ...謝謝! – 2016-09-20 17:40:37

0

個人而言,我只是包裹在蒂姆教皇Obsession插件,以便確定一個sessiondir,避免鍵入路徑:如果您打算爲這個項目只有1個會議

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 
0

只是做

:mks 

這將在當前目錄中創建Session.vim文件,然後打開會話(來自同一目錄):

vim -S 

如果更改了會議,並希望將其保存:

:mks! 

這節省了會議,而不是文件本身!

如果計劃有多個會話,我更喜歡將它們保存在隱藏文件在項目目錄:

:mks .session-name.vim 

要打開它(從同一目錄):

vim -S .session-name.vim 

保存會話:

:mks! .session-name.vim 

由於會話保存在隱藏文件,以查看他們不要忘了-a

ls -a 
0

管理多個會話(在每個目錄/回購的基礎上),我最近從VIM會話切換插件到vim-workspace。它的會話管理相對簡單,工作得很好。

1

由於這是我在Google上爲我(也可能是其他人)的第一次關於如何在Vim中處理會話的命中,我決定在@ mathielo的答案中增加一點關於如何自動完成此操作的答案。

我喜歡他的代碼,但添加「只有沒有參數」解決方案似乎有點缺乏。這是我的修改版本:

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,而無需選擇運行會話。如果不存在會話,則會創建一個新會話。