【问题标题】:Is it possible to just view files content when traverse NERDTree?遍历NERDTree时是否可以只查看文件内容?
【发布时间】:2012-10-29 10:25:16
【问题描述】:

我可以遍历 NERDTree,但要查看文件内容,我按 go,一旦打开文件的缓冲区就会保持打开状态,直到我明确关闭它。这让查看文件太不舒服了。

当我遍历 NERDTree 节点时,我想在 临时查看器缓冲区 中查看突出显示的文件内容,并且我想明确地选择一些遍历的文件进行编辑,比如按 e.

当我关闭 NERDTree 缓冲区时,临时查看器缓冲区也将关闭,并且应该只为那些明确选择的文件打开缓冲区,而不是为所有查看的文件。

这可能吗?

【问题讨论】:

  • netrw 有一个“预览”映射 (p) 但它不是自动的,预览窗口也不会自动关闭。 NERDTree 不会做任何事情:您必须为所有这些编写自己的函数。
  • 你可以做的是用autocmd自动关闭它,或者你至少可以用:pclose关闭它,而无需在窗口之间切换的乏味。

标签: vim nerdtree


【解决方案1】:

看起来这可能是对 NERDTree 的一个不错的功能请求 :)

同时,您可以在 ~/.vimrc 中添加如下内容:

let g:nerd_preview_enabled = 0
let g:preview_last_buffer  = 0

function! NerdTreePreview()
  " Only on nerdtree window
  if (&ft ==# 'nerdtree')
    " Get filename
    let l:filename = substitute(getline("."), "^\\s\\+\\|\\s\\+$","","g")

    " Preview if it is not a folder
    let l:lastchar = strpart(l:filename, strlen(l:filename) - 1, 1)
    if (l:lastchar != "/" && strpart(l:filename, 0 ,2) != "..")

      let l:store_buffer_to_close = 1
      if (bufnr(l:filename) > 0)
        " Don't close if the buffer is already open
        let l:store_buffer_to_close = 0
      endif

      " Do preview
      execute "normal go"

      " Close previews buffer
      if (g:preview_last_buffer > 0)
        execute "bwipeout " . g:preview_last_buffer
        let g:preview_last_buffer = 0
      endif

      " Set last buffer to close it later
      if (l:store_buffer_to_close)
        let g:preview_last_buffer = bufnr(l:filename)
      endif
    endif
  elseif (g:preview_last_buffer > 0)
    " Close last previewed buffer
    let g:preview_last_buffer = 0
  endif
endfunction

function! NerdPreviewToggle()
  if (g:nerd_preview_enabled)
    let g:nerd_preview_enabled = 0
    augroup nerdpreview
      autocmd!
      augroup END
  else
    let g:nerd_preview_enabled = 1
    augroup nerdpreview
      autocmd!
      autocmd CursorMoved * nested call NerdTreePreview()
    augroup END
  endif
endfunction

这可能是非常幼稚和讨厌的代码,但是通过一些调整可以完成您打算做的事情。

已编辑,版本 2 中的更改:

  • 在自动命令中添加了嵌套,因此语法高亮有效
  • 默认不开启,执行:call NerdPreviewToggle()开启/关闭

【讨论】:

  • 太酷了!!!但是预览缓冲区丢失了语法突出显示。如何为预览缓冲区启用语法高亮?
  • 好点,刚刚编辑了答案,添加了nested 关键字,它可以正常工作(:help autocmd-nested)
  • 嗯,是的,但看起来只有以前打开的文件(现有缓冲区)被突出显示。
  • 只需检查一下,似乎在所有文件中都可以使用 :-\ :-/ 你确定吗?
  • 另外,如果我停留在文件夹节点并且树中的第二个节点是该文件夹中的第一个文件,那么当我将光标来回移动到文件和文件夹时(如果文件是不明确打开文件)缓冲区在我将光标放在它上面时每秒钟关闭一次。如果文件是显式打开的,那么它会突出显示,并且缓冲区不会在光标每次放在文件节点上时关闭,这是正常行为
【解决方案2】:

我在 DavidEG 的回答的基础上考虑了制表符,因为我遇到了多个 nerdtree 制表符边缘情况。

function! PreviewNERDTreeFile()
  if !exists('t:previous_preview_buffer') | let t:previous_preview_buffer = 0 | endif
  let filename = substitute(getline('.'), '^\s*\|\s*$', '','g')
  let should_close_buffer_next_time = 1
  if (bufnr(filename) > 0) | let should_close_buffer_next_time = 0 | endif

  normal go
  if t:previous_preview_buffer > 0
    exe 'bwipeout ' . t:previous_preview_buffer
    let t:previous_preview_buffer = 0
  endif
  if should_close_buffer_next_time
    let t:previous_preview_buffer = bufnr(filename)
  endif
endfunction

【讨论】:

    【解决方案3】:

    这是一个 NERDTree 扩展,它使用最后一个活动缓冲区作为预览窗口,并根据您是否使用 o, s, i, gs, gi 等打开该窗口或将其与原始内容分开。

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

    【讨论】:

      猜你喜欢
      • 2014-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多