Можно ли просто просматривать содержимое файлов при пересечении NERDTree?

Я могу пересекать NERDTree, но чтобы увидеть содержимое файла, я нажимаю go, и один раз открытый буфер хранения остается открытым, пока я его явно не закрываю. Это делает файлы просмотра слишком неудобными.

когда я пересекаю NERDTree-узлы, я хотел бы видеть выделенное содержимое файла во временном буфере просмотра, и я хотел бы явно выбрать некоторые из перемещенных файлов для редактирования, например, нажав e.

Когда я закрываю буфер 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:

  • Добавлено вложенное в autocommand, так что подсветка синтаксиса
  • Не включен по умолчанию, выполните: вызовите NerdPreviewToggle(), чтобы включить/отключить

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