Skip to content

Instantly share code, notes, and snippets.

@PhilRunninger
Last active February 24, 2024 09:47
Show Gist options
  • Save PhilRunninger/99f0c78e48de42bf2010f30d983ff61f to your computer and use it in GitHub Desktop.
Save PhilRunninger/99f0c78e48de42bf2010f30d983ff61f to your computer and use it in GitHub Desktop.
Open multiple files in NERDTree at once with Visual selection and [NERDTree defaults] o, i, s, and t.
" Filename: ~/.vim/ftplugin/nerdtree.vim
" Purpose: Given a Visual-Line selection in the NERDTree buffer, this code
" lets you open all selected files with the same key mappings, which, by
" default, are:
" o - open files in previous window
" i - open files in horizontally split windows
" s - open files in vertically split windows
" t - open files in new tabs
execute "vnoremap <buffer> " . g:NERDTreeMapActivateNode . " :call <SID>OpenMultiple('p')<CR>"
execute "vnoremap <buffer> " . g:NERDTreeMapOpenSplit . " :call <SID>OpenMultiple('h')<CR>"
execute "vnoremap <buffer> " . g:NERDTreeMapOpenVSplit . " :call <SID>OpenMultiple('v')<CR>"
execute "vnoremap <buffer> " . g:NERDTreeMapOpenInTab . " :call <SID>OpenMultiple('t')<CR>"
function! s:OpenMultiple(target) range
let curLine = a:firstline
while curLine <= a:lastline
call cursor(curLine, 1)
let node = g:NERDTreeFileNode.GetSelected()
call nerdtree#echo("Opening " . (curLine - a:firstline + 1) . " of " . (a:lastline - a:firstline + 1) . "...")
if !empty(node) && !node.path.isDirectory
call node.open({'where':a:target, 'stay':1, 'keepopen':1})
endif
let curLine += 1
endwhile
if g:NERDTreeQuitOnOpen
NERDTreeClose
endif
call nerdtree#echo("")
endfunction
@PhilRunninger
Copy link
Author

Updated again to include mappings for opening files in splits or tabs. Also the location of the file has changed to ~/.vim/ftplugin/nerdtree.vim

@cabaalexander
Copy link

I think you should put it in a repo like you did to this one 👉 https://github.com/PhilRunninger/nerdtree-buffer-ops so that way you can use it in your plugin manager of choice, if it is not going to be a feature of NERDTree in the near future. 😅

@cabaalexander
Copy link

Sorry I took a look at Xuyuanp/nerdtree-git-plugin (Which I always used) and saw that plugins for NERDTree are being wrote like I just said 😥 . But in this approach changed from ~/.vim/nerdtree_plugin to ~/.vim/ftplugin/nerdtree.vim/. Does this still count as a candidate for a nerdtree_plugin ?

By the way it works nice 👌

@PhilRunninger
Copy link
Author

Switching to the ftplugin folder allowed me to remove the augroup code, where the BufNew wasn't working in all cases, and BufEnter ran more often than needed. Plugins can have any folder structure that they need. While it no longer is in the nerdtree_plugin folder, it's still a plugin that would be dependent on NERDTree being installed. I will create a plugin that works with plugin managers, adding some new functionality.

@PhilRunninger
Copy link
Author

This gist is now available as a standard Vim plugin here: https://github.com/PhilRunninger/nerdtree-visual-selection

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment