nerdtree/plugin/NERD_tree.vim

260 lines
9.3 KiB
VimL
Raw Normal View History

" ============================================================================
" File: NERD_tree.vim
2009-10-09 05:46:40 +04:00
" Maintainer: Martin Grenfell <martin.grenfell at gmail dot com>
" License: This program is free software. It comes without any warranty,
" to the extent permitted by applicable law. You can redistribute
" it and/or modify it under the terms of the Do What The Fuck You
" Want To Public License, Version 2, as published by Sam Hocevar.
" See http://sam.zoy.org/wtfpl/COPYING for more details.
"
" ============================================================================
"
2007-11-03 00:23:09 +03:00
" SECTION: Script init stuff {{{1
"============================================================
if exists("loaded_nerd_tree")
finish
endif
if v:version < 703
echoerr "NERDTree: this plugin requires vim >= 7.3. DOWNLOAD IT! You'll thank me later!"
2007-11-03 00:23:09 +03:00
finish
endif
let loaded_nerd_tree = 1
2008-10-01 13:32:03 +04:00
"for line continuation - i.e dont want C in &cpo
let s:old_cpo = &cpo
set cpo&vim
"Function: s:initVariable() function {{{2
2007-11-03 00:23:09 +03:00
"This function is used to initialise a given variable to a given value. The
"variable is only initialised if it does not exist prior
"
"Args:
"var: the name of the var to be initialised
"value: the value to initialise var to
"
"Returns:
"1 if the var is set, 0 otherwise
function! s:initVariable(var, value)
2007-11-03 00:23:09 +03:00
if !exists(a:var)
exec 'let ' . a:var . ' = ' . "'" . substitute(a:value, "'", "''", "g") . "'"
2007-11-03 00:23:09 +03:00
return 1
endif
return 0
endfunction
2008-06-09 04:46:53 +04:00
"SECTION: Init variable calls and other random constants {{{2
call s:initVariable("g:NERDTreeAutoCenter", 1)
call s:initVariable("g:NERDTreeAutoCenterThreshold", 3)
call s:initVariable("g:NERDTreeCaseSensitiveSort", 0)
2016-01-19 11:21:13 +03:00
call s:initVariable("g:NERDTreeNaturalSort", 0)
call s:initVariable("g:NERDTreeSortHiddenFirst", 1)
call s:initVariable("g:NERDTreeUseTCD", 0)
call s:initVariable("g:NERDTreeChDirMode", 0)
call s:initVariable("g:NERDTreeCreatePrefix", "silent")
call s:initVariable("g:NERDTreeMinimalUI", 0)
Add a NERDTreeMinimalMenu feature (#938) * Extract the menu action prompts to a function * Add a NERDTreeMinimalMenu configuration option If this option is set, Vim’s command line displays a single-line version of the menu: Which action? (a*/m/d/r/o/q/c/l): Pressing ‘a’ will call the ‘add child node’ menu item as that is its shortcut. The * denotes the position of the currently selected menu item which can be changed with NERDTreeMenuDown and Up in the usual way. The user may wish to set these to <left>, <right> or h, l if they prefer. * Minimise the text once a menu item is chosen If NERDTreeMinimalMenu is set, then echo a single line prompt after the menu item is chosen. This reduces noise for users who are already familiar with how the menu works and prevents Vim scrolling down to accommodate the menu text. If the directory is non-empty we display ‘Delete directory?’ instead of ‘Delete?’ and the user must still type ‘yes’ to confirm, rather than just pressing ‘y’. * Document the new NERDTreeMinimalMenu feature * Tweak the format for the minimal menu prompt As per @PhilRunninger’s suggestions: - The menu now shows the ‘j/k/enter’ help text - The first word of the selected item is shown* - Use commas between menu items so that it’s visually distinct from the ‘j/k/enter’ text * I tried displaying the full menuItem text, but this can be quite long, e.g. > (o)pen the current node with system editor This causes the menu to jump around a lot. We could add another minimal versions of these, but I think the first word seems ok for now.
2019-02-25 02:01:12 +03:00
call s:initVariable("g:NERDTreeMinimalMenu", 0)
2007-11-03 00:23:09 +03:00
if !exists("g:NERDTreeIgnore")
let g:NERDTreeIgnore = ['\~$']
endif
call s:initVariable("g:NERDTreeBookmarksFile", expand('$HOME') . '/.NERDTreeBookmarks')
call s:initVariable("g:NERDTreeBookmarksSort", 1)
call s:initVariable("g:NERDTreeHighlightCursorline", 1)
call s:initVariable("g:NERDTreeHijackNetrw", 1)
call s:initVariable('g:NERDTreeMarkBookmarks', 1)
call s:initVariable("g:NERDTreeMouseMode", 1)
call s:initVariable("g:NERDTreeNotificationThreshold", 100)
call s:initVariable("g:NERDTreeQuitOnOpen", 0)
call s:initVariable("g:NERDTreeRespectWildIgnore", 0)
call s:initVariable("g:NERDTreeShowBookmarks", 0)
call s:initVariable("g:NERDTreeShowFiles", 1)
call s:initVariable("g:NERDTreeShowHidden", 0)
call s:initVariable("g:NERDTreeShowLineNumbers", 0)
call s:initVariable("g:NERDTreeSortDirs", 1)
if !nerdtree#runningWindows() && !nerdtree#runningCygwin()
call s:initVariable("g:NERDTreeDirArrowExpandable", "▸")
call s:initVariable("g:NERDTreeDirArrowCollapsible", "▾")
else
call s:initVariable("g:NERDTreeDirArrowExpandable", "+")
call s:initVariable("g:NERDTreeDirArrowCollapsible", "~")
endif
2013-04-22 19:35:15 +04:00
call s:initVariable("g:NERDTreeCascadeOpenSingleChildDir", 1)
call s:initVariable("g:NERDTreeCascadeSingleChildDir", 1)
2007-11-03 00:23:09 +03:00
if !exists("g:NERDTreeSortOrder")
let g:NERDTreeSortOrder = ['\/$', '*', '\.swp$', '\.bak$', '\~$']
endif
let g:NERDTreeOldSortOrder = []
2007-11-03 00:23:09 +03:00
call s:initVariable("g:NERDTreeGlyphReadOnly", "RO")
if has("conceal")
call s:initVariable("g:NERDTreeNodeDelimiter", "\x07")
elseif (g:NERDTreeDirArrowExpandable == "\u00a0" || g:NERDTreeDirArrowCollapsible == "\u00a0")
call s:initVariable("g:NERDTreeNodeDelimiter", "\u00b7")
else
call s:initVariable("g:NERDTreeNodeDelimiter", "\u00a0")
endif
Support unusual characters in file and directory names (#868) * Use a delimiter in node to separate file/dir name from the rest. * Switch warning message to use nerdtree#deprecated function. * Compress the space between the tree symbols and the node. * Include the delimiter when calculating indent or getting filename. * Don't need to strip leading delimiter. It will already be gone. * Simplify the way the delimiter is being used. I don't know what I was thinking. The delimiter doesn't need to be used to separate every indicator on the node's text, ie. Bad: Tree|GenericFlags|Filename|ExecutableFlag|Link|ReadonlyFlag Better: Tree GenericFlags|Filename|ExecutableFlag Link ReadonlyFlag This was unnecessary, given that we're only interested in the filename. So, just one pair of delimiters is all we need. That greatly simplifies the _stripMarkup function, and restores a bunch of other statements to what they already are in the master branch. * Add syntax highlighting to conceal the delimiter * Put a if has("conceal") check around the syntax statement using it. * Make concealment work correctly for LinkFile and readonly files. * Use highlight Ignore if conceal isn't available. This is probably the best we can do, especially if some other character must be used in place of nbsp. * Make the regex better match the original, but more compact. It was allowing 2+ spaces, instead of only 1+. * Fix the syntax highlighing of delimiters around NERDTreeExecFile. * Bug fix: Parse . and .. from path string with trailing slash. * Fix unresponsive cascaded directories. Using ':' as a more visible delimiter, when directories are cascaded, the line appears in NERDTree like so: ▾ :lib/::nerdtree/: Before this commit, the s:UI._stripMarkup function was leaving the internal delimiters in place (lib/::nerdtree/). Now they are removed, resulting in a valid path (lib/nerdtree/). * Use .= to shorten statement. Use clearer substitutes to get node name. * Remove node delimiters that terminate the line. * If flags are needed after the node name, then put another delimiter before them. * When joining directory nodes for cascaded display, strip off the delimiter from the child node(s). * Remove the unnecessary substitution of doubled intermediate delimiters, since they're not in there anymore. * DRY up the addition of the 2nd delimiter, and use only 1 for all tags.
2018-10-25 05:41:13 +03:00
2009-09-01 09:15:48 +04:00
if !exists('g:NERDTreeStatusline')
"the exists() crap here is a hack to stop vim spazzing out when
"loading a session that was created with an open nerd tree. It spazzes
"because it doesnt store b:NERDTree(its a b: var, and its a hash)
let g:NERDTreeStatusline = "%{exists('b:NERDTree')?b:NERDTree.root.path.str():''}"
2009-09-01 09:15:48 +04:00
endif
call s:initVariable("g:NERDTreeWinPos", "left")
call s:initVariable("g:NERDTreeWinSize", 31)
2007-11-03 00:23:09 +03:00
2008-06-09 04:46:53 +04:00
"init the shell commands that will be used to copy nodes, and remove dir trees
2007-11-03 00:23:09 +03:00
"
"Note: the space after the command is important
if nerdtree#runningWindows()
call s:initVariable("g:NERDTreeRemoveDirCmd", 'rmdir /s /q ')
call s:initVariable("g:NERDTreeCopyDirCmd", 'xcopy /s /e /i /y /q ')
call s:initVariable("g:NERDTreeCopyFileCmd", 'copy /y ')
2007-11-03 00:23:09 +03:00
else
call s:initVariable("g:NERDTreeRemoveDirCmd", 'rm -rf ')
call s:initVariable("g:NERDTreeCopyCmd", 'cp -r ')
2007-11-03 00:23:09 +03:00
endif
2008-06-09 04:46:53 +04:00
"SECTION: Init variable calls for key mappings {{{2
Expand functionality of <CR> mapping (#1011) * Define default values for new variables governing new "Default Open". "Default Open" means to open a file with the Enter key (which of course can be changed.) The key can be changed in the vimrc, and there is a variable for specifying the Opener parameters for opening the node. This lets the user decide whether Enter (or another key) will open a file in the current tab or a new one, and whether or not to open the file again in the tab or jump to a window where the file is already open. * Remove the old mapping for <CR>, a duplicate of 'o'. <CR> will be defined like all the other keys, in plugin/NERD_tree.vim * Assign functions to the new <CR> key mapping. Three separate functions handle directories, files, and bookmarks. * Rename variables: NERDTreeCustomOpen and NERDTreeCustomOpenArgs * Add documentation for NERDTreeCustomOpenArgs and NERDTree-<CR>. * Make key mapping variables be indexed in the Vim help * Remove angle brackets from <CR> to see if help navigation improves. * Rename functions from defaultOpen... to customOpen... * Use separate options for file and directory nodes. * Update documentation for separate file/directory options. * Update version number and change log. * Change CR to <CR> in help tags. * Fix missing backtick in patch number. * Update the quickhelp text. * Update Pull Request template. * Update change log with simpler formatting of patch number. * Get NERDTree version number directly from CHANGELOG.md * Reformat the lists of contributors in the Change Log. * Initialize the version text, just in case the while loop finds nothing.
2019-07-02 05:13:20 +03:00
call s:initVariable("g:NERDTreeMapCustomOpen", "<CR>")
call s:initVariable("g:NERDTreeMapActivateNode", "o")
call s:initVariable("g:NERDTreeMapChangeRoot", "C")
call s:initVariable("g:NERDTreeMapChdir", "cd")
call s:initVariable("g:NERDTreeMapCloseChildren", "X")
call s:initVariable("g:NERDTreeMapCloseDir", "x")
call s:initVariable("g:NERDTreeMapDeleteBookmark", "D")
call s:initVariable("g:NERDTreeMapMenu", "m")
call s:initVariable("g:NERDTreeMapHelp", "?")
call s:initVariable("g:NERDTreeMapJumpFirstChild", "K")
call s:initVariable("g:NERDTreeMapJumpLastChild", "J")
2012-01-27 03:59:07 +04:00
call s:initVariable("g:NERDTreeMapJumpNextSibling", "<C-j>")
call s:initVariable("g:NERDTreeMapJumpParent", "p")
2012-01-27 03:59:07 +04:00
call s:initVariable("g:NERDTreeMapJumpPrevSibling", "<C-k>")
call s:initVariable("g:NERDTreeMapJumpRoot", "P")
call s:initVariable("g:NERDTreeMapOpenExpl", "e")
call s:initVariable("g:NERDTreeMapOpenInTab", "t")
call s:initVariable("g:NERDTreeMapOpenInTabSilent", "T")
call s:initVariable("g:NERDTreeMapOpenRecursively", "O")
2008-12-17 13:28:20 +03:00
call s:initVariable("g:NERDTreeMapOpenSplit", "i")
2009-01-08 23:19:44 +03:00
call s:initVariable("g:NERDTreeMapOpenVSplit", "s")
call s:initVariable("g:NERDTreeMapPreview", "g" . NERDTreeMapActivateNode)
call s:initVariable("g:NERDTreeMapPreviewSplit", "g" . NERDTreeMapOpenSplit)
2009-01-08 23:19:44 +03:00
call s:initVariable("g:NERDTreeMapPreviewVSplit", "g" . NERDTreeMapOpenVSplit)
call s:initVariable("g:NERDTreeMapQuit", "q")
call s:initVariable("g:NERDTreeMapRefresh", "r")
call s:initVariable("g:NERDTreeMapRefreshRoot", "R")
call s:initVariable("g:NERDTreeMapToggleBookmarks", "B")
call s:initVariable("g:NERDTreeMapToggleFiles", "F")
call s:initVariable("g:NERDTreeMapToggleFilters", "f")
call s:initVariable("g:NERDTreeMapToggleHidden", "I")
call s:initVariable("g:NERDTreeMapToggleZoom", "A")
call s:initVariable("g:NERDTreeMapUpdir", "u")
call s:initVariable("g:NERDTreeMapUpdirKeepOpen", "U")
call s:initVariable("g:NERDTreeMapCWD", "CD")
call s:initVariable("g:NERDTreeMenuDown", "j")
call s:initVariable("g:NERDTreeMenuUp", "k")
2007-11-03 00:23:09 +03:00
"SECTION: Load class files{{{2
call nerdtree#loadClassFiles()
2007-11-03 00:23:09 +03:00
" SECTION: Commands {{{1
"============================================================
call nerdtree#ui_glue#setupCommands()
2007-11-03 00:23:09 +03:00
" SECTION: Auto commands {{{1
"============================================================
augroup NERDTree
"Save the cursor position whenever we close the nerd tree
exec "autocmd BufLeave,WinLeave ". g:NERDTreeCreator.BufNamePrefix() ."* if g:NERDTree.IsOpen() | call b:NERDTree.ui.saveScreenState() | endif"
"disallow insert mode in the NERDTree
exec "autocmd BufEnter,WinEnter ". g:NERDTreeCreator.BufNamePrefix() ."* stopinsert"
augroup END
2007-11-03 00:23:09 +03:00
if g:NERDTreeHijackNetrw
augroup NERDTreeHijackNetrw
autocmd VimEnter * silent! autocmd! FileExplorer
au BufEnter,VimEnter * call nerdtree#checkForBrowse(expand("<amatch>"))
augroup END
endif
2008-12-13 09:32:35 +03:00
if g:NERDTreeChDirMode == 3
augroup NERDTreeChDirOnTabSwitch
autocmd TabEnter * if g:NERDTree.ExistsForTab()|call g:NERDTree.ForCurrentTab().getRoot().path.changeToDir()|endif
augroup END
endif
" SECTION: Public API {{{1
2008-06-28 16:23:02 +04:00
"============================================================
function! NERDTreeAddMenuItem(options)
call g:NERDTreeMenuItem.Create(a:options)
endfunction
function! NERDTreeAddMenuSeparator(...)
let opts = a:0 ? a:1 : {}
call g:NERDTreeMenuItem.CreateSeparator(opts)
2009-08-21 17:25:18 +04:00
endfunction
function! NERDTreeAddSubmenu(options)
return g:NERDTreeMenuItem.Create(a:options)
2009-08-18 18:05:02 +04:00
endfunction
function! NERDTreeAddKeyMap(options)
call g:NERDTreeKeyMap.Create(a:options)
endfunction
2008-06-28 16:23:02 +04:00
function! NERDTreeRender()
call nerdtree#renderView()
2007-11-03 00:23:09 +03:00
endfunction
function! NERDTreeFocus()
2015-05-02 16:44:32 +03:00
if g:NERDTree.IsOpen()
call g:NERDTree.CursorToTreeWin()
else
call g:NERDTreeCreator.ToggleTabTree("")
endif
endfunction
function! NERDTreeCWD()
if empty(getcwd())
call nerdtree#echoWarning('current directory does not exist')
return
endif
try
let l:cwdPath = g:NERDTreePath.New(getcwd())
catch /^NERDTree.InvalidArgumentsError/
call nerdtree#echoWarning('current directory does not exist')
return
endtry
call NERDTreeFocus()
2018-09-10 13:57:39 +03:00
if b:NERDTree.root.path.equals(l:cwdPath)
return
endif
2018-09-10 13:57:39 +03:00
let l:newRoot = g:NERDTreeFileNode.New(l:cwdPath, b:NERDTree)
call b:NERDTree.changeRoot(l:newRoot)
2018-09-10 15:52:43 +03:00
normal! ^
2007-11-03 00:23:09 +03:00
endfunction
function! NERDTreeAddPathFilter(callback)
call g:NERDTree.AddPathFilter(a:callback)
endfunction
2012-01-06 19:05:47 +04:00
" SECTION: Post Source Actions {{{1
call nerdtree#postSourceActions()
2008-10-01 13:32:03 +04:00
"reset &cpo back to users setting
let &cpo = s:old_cpo
2008-06-08 09:34:22 +04:00
" vim: set sw=4 sts=4 et fdm=marker: