2010-11-19 56 views
22

當我有一個NERDtree面板並保存Vim會話(mksession [文件名]),然後打開會話(vim -S文件名),打開面板並標記爲「NERDtree」但沒有填充。如果我從命令行嘗試「:NERDtree」,窗口會填充,但現在打開另一個面板。Vim,NERDtree在會話還原中沒有恢復

對這種奇怪的行爲有何想法?

回答

1

使NERDTree作爲與會話預期可能是修補NERD_tree.vim最簡單的方法,將一個自動的NERDTree自動命令組(右後augroup NERDTree線):

exec "autocmd BufEnter ". s:NERDTreeBufName ."* call <SID>initNerdTreeInPlace(\"\")" 

這不是廣泛的測試,但這似乎適用於我的幾種佈局,並打開不同數量的NERDTree窗口。

編輯:實際上,這並不是很好,因爲NERDTree具有主窗口和輔助窗口,並且會話文件中沒有指示NERDTree緩衝區是一個還是另一個。看起來像爲這個插件添加可靠的支持不會是一個很大的挑戰,但它不是微不足道的。在此期間,對於簡單的情況下,把下面的自動命令(而不是上面的一個)可能會做你想要什麼:

exec "autocmd BufEnter ". s:NERDTreeBufName ."* :NERDTreeToggle | :NERDTreeToggle" 
+0

不符合當前NERDtree 5.0工作... – 2016-03-26 19:39:21

6

我有同樣的問題,我的研究過程中我發現了兩個解決方案:

您可以使用名爲「session.vim」的插件,它具有恢復NERDTree的基本支持。你可以在這裏找到它:http://www.vim.org/scripts/script.php?script_id=3150

我發現自己這個插件不適合我,所以我採取了另一種方法。 你可以配置vim來自動設置緩衝區的目錄等於你的工作目錄。

autocmd BufEnter * lcd %:p:h 

由於NERDTree在第一次打開工作目錄時會打開工作目錄,因此您已經是您想要成爲的地方了!

只需在之後打開NERDTree 即可在此情況下打開文件或會話。

但是,由於魔術只能在一個選項卡內第一次工作,因此您可以使用以下命令讓樹中的NERDTree 找到文件。

map <leader>r :NERDTreeFind<cr> 

要使用「p」命令,然後輸入「C」,就可以按照您的意願上移幾個導向器。

我發現了命令,這要歸功於這個職位的人:

https://superuser.com/questions/195022/vim-how-to-synchronize-nerdtree-with-current-opened-tab-file-path

+0

+1:' 「session.vim」,其中有一個基本的support'什麼是真的!除了session.vim還有一個autorestore last session選項。正是我想要的... – 2012-01-03 03:09:39

19

剛剛決定處理這一非常問題我自己。就我而言,當我退出Vim在我的vimrc下面是創建的會話:

autocmd VimLeave * mksession! [filename]

我還試圖打開NERDTree時自動Vim的打開與:

autocmd VimEnter * NERDTree

結果是我的會話以兩個NERDTree實例打開,就像原始文章中所述。我的解決方案是在保存會話之前簡單地關閉NERDTree,這樣我的自動打開的呼叫只會打開NERDTree的一個實例。

我的解決方案

" Save session on quitting Vim 
autocmd VimLeave * NERDTreeClose 
autocmd VimLeave * mksession! [filename] 

" Restore session on starting Vim 
autocmd VimEnter * call MySessionRestoreFunction() 
autocmd VimEnter * NERDTree 

它的工作就像一個魅力對我來說至今。希望這可以幫助。

+1

簡單明瞭。順便說一句,我在這裏使用會話恢復代碼:http://stackoverflow.com/questions/5142099/auto-save-vim-session-on-quit-and-auto-reload-session-on-start/6052704#6052704 – 2013-06-05 02:28:53

+0

我更喜歡使用由[vim-nerdtree-tabs](https://github.com/jistr/vim-nerdtree-tabs)使用的標籤'NERDTreeTabsClose',而不是'NERDTreeClose'。這種組合對於多個標籤會話也可以完美地工作。 – Egel 2015-10-13 13:31:15

4

要使用會話插件修復NERDTress會話,應使用會話插件中嵌入的新會話命令:「SaveSession」和「OpenSession」,而不是「mksession」和「source」。

根據會話插件作者的評論: Vim的:mksession命令不是與創造,因爲這session.vim與生成的內容緩存和插件兼容確實包括這樣的插件,具體的解決方法: •支持BufExplorer,Project和NERD樹窗口; •當安裝shell.vim時,Vim的全屏狀態會持續; •netrw和taglist.vim插件支持開箱即用會話。

也許這就是爲什麼我們應該使用新命令來克服NERDTree會話問題。

欲瞭解更多詳情,請參閱http://peterodding.com/code/vim/session/

2

或者您可以使用Vimpanel,它具有內置的會話支持以及其他功能。

0

基於stevelove的另一種解決方案:

fun! Mksession(name) 
    let need_tree = g:NERDTree.IsOpen() 
    NERDTreeClose 
    execute "mksession! " . a:name 
    if need_tree 
     call writefile(readfile(a:name)+['NERDTree'], a:name) 
     NERDTree 
    endif 
endfun 

command! -nargs=1 Mksession call Mksession(<f-args>)