Vim, NERDдерево не восстановлено в сеансе восстановления - PullRequest
24 голосов
/ 19 ноября 2010

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

Есть какие-нибудь идеи относительно этого странного поведения?

Ответы [ 6 ]

23 голосов
/ 29 сентября 2011

Просто решил разобраться с этой самой проблемой сам.В моем случае сеанс создается, когда я покидаю 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

До сих пор это работает как очарование для меня.Надеюсь, это поможет.

6 голосов
/ 12 июня 2011

У меня была та же проблема, и во время моего исследования я нашел два решения:

Вы можете использовать плагин "session.vim", который имеет базовую поддержку для восстановления NERDTree.Вы можете найти его здесь: http://www.vim.org/scripts/script.php?script_id=3150

Я обнаружил для себя, что этот плагин не для меня, поэтому я выбрал другой подход.Вы можете настроить vim так, чтобы он автоматически устанавливал каталог вашего буфера равным вашему рабочему каталогу.

autocmd BufEnter * lcd %:p:h

Поскольку NERDTree открывает рабочий каталог при первом его открытии, вы уже там, где вы хотитеbe!

Просто откройте 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

4 голосов
/ 26 июня 2012

Чтобы исправить сеанс NERDTress с плагином сеанса, вместо «mksession» и «source» следует использовать новые команды сеанса, встроенные в плагин сеанса: «SaveSession» и «OpenSession».

Согласно комментариям автора плагина сессии: Команда Vim: mksession на самом деле не совместима с плагинами, которые создают буферы с сгенерированным содержимым, и из-за этого session.vim включает специальные обходные пути для таких плагинов: • Поддерживаются окна BufExplorer, Project и NERD; • Когда установлен shell.vim, полноэкранное состояние Vim сохраняется; • Плагины netrw и taglist.vim поддерживают сессию из коробки.

Возможно, именно поэтому мы должны использовать новые команды для преодоления проблемы с сеансом NERDTree.

Для получения более подробной информации, пожалуйста, обратитесь к http://peterodding.com/code/vim/session/.

2 голосов
/ 23 января 2013

Или вы можете использовать Vimpanel , в него встроена поддержка сеансов, помимо других функций.

1 голос
/ 11 марта 2011

Самый простой способ заставить NERDTree работать так, как ожидается с сеансами, - это, вероятно, исправить NERD_tree.vim, добавив автокоманду в группу автокоманд NERDTree (сразу после строки augroup NERDTree):

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

Это не всесторонне протестировано, но мне кажется, что это работает для меня с несколькими раскладками и с различным количеством открытых окон NERDTree.

Edit: На самом деле, это не так хорошо работает, потому что NERDTree имеет первичное и вторичное окна, и в файле сеанса нет указания, является ли буфер NERDTree одним или другим. Похоже, что добавление надежной поддержки для этого плагина не будет такой большой проблемой, но это более чем тривиально. Между тем, для простых случаев добавление следующей автокоманды (вместо приведенной выше) может сделать то, что вы хотите:

exec "autocmd BufEnter ". s:NERDTreeBufName ."* :NERDTreeToggle | :NERDTreeToggle"
0 голосов
/ 26 февраля 2017

Другое решение, основанное на Стивелове:

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>)
...