2012-12-17 54 views
4

最近我一直在定製我的.vimrc,並且喜歡:mksession給我的強大功能和便利。目前,我有我的.vimrc自動加載會話以下幾點:防止vim從stdin讀取時加載會話

function! LoadSession()                
    if argc() == 0 && ! &diff                                                     
    let g:sessiondir = $HOME . "/.vim/sessions" . getcwd()       
    let g:sessionfile = g:sessiondir . "/session.vim"         
    if (filereadable(g:sessionfile))             
     exe 'source ' g:sessionfile              
    else                    
     echo "No session loaded." + argc() + argv()          
    endif                    
    else                    
    let g:sessionfile = ""               
    let g:sessiondir = ""                
    call ResCur()                  
    endif                    
endfunction 

然後,我au VimEnter * nested :call LoadSession()調用它。這對大多數情況非常有用,除非vim從stdin讀取。在這種情況下,會話仍然被加載,但是我想阻止這種情況發生。我原本以爲argc() == 0的條件就足夠了,但是看起來-那個vim被調用從stdin讀取的原因是argc()不返回0. Poop! ;]

我試過各種各樣的東西,從argv(0)(在這種情況下它是空的 - 爲什麼?),嘗試找到識別vim的方法是從stdin(它顯示一條消息,它正在這樣做,但我無法弄清楚如何挖掘)等等,但目前還沒有運氣。

我確定我在這裏錯過了非常明顯的東西,但Google和vim :help沒有讓我到任何地方,所以我希望有一些靈魂在這裏可以爲我闡明一些。

回答

1

session.vim plugin我使用提供擴展的會話處理。其中,它詢問是否應該在Vim啓動時恢復先前保存的會話。

但是,除非您需要插件的其他功能,否則您的映射觸發恢復的解決方法也可能很好。

+0

我現在正在嘗試session.vim,無法使自動加載按我想要的方式工作,但這看起來很有前途,謝謝。 – HerbCSO

+0

似乎做我需要它,thx! – HerbCSO

0

我一直在Vim啓動時加載會話,並最終決定這不是一個好主意,主要是因爲它不適合插件。

我最終添加了一些保存和恢復會話的映射。這有獎金,當你做快速編輯時,你不必與會話周圍亂成一團。

map <leader>ss :call CustomSessionSave()<CR> 
map <leader>sl :call CustomSessionRestore()<CR> 
map <leader>sd :call CustomSessionDelete()<CR> 

也許這有助於

+0

謝謝,但我正在尋找自動加載解決方案。順便說一句:你打的那些'CustomSessionXXX()'函數是什麼? – HerbCSO

+0

沒什麼特別的,我只是在調用'mksession'(保存)之前關閉NERDTree,然後在Restore上打開它。 – mihai

3

我發現作品是有

autocmd StdinReadPre * let g:my_is_stdin = 1 

.vimrc,然後測試您的會話保存/載入功能exists("g:my_is_stdin")。請注意,這些計劃必須通過autocmd才能運行,因爲此事件需要VimLeave/VimEnter