Vim, NERDtree не восстанавливается при восстановлении сеанса
Когда у меня есть панель NERDtree, и я сохраняю сеанс Vim (mksession [имя_файла]), тогда откройте сеанс (vim -S имя_файла), панель открывается и помечена как "NERDtree", но не заполняется. Если я попробую ": NERDtree" из командной строки, окно заполняется, а теперь открывается другая панель.
Любые идеи касаются этого странного поведения?
Ответы
Ответ 1
Просто решил сам справиться с этой самой проблемой. В моем случае сеанс создается, когда я выхожу из 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
Он работает как прелесть для меня до сих пор. Надеюсь, это поможет.
Ответ 2
У меня была та же проблема, и во время моего исследования я нашел два решения:
Вы можете использовать плагин под названием "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
Ответ 3
Чтобы исправить сеанс NERDTress с плагином сеанса, следует использовать новые команды сеанса, встроенные в плагин сеанса: "SaveSession" и "OpenSession", вместо "mksession" и "source".
В соответствии с комментариями плагина сеанса:
Vims: команда mksession действительно не совместима с плагинами, которые создают буферы с сгенерированным контентом, и из-за этого session.vim включает в себя определенные обходные пути для таких плагинов: • Поддерживаются деревья BufExplorer, Project и NERD; • Когда установлено shell.vim Vims полноэкранное состояние сохраняется; • Плагины netrw и taglist.vim поддерживают сеансы из коробки.
Возможно, именно поэтому мы должны использовать новые команды для преодоления проблемы с сеансом NERDTree.
Подробнее см. http://peterodding.com/code/vim/session/.
Ответ 4
Или вы можете использовать Vimpanel, у него есть встроенная поддержка сеанса, среди прочих функций.
Ответ 5
Самый простой способ заставить NERDTree действовать так, как ожидалось, с сеансами, вероятно, для исправления NERD_tree.vim, добавив автокоманду в группу autocommand NERDTree (сразу после строки augroup NERDTree
):
exec "autocmd BufEnter ". s:NERDTreeBufName ."* call <SID>initNerdTreeInPlace(\"\")"
Он не тестировался полностью, но, похоже, это работает для меня с несколькими макетами и с разным количеством открываемых окон NERDTree.
Изменить: на самом деле это не работает так хорошо, потому что NERDTree имеет первичные и вторичные окна, и в файле сеанса нет индикации того, является ли буфер NERDTree тем или иным. Похоже, добавление надежной поддержки для этого в плагин не было бы большой проблемой, но это более чем тривиально. В то же время для простых случаев добавление следующей автокоманды (а не выше) может сделать то, что вы хотите:
exec "autocmd BufEnter ". s:NERDTreeBufName ."* :NERDTreeToggle | :NERDTreeToggle"
Ответ 6
Другое решение, основанное на 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>)