Подтвердить что ты не робот

Vim, NERDtree не восстанавливается при восстановлении сеанса

Когда у меня есть панель NERDtree, и я сохраняю сеанс Vim (mksession [имя_файла]), тогда откройте сеанс (vim -S имя_файла), панель открывается и помечена как "NERDtree", но не заполняется. Если я попробую ": NERDtree" из командной строки, окно заполняется, а теперь открывается другая панель.

Любые идеи касаются этого странного поведения?

4b9b3361

Ответ 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>)