NERDTree 实时预览(像 sublime sidebar)

NERDTree live-preview (like sublime sidebar)

Sublime 的侧边栏有一个很酷的功能,我只需按下箭头键就可以快速浏览编辑器窗格中每个文件的外观。它实际上并没有打开文件——只是在编辑器窗格中显示它。

我想在 Vim(或 Vinegar/netrw 中用 NERDTree 做同样的事情,这并不重要)。我知道 NERDTree 允许我使用 go 打开光标下的文件,同时保持树处于焦点状态,但是 (a) 需要两次击键,并且 (b) 它为我 [=17] 的每个文件创建一个新缓冲区=] 像这样,所以...真的没有多少预览。

有没有办法让 NERDTree 或 Vim 模拟此 Sublime 功能?

是的,有。 Vim 有一个功能叫做 "preview window"。您可以使用 :pedit <filename> 在预览 window 中打开文件。如果你想把它插入 NERDTree,你可以在 ~/.vim/nerdtree_plugin/ 目录中创建一个文件,例如 "live_preview_mapping.vim",包含以下内容:

if exists("g:loaded_nerdree_live_preview_mapping")
  finish
endif
let g:loaded_nerdree_live_preview_mapping = 1

call NERDTreeAddKeyMap({
      \ 'key':           '<up>',
      \ 'callback':      'NERDTreeLivePreview',
      \ 'quickhelpText': 'preview',
      \ })

function! NERDTreeLivePreview()
  " Get the path of the item under the cursor if possible:
  let current_file = g:NERDTreeFileNode.GetSelected()

  if current_file == {}
    return
  else
    exe 'pedit '.current_file.path.str()
  endif
endfunction

第一部分只是一个加载保护,所以文件只获取一次,只是样板文件。第二部分使用 NERDTree API 为调用给定回调函数的 <up> 键添加一个键映射。

回调函数是代码的核心,但它应该相当容易理解——它获取光标下的节点(如果有的话),并使用文件名执行 :pedit

您甚至可以使用简单的特定于文件类型的映射更轻松地完成此操作,如下所示:

autocmd FileType nerdtree nnoremap <buffer> <up> :call NERDTreeLivePreview()<cr>

但前者是插件推荐的方法(参见:help NERDTreeAPI)。如果不出意外,这会为它的 ? 键添加一个帮助条目,并将 nerdtree 扩展保存在一个地方。

有关预览 window 的更多信息,请尝试 :help preview-window。例如,您可以使用 <c-w>z 关闭它,但您可以将其映射到您想要的任何内容,这与 NERDTree 不再真正相关。如果您对 window 的显示位置不满意,请考虑将 "pedit" 更改为 "botright pedit" 或 "leftabove pedit" 或您想要的任何内容。查看 :leftabove 的帮助并查看下面的相关命令。

使用 netrw,预览文件:将光标放在文件上方,按 "p"。

NERDTree 不提供任何开箱即用的自动功能。我喜欢预览 window 劫持最后一个活动 window 并允许在那里打开缓冲区,或与原始缓冲区分开。这个扩展可以做到这一点,而且它的源代码很短。

https://github.com/numEricL/nerdtree-live-preview