当浏览NERDTree时,是否可以仅查看文件内容?

14
我可以遍历NERDTree,但要查看文件内容,我按下“go”,一旦打开文件缓冲区,它将保持打开状态,直到我显式关闭它。这使得查看文件过于不舒适。
当我遍历NERDTree节点时,我希望在一个临时的查看器缓冲区中看到突出显示的文件内容,并且我想通过按“e”来显式选择一些遍历的文件进行编辑。
当我关闭NERDTree缓冲区时, 临时查看器缓冲区 也应关闭,并且只应为那些明确选择的文件打开缓冲区,而不是所有查看的文件。
那可能吗?

2
netrw有一个“预览”映射(p),但它不是自动的,预览窗口也不会自动关闭。NERDTree没有做任何这方面的事情:你必须为所有这些编写自己的函数。 - romainl
你可以使用 autocmd 命令使其自动关闭,或者至少可以使用 :pclose 命令在不需要在窗口之间切换的情况下关闭它。 - Quinn Strahl
3个回答

5

看起来这可能是一个不错的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() 命令来启用/禁用

那很酷!!!但预览缓冲区失去了语法高亮。我该如何为预览缓冲区启用语法高亮? - zuba
好的,刚刚编辑了答案,添加了 nested 关键字,这样它就可以正常工作了(:help autocmd-nested)。 - DavidEG
嗯,是的,但似乎只有先前打开的文件(现有缓冲区)才会被突出显示。 - zuba
刚刚检查了一下,似乎在所有文件中都能正常工作 :-\ :-/ 你确定吗? - DavidEG
如果我停留在文件夹节点,并且树中的第二个节点是该文件夹中的第一个文件,那么当我将光标来回移动到文件和文件夹时(如果文件没有被明确打开),每隔一次缓冲区就会关闭。如果文件已经被明确打开,则它会被突出显示,并且缓冲区不会在光标放在文件节点上的每隔一次时关闭,这是正常的行为。 - zuba

0
我在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

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接