Vim, NERD дерево не восстановлено в сеансе восстановления
Когда у меня есть панель NERDtree, и я сохраняю сеанс Vim (mksession [имя файла]), а затем открываю сеанс (имя файла vim -S), панель открывается и помечается как "NERDtree", но не заполняется. Если я попытаюсь ":NERDtree" из командной строки, окно заполняется, но теперь открывается другая панель.
Какие-нибудь идеи относительно этого странного поведения?
8 ответов
Просто решил разобраться с этой самой проблемой сам. В моем случае сеанс создается, когда я покидаю 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
До сих пор это работает как шарм для меня. Надеюсь это поможет.
У меня была такая же проблема, и во время исследования я нашел два решения:
Вы можете использовать плагин "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".
Я узнал команды благодаря парням в этом посте:
Для исправления сеанса NERDTress с помощью подключаемого модуля сеанса вместо "mksession" и "source" следует использовать новые команды сеанса, встроенные в подключаемый модуль сеанса: "SaveSession" и "OpenSession".
Согласно комментариям автора плагина сессии: команда Vim's: mksession на самом деле не совместима с плагинами, которые создают буферы с сгенерированным содержимым, и из-за этого session.vim включает специальные обходные пути для таких плагинов: •BufExplorer, Project и NERD tree окна поддерживаются; • Когда установлен shell.vim, полноэкранное состояние Vim сохраняется; • Плагины netrw и taglist.vim поддерживают сеансы из коробки.
Возможно, именно поэтому мы должны использовать новые команды для преодоления проблемы с сеансом NERDTree.
Для получения более подробной информации, пожалуйста, обратитесь к http://peterodding.com/code/vim/session/.
Или вы можете использовать Vimpanel, он имеет встроенную поддержку сеанса, среди других функций.
Еще одно решение на основе Stevelove's:
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>)
В моем случае NERDTree открывался после загрузки сеанса, но не отображал никаких файлов. Следующий скрипт исправил это:
" Automatically save the session when leaving vim
set sessionoptions=blank,buffers,curdir,help,tabpages,winsize
autocmd VimLeave * NERDTreeClose
autocmd! VimLeave * mksession! ~/Session.vim
" Automatically load the session when entering vim when no arguments were provided
if argc() == 0 && filereadable(expand('~/Session.vim'))
autocmd! VimEnter * source ~/Session.vim
autocmd VimEnter * :NERDTreeToggle | wincmd l | wincmd q
endif
то есть:
- перед сохранением сессии - закрыть NERDTree
- после загрузки сессии - открываем NERDTree (теперь их две), заходим в другую с
wincmd l
и закрыть с помощьюwincmd q
Самый простой способ заставить 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"
Пример:
" Save session on quitting Vim but we have to first close NERDTree
autocmd VimLeave * NERDTreeClose
autocmd VimLeave * mksession! ~/mysession.vim
" Open session first and then start NERDTree
autocmd StdinReadPre * let s:std_in=1
autocmd VimEnter * source ~/mysession.vim
autocmd VimEnter * NERDTree