Add vim NERDtree
This commit is contained in:
		
							parent
							
								
									53b040f40a
								
							
						
					
					
						commit
						e4046c5b90
					
				
							
								
								
									
										3
									
								
								vim/bundle/nerdtree/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								vim/bundle/nerdtree/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,3 @@
 | 
				
			||||||
 | 
					*~
 | 
				
			||||||
 | 
					*.swp
 | 
				
			||||||
 | 
					tags
 | 
				
			||||||
							
								
								
									
										108
									
								
								vim/bundle/nerdtree/README.markdown
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										108
									
								
								vim/bundle/nerdtree/README.markdown
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,108 @@
 | 
				
			||||||
 | 
					The NERD Tree
 | 
				
			||||||
 | 
					=============
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Intro
 | 
				
			||||||
 | 
					-----
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The NERD tree allows you to explore your filesystem and to open files and
 | 
				
			||||||
 | 
					directories. It presents the filesystem to you in the form of a tree which you
 | 
				
			||||||
 | 
					manipulate with the keyboard and/or mouse. It also allows you to perform
 | 
				
			||||||
 | 
					simple filesystem operations.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The following features and functionality are provided by the NERD tree:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * Files and directories are displayed in a hierarchical tree structure
 | 
				
			||||||
 | 
					  * Different highlighting is provided for the following types of nodes:
 | 
				
			||||||
 | 
					    * files
 | 
				
			||||||
 | 
					    * directories
 | 
				
			||||||
 | 
					    * sym-links
 | 
				
			||||||
 | 
					    * windows .lnk files
 | 
				
			||||||
 | 
					    * read-only files
 | 
				
			||||||
 | 
					    * executable files
 | 
				
			||||||
 | 
					  * Many (customisable) mappings are provided to manipulate the tree:
 | 
				
			||||||
 | 
					    * Mappings to open/close/explore directory nodes
 | 
				
			||||||
 | 
					    * Mappings to open files in new/existing windows/tabs
 | 
				
			||||||
 | 
					    * Mappings to change the current root of the tree
 | 
				
			||||||
 | 
					    * Mappings to navigate around the tree
 | 
				
			||||||
 | 
					    * ...
 | 
				
			||||||
 | 
					  * Directories and files can be bookmarked.
 | 
				
			||||||
 | 
					  * Most NERD tree navigation can also be done with the mouse
 | 
				
			||||||
 | 
					  * Filtering of tree content (can be toggled at runtime)
 | 
				
			||||||
 | 
					    * custom file filters to prevent e.g. vim backup files being displayed
 | 
				
			||||||
 | 
					    * optional displaying of hidden files (. files)
 | 
				
			||||||
 | 
					    * files can be "turned off" so that only directories are displayed
 | 
				
			||||||
 | 
					  * The position and size of the NERD tree window can be customised
 | 
				
			||||||
 | 
					  * The order in which the nodes in the tree are listed can be customised.
 | 
				
			||||||
 | 
					  * A model of your filesystem is created/maintained as you explore it. This
 | 
				
			||||||
 | 
					    has several advantages:
 | 
				
			||||||
 | 
					    * All filesystem information is cached and is only re-read on demand
 | 
				
			||||||
 | 
					    * If you revisit a part of the tree that you left earlier in your
 | 
				
			||||||
 | 
					      session, the directory nodes will be opened/closed as you left them
 | 
				
			||||||
 | 
					  * The script remembers the cursor position and window position in the NERD
 | 
				
			||||||
 | 
					    tree so you can toggle it off (or just close the tree window) and then
 | 
				
			||||||
 | 
					    reopen it (with NERDTreeToggle) the NERD tree window will appear exactly
 | 
				
			||||||
 | 
					    as you left it
 | 
				
			||||||
 | 
					  * You can have a separate NERD tree for each tab, share trees across tabs,
 | 
				
			||||||
 | 
					    or a mix of both.
 | 
				
			||||||
 | 
					  * By default the script overrides the default file browser (netrw), so if
 | 
				
			||||||
 | 
					    you :edit a directory a (slightly modified) NERD tree will appear in the
 | 
				
			||||||
 | 
					    current window
 | 
				
			||||||
 | 
					  * A programmable menu system is provided (simulates right clicking on a node)
 | 
				
			||||||
 | 
					    * one default menu plugin is provided to perform basic filesystem
 | 
				
			||||||
 | 
					      operations (create/delete/move/copy files/directories)
 | 
				
			||||||
 | 
					  * There's an API for adding your own keymappings
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Installation
 | 
				
			||||||
 | 
					------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[pathogen.vim](https://github.com/tpope/vim-pathogen) is the recommended way to install nerdtree.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    cd ~/.vim/bundle
 | 
				
			||||||
 | 
					    git clone https://github.com/scrooloose/nerdtree.git
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Then reload vim, run `:helptags`, and check out `:help NERD_tree.txt`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Faq
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					__Q. Can I have the nerdtree on every tab automatically?__
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					A. Nope. If this is something you want then chances are you aren't using tabs
 | 
				
			||||||
 | 
					   and buffers as they were intended to be used. Read this
 | 
				
			||||||
 | 
					   http://stackoverflow.com/questions/102384/using-vims-tabs-like-buffers
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   If you are interested in this behaviour then consider [vim-nerdtree-tabs](https://github.com/jistr/vim-nerdtree-tabs)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					__Q. How can I open a NERDTree automatically when vim starts up?__
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					A. Stick this in your vimrc: `autocmd vimenter * NERDTree`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					__Q. How can I open a NERDTree automatically when vim starts up if no files were specified?__
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					A. Stick this in your vimrc `autocmd vimenter * if !argc() | NERDTree | endif`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					__Q. How can I map a specific key or shortcut to open NERDTree?__
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					A. Stick this in your vimrc to open NERDTree with `Ctrl+n` (you can set whatever key you want): `map <C-n> :NERDTreeToggle<CR>`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					__Q. How can I close vim if the only window left open is a NERDTree?__
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					A. Stick this in your vimrc:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   `autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTreeType") && b:NERDTreeType == "primary") | q | endif`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Changelog
 | 
				
			||||||
 | 
					---------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					4.2.0 (2011-12-28)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 * Add NERDTreeDirArrows option to make the UI use pretty arrow chars instead of the old +~| chars to define the tree structure (sickill)
 | 
				
			||||||
 | 
					 * shift the syntax highlighting out into its own syntax file (gnap) * add some mac specific options to the filesystem menu - for macvim only (andersonfreitas)
 | 
				
			||||||
 | 
					 * Add NERDTreeMinimalUI option to remove some non functional parts of the nerdtree ui (camthompson)
 | 
				
			||||||
 | 
					 * tweak the behaviour of :NERDTreeFind - see :help :NERDTreeFind for the new behaviour (benjamingeiger)
 | 
				
			||||||
 | 
					 * if no name is given to :Bookmark, make it default to the name of the target file/dir (minyoung)
 | 
				
			||||||
 | 
					 * use 'file' completion when doing copying, create, and move operations (EvanDotPro)
 | 
				
			||||||
 | 
					 * lots of misc bug fixes (paddyoloughlin, sdewald, camthompson, Vitaly Bogdanov, AndrewRadev, mathias, scottstvnsn, kml, wycats, me RAWR!)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										1380
									
								
								vim/bundle/nerdtree/autoload/nerdtree.vim
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1380
									
								
								vim/bundle/nerdtree/autoload/nerdtree.vim
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1362
									
								
								vim/bundle/nerdtree/doc/NERD_tree.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1362
									
								
								vim/bundle/nerdtree/doc/NERD_tree.txt
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										315
									
								
								vim/bundle/nerdtree/lib/nerdtree/bookmark.vim
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										315
									
								
								vim/bundle/nerdtree/lib/nerdtree/bookmark.vim
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,315 @@
 | 
				
			||||||
 | 
					"CLASS: Bookmark
 | 
				
			||||||
 | 
					"============================================================
 | 
				
			||||||
 | 
					let s:Bookmark = {}
 | 
				
			||||||
 | 
					let g:NERDTreeBookmark = s:Bookmark
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					" FUNCTION: Bookmark.activate() {{{1
 | 
				
			||||||
 | 
					function! s:Bookmark.activate(...)
 | 
				
			||||||
 | 
					    call self.open(a:0 ? a:1 : {})
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					" FUNCTION: Bookmark.AddBookmark(name, path) {{{1
 | 
				
			||||||
 | 
					" Class method to add a new bookmark to the list, if a previous bookmark exists
 | 
				
			||||||
 | 
					" with the same name, just update the path for that bookmark
 | 
				
			||||||
 | 
					function! s:Bookmark.AddBookmark(name, path)
 | 
				
			||||||
 | 
					    for i in s:Bookmark.Bookmarks()
 | 
				
			||||||
 | 
					        if i.name ==# a:name
 | 
				
			||||||
 | 
					            let i.path = a:path
 | 
				
			||||||
 | 
					            return
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					    endfor
 | 
				
			||||||
 | 
					    call add(s:Bookmark.Bookmarks(), s:Bookmark.New(a:name, a:path))
 | 
				
			||||||
 | 
					    call s:Bookmark.Sort()
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					" FUNCTION: Bookmark.Bookmarks()   {{{1
 | 
				
			||||||
 | 
					" Class method to get all bookmarks. Lazily initializes the bookmarks global
 | 
				
			||||||
 | 
					" variable
 | 
				
			||||||
 | 
					function! s:Bookmark.Bookmarks()
 | 
				
			||||||
 | 
					    if !exists("g:NERDTreeBookmarks")
 | 
				
			||||||
 | 
					        let g:NERDTreeBookmarks = []
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					    return g:NERDTreeBookmarks
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					" FUNCTION: Bookmark.BookmarkExistsFor(name)   {{{1
 | 
				
			||||||
 | 
					" class method that returns 1 if a bookmark with the given name is found, 0
 | 
				
			||||||
 | 
					" otherwise
 | 
				
			||||||
 | 
					function! s:Bookmark.BookmarkExistsFor(name)
 | 
				
			||||||
 | 
					    try
 | 
				
			||||||
 | 
					        call s:Bookmark.BookmarkFor(a:name)
 | 
				
			||||||
 | 
					        return 1
 | 
				
			||||||
 | 
					    catch /^NERDTree.BookmarkNotFoundError/
 | 
				
			||||||
 | 
					        return 0
 | 
				
			||||||
 | 
					    endtry
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					" FUNCTION: Bookmark.BookmarkFor(name)   {{{1
 | 
				
			||||||
 | 
					" Class method to get the bookmark that has the given name. {} is return if no
 | 
				
			||||||
 | 
					" bookmark is found
 | 
				
			||||||
 | 
					function! s:Bookmark.BookmarkFor(name)
 | 
				
			||||||
 | 
					    for i in s:Bookmark.Bookmarks()
 | 
				
			||||||
 | 
					        if i.name ==# a:name
 | 
				
			||||||
 | 
					            return i
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					    endfor
 | 
				
			||||||
 | 
					    throw "NERDTree.BookmarkNotFoundError: no bookmark found for name: \"". a:name  .'"'
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					" FUNCTION: Bookmark.BookmarkNames()   {{{1
 | 
				
			||||||
 | 
					" Class method to return an array of all bookmark names
 | 
				
			||||||
 | 
					function! s:Bookmark.BookmarkNames()
 | 
				
			||||||
 | 
					    let names = []
 | 
				
			||||||
 | 
					    for i in s:Bookmark.Bookmarks()
 | 
				
			||||||
 | 
					        call add(names, i.name)
 | 
				
			||||||
 | 
					    endfor
 | 
				
			||||||
 | 
					    return names
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					" FUNCTION: Bookmark.CacheBookmarks(silent) {{{1
 | 
				
			||||||
 | 
					" Class method to read all bookmarks from the bookmarks file initialize
 | 
				
			||||||
 | 
					" bookmark objects for each one.
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					" Args:
 | 
				
			||||||
 | 
					" silent - dont echo an error msg if invalid bookmarks are found
 | 
				
			||||||
 | 
					function! s:Bookmark.CacheBookmarks(silent)
 | 
				
			||||||
 | 
					    if filereadable(g:NERDTreeBookmarksFile)
 | 
				
			||||||
 | 
					        let g:NERDTreeBookmarks = []
 | 
				
			||||||
 | 
					        let g:NERDTreeInvalidBookmarks = []
 | 
				
			||||||
 | 
					        let bookmarkStrings = readfile(g:NERDTreeBookmarksFile)
 | 
				
			||||||
 | 
					        let invalidBookmarksFound = 0
 | 
				
			||||||
 | 
					        for i in bookmarkStrings
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            "ignore blank lines
 | 
				
			||||||
 | 
					            if i != ''
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                let name = substitute(i, '^\(.\{-}\) .*$', '\1', '')
 | 
				
			||||||
 | 
					                let path = substitute(i, '^.\{-} \(.*\)$', '\1', '')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                try
 | 
				
			||||||
 | 
					                    let bookmark = s:Bookmark.New(name, g:NERDTreePath.New(path))
 | 
				
			||||||
 | 
					                    call add(g:NERDTreeBookmarks, bookmark)
 | 
				
			||||||
 | 
					                catch /^NERDTree.InvalidArgumentsError/
 | 
				
			||||||
 | 
					                    call add(g:NERDTreeInvalidBookmarks, i)
 | 
				
			||||||
 | 
					                    let invalidBookmarksFound += 1
 | 
				
			||||||
 | 
					                endtry
 | 
				
			||||||
 | 
					            endif
 | 
				
			||||||
 | 
					        endfor
 | 
				
			||||||
 | 
					        if invalidBookmarksFound
 | 
				
			||||||
 | 
					            call s:Bookmark.Write()
 | 
				
			||||||
 | 
					            if !a:silent
 | 
				
			||||||
 | 
					                call nerdtree#echo(invalidBookmarksFound . " invalid bookmarks were read. See :help NERDTreeInvalidBookmarks for info.")
 | 
				
			||||||
 | 
					            endif
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					        call s:Bookmark.Sort()
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					" FUNCTION: Bookmark.compareTo(otherbookmark) {{{1
 | 
				
			||||||
 | 
					" Compare these two bookmarks for sorting purposes
 | 
				
			||||||
 | 
					function! s:Bookmark.compareTo(otherbookmark)
 | 
				
			||||||
 | 
					    return a:otherbookmark.name < self.name
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					" FUNCTION: Bookmark.ClearAll() {{{1
 | 
				
			||||||
 | 
					" Class method to delete all bookmarks.
 | 
				
			||||||
 | 
					function! s:Bookmark.ClearAll()
 | 
				
			||||||
 | 
					    for i in s:Bookmark.Bookmarks()
 | 
				
			||||||
 | 
					        call i.delete()
 | 
				
			||||||
 | 
					    endfor
 | 
				
			||||||
 | 
					    call s:Bookmark.Write()
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					" FUNCTION: Bookmark.delete() {{{1
 | 
				
			||||||
 | 
					" Delete this bookmark. If the node for this bookmark is under the current
 | 
				
			||||||
 | 
					" root, then recache bookmarks for its Path object
 | 
				
			||||||
 | 
					function! s:Bookmark.delete()
 | 
				
			||||||
 | 
					    let node = {}
 | 
				
			||||||
 | 
					    try
 | 
				
			||||||
 | 
					        let node = self.getNode(1)
 | 
				
			||||||
 | 
					    catch /^NERDTree.BookmarkedNodeNotFoundError/
 | 
				
			||||||
 | 
					    endtry
 | 
				
			||||||
 | 
					    call remove(s:Bookmark.Bookmarks(), index(s:Bookmark.Bookmarks(), self))
 | 
				
			||||||
 | 
					    if !empty(node)
 | 
				
			||||||
 | 
					        call node.path.cacheDisplayString()
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					    call s:Bookmark.Write()
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					" FUNCTION: Bookmark.getNode(searchFromAbsoluteRoot) {{{1
 | 
				
			||||||
 | 
					" Gets the treenode for this bookmark
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					" Args:
 | 
				
			||||||
 | 
					" searchFromAbsoluteRoot: specifies whether we should search from the current
 | 
				
			||||||
 | 
					" tree root, or the highest cached node
 | 
				
			||||||
 | 
					function! s:Bookmark.getNode(searchFromAbsoluteRoot)
 | 
				
			||||||
 | 
					    let searchRoot = a:searchFromAbsoluteRoot ? g:NERDTreeDirNode.AbsoluteTreeRoot() : b:NERDTreeRoot
 | 
				
			||||||
 | 
					    let targetNode = searchRoot.findNode(self.path)
 | 
				
			||||||
 | 
					    if empty(targetNode)
 | 
				
			||||||
 | 
					        throw "NERDTree.BookmarkedNodeNotFoundError: no node was found for bookmark: " . self.name
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					    return targetNode
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					" FUNCTION: Bookmark.GetNodeForName(name, searchFromAbsoluteRoot) {{{1
 | 
				
			||||||
 | 
					" Class method that finds the bookmark with the given name and returns the
 | 
				
			||||||
 | 
					" treenode for it.
 | 
				
			||||||
 | 
					function! s:Bookmark.GetNodeForName(name, searchFromAbsoluteRoot)
 | 
				
			||||||
 | 
					    let bookmark = s:Bookmark.BookmarkFor(a:name)
 | 
				
			||||||
 | 
					    return bookmark.getNode(a:searchFromAbsoluteRoot)
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					" FUNCTION: Bookmark.GetSelected() {{{1
 | 
				
			||||||
 | 
					" returns the Bookmark the cursor is over, or {}
 | 
				
			||||||
 | 
					function! s:Bookmark.GetSelected()
 | 
				
			||||||
 | 
					    let line = getline(".")
 | 
				
			||||||
 | 
					    let name = substitute(line, '^>\(.\{-}\) .\+$', '\1', '')
 | 
				
			||||||
 | 
					    if name != line
 | 
				
			||||||
 | 
					        try
 | 
				
			||||||
 | 
					            return s:Bookmark.BookmarkFor(name)
 | 
				
			||||||
 | 
					        catch /^NERDTree.BookmarkNotFoundError/
 | 
				
			||||||
 | 
					            return {}
 | 
				
			||||||
 | 
					        endtry
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					    return {}
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					" FUNCTION: Bookmark.InvalidBookmarks()   {{{1
 | 
				
			||||||
 | 
					" Class method to get all invalid bookmark strings read from the bookmarks
 | 
				
			||||||
 | 
					" file
 | 
				
			||||||
 | 
					function! s:Bookmark.InvalidBookmarks()
 | 
				
			||||||
 | 
					    if !exists("g:NERDTreeInvalidBookmarks")
 | 
				
			||||||
 | 
					        let g:NERDTreeInvalidBookmarks = []
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					    return g:NERDTreeInvalidBookmarks
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					" FUNCTION: Bookmark.mustExist() {{{1
 | 
				
			||||||
 | 
					function! s:Bookmark.mustExist()
 | 
				
			||||||
 | 
					    if !self.path.exists()
 | 
				
			||||||
 | 
					        call s:Bookmark.CacheBookmarks(1)
 | 
				
			||||||
 | 
					        throw "NERDTree.BookmarkPointsToInvalidLocationError: the bookmark \"".
 | 
				
			||||||
 | 
					            \ self.name ."\" points to a non existing location: \"". self.path.str()
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					" FUNCTION: Bookmark.New(name, path) {{{1
 | 
				
			||||||
 | 
					" Create a new bookmark object with the given name and path object
 | 
				
			||||||
 | 
					function! s:Bookmark.New(name, path)
 | 
				
			||||||
 | 
					    if a:name =~# ' '
 | 
				
			||||||
 | 
					        throw "NERDTree.IllegalBookmarkNameError: illegal name:" . a:name
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let newBookmark = copy(self)
 | 
				
			||||||
 | 
					    let newBookmark.name = a:name
 | 
				
			||||||
 | 
					    let newBookmark.path = a:path
 | 
				
			||||||
 | 
					    return newBookmark
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					" FUNCTION: Bookmark.open([options]) {{{1
 | 
				
			||||||
 | 
					"Args:
 | 
				
			||||||
 | 
					"A dictionary containing the following keys (all optional):
 | 
				
			||||||
 | 
					"  'where': Specifies whether the node should be opened in new split/tab or in
 | 
				
			||||||
 | 
					"           the previous window. Can be either 'v' (vertical split), 'h'
 | 
				
			||||||
 | 
					"           (horizontal split), 't' (new tab) or 'p' (previous window).
 | 
				
			||||||
 | 
					"  'reuse': if a window is displaying the file then jump the cursor there
 | 
				
			||||||
 | 
					"  'keepopen': dont close the tree window
 | 
				
			||||||
 | 
					"  'stay': open the file, but keep the cursor in the tree win
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					function! s:Bookmark.open(...)
 | 
				
			||||||
 | 
					    let opts = a:0 ? a:1 : {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if self.path.isDirectory && !has_key(opts, 'where')
 | 
				
			||||||
 | 
					        call self.toRoot()
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        let opener = g:NERDTreeOpener.New(self.path, opts)
 | 
				
			||||||
 | 
					        call opener.open(self)
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					" FUNCTION: Bookmark.openInNewTab(options) {{{1
 | 
				
			||||||
 | 
					" Create a new bookmark object with the given name and path object
 | 
				
			||||||
 | 
					function! s:Bookmark.openInNewTab(options)
 | 
				
			||||||
 | 
					    call nerdtree#deprecated('Bookmark.openInNewTab', 'is deprecated, use open() instead')
 | 
				
			||||||
 | 
					    call self.open(a:options)
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					" FUNCTION: Bookmark.setPath(path)   {{{1
 | 
				
			||||||
 | 
					" makes this bookmark point to the given path
 | 
				
			||||||
 | 
					function! s:Bookmark.setPath(path)
 | 
				
			||||||
 | 
					    let self.path = a:path
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					" FUNCTION: Bookmark.Sort()   {{{1
 | 
				
			||||||
 | 
					" Class method that sorts all bookmarks
 | 
				
			||||||
 | 
					function! s:Bookmark.Sort()
 | 
				
			||||||
 | 
					    let CompareFunc = function("nerdtree#compareBookmarks")
 | 
				
			||||||
 | 
					    call sort(s:Bookmark.Bookmarks(), CompareFunc)
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					" FUNCTION: Bookmark.str()   {{{1
 | 
				
			||||||
 | 
					" Get the string that should be rendered in the view for this bookmark
 | 
				
			||||||
 | 
					function! s:Bookmark.str()
 | 
				
			||||||
 | 
					    let pathStrMaxLen = winwidth(nerdtree#getTreeWinNum()) - 4 - len(self.name)
 | 
				
			||||||
 | 
					    if &nu
 | 
				
			||||||
 | 
					        let pathStrMaxLen = pathStrMaxLen - &numberwidth
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let pathStr = self.path.str({'format': 'UI'})
 | 
				
			||||||
 | 
					    if len(pathStr) > pathStrMaxLen
 | 
				
			||||||
 | 
					        let pathStr = '<' . strpart(pathStr, len(pathStr) - pathStrMaxLen)
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					    return '>' . self.name . ' ' . pathStr
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					" FUNCTION: Bookmark.toRoot() {{{1
 | 
				
			||||||
 | 
					" Make the node for this bookmark the new tree root
 | 
				
			||||||
 | 
					function! s:Bookmark.toRoot()
 | 
				
			||||||
 | 
					    if self.validate()
 | 
				
			||||||
 | 
					        try
 | 
				
			||||||
 | 
					            let targetNode = self.getNode(1)
 | 
				
			||||||
 | 
					        catch /^NERDTree.BookmarkedNodeNotFoundError/
 | 
				
			||||||
 | 
					            let targetNode = g:NERDTreeFileNode.New(s:Bookmark.BookmarkFor(self.name).path)
 | 
				
			||||||
 | 
					        endtry
 | 
				
			||||||
 | 
					        call targetNode.makeRoot()
 | 
				
			||||||
 | 
					        call nerdtree#renderView()
 | 
				
			||||||
 | 
					        call targetNode.putCursorHere(0, 0)
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					" FUNCTION: Bookmark.ToRoot(name) {{{1
 | 
				
			||||||
 | 
					" Make the node for this bookmark the new tree root
 | 
				
			||||||
 | 
					function! s:Bookmark.ToRoot(name)
 | 
				
			||||||
 | 
					    let bookmark = s:Bookmark.BookmarkFor(a:name)
 | 
				
			||||||
 | 
					    call bookmark.toRoot()
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					" FUNCTION: Bookmark.validate() {{{1
 | 
				
			||||||
 | 
					function! s:Bookmark.validate()
 | 
				
			||||||
 | 
					    if self.path.exists()
 | 
				
			||||||
 | 
					        return 1
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        call s:Bookmark.CacheBookmarks(1)
 | 
				
			||||||
 | 
					        call nerdtree#renderView()
 | 
				
			||||||
 | 
					        call nerdtree#echo(self.name . "now points to an invalid location. See :help NERDTreeInvalidBookmarks for info.")
 | 
				
			||||||
 | 
					        return 0
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					" FUNCTION: Bookmark.Write()   {{{1
 | 
				
			||||||
 | 
					" Class method to write all bookmarks to the bookmarks file
 | 
				
			||||||
 | 
					function! s:Bookmark.Write()
 | 
				
			||||||
 | 
					    let bookmarkStrings = []
 | 
				
			||||||
 | 
					    for i in s:Bookmark.Bookmarks()
 | 
				
			||||||
 | 
					        call add(bookmarkStrings, i.name . ' ' . i.path.str())
 | 
				
			||||||
 | 
					    endfor
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    "add a blank line before the invalid ones
 | 
				
			||||||
 | 
					    call add(bookmarkStrings, "")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for j in s:Bookmark.InvalidBookmarks()
 | 
				
			||||||
 | 
					        call add(bookmarkStrings, j)
 | 
				
			||||||
 | 
					    endfor
 | 
				
			||||||
 | 
					    call writefile(bookmarkStrings, g:NERDTreeBookmarksFile)
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					" vim: set sw=4 sts=4 et fdm=marker:
 | 
				
			||||||
							
								
								
									
										322
									
								
								vim/bundle/nerdtree/lib/nerdtree/creator.vim
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										322
									
								
								vim/bundle/nerdtree/lib/nerdtree/creator.vim
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,322 @@
 | 
				
			||||||
 | 
					"CLASS: Creator
 | 
				
			||||||
 | 
					"Creates primary/secondary/mirror nerdtree windows. Sets up all the window and
 | 
				
			||||||
 | 
					"buffer options and key mappings etc.
 | 
				
			||||||
 | 
					"============================================================
 | 
				
			||||||
 | 
					let s:Creator = {}
 | 
				
			||||||
 | 
					let g:NERDTreeCreator = s:Creator
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: s:Creator._bindMappings() {{{1
 | 
				
			||||||
 | 
					function! s:Creator._bindMappings()
 | 
				
			||||||
 | 
					    "make <cr> do the same as the default 'o' mapping
 | 
				
			||||||
 | 
					    exec "nnoremap <silent> <buffer> <cr> :call nerdtree#invokeKeyMap('". g:NERDTreeMapActivateNode ."')<cr>"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    call g:NERDTreeKeyMap.BindAll()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    command! -buffer -nargs=? Bookmark :call nerdtree#bookmarkNode('<args>')
 | 
				
			||||||
 | 
					    command! -buffer -complete=customlist,nerdtree#completeBookmarks -nargs=1 RevealBookmark :call nerdtree#revealBookmark('<args>')
 | 
				
			||||||
 | 
					    command! -buffer -complete=customlist,nerdtree#completeBookmarks -nargs=1 OpenBookmark :call nerdtree#openBookmark('<args>')
 | 
				
			||||||
 | 
					    command! -buffer -complete=customlist,nerdtree#completeBookmarks -nargs=* ClearBookmarks call nerdtree#clearBookmarks('<args>')
 | 
				
			||||||
 | 
					    command! -buffer -complete=customlist,nerdtree#completeBookmarks -nargs=+ BookmarkToRoot call g:NERDTreeBookmark.ToRoot('<args>')
 | 
				
			||||||
 | 
					    command! -buffer -nargs=0 ClearAllBookmarks call g:NERDTreeBookmark.ClearAll() <bar> call nerdtree#renderView()
 | 
				
			||||||
 | 
					    command! -buffer -nargs=0 ReadBookmarks call g:NERDTreeBookmark.CacheBookmarks(0) <bar> call nerdtree#renderView()
 | 
				
			||||||
 | 
					    command! -buffer -nargs=0 WriteBookmarks call g:NERDTreeBookmark.Write()
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: s:Creator._broadcastInitEvent() {{{1
 | 
				
			||||||
 | 
					function! s:Creator._broadcastInitEvent()
 | 
				
			||||||
 | 
					    silent doautocmd User NERDTreeInit
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					" FUNCTION: s:Creator.BufNamePrefix() {{{2
 | 
				
			||||||
 | 
					function! s:Creator.BufNamePrefix()
 | 
				
			||||||
 | 
					    return 'NERD_tree_'
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: s:Creator.CreatePrimary(a:name) {{{1
 | 
				
			||||||
 | 
					function! s:Creator.CreatePrimary(name)
 | 
				
			||||||
 | 
					    let creator = s:Creator.New()
 | 
				
			||||||
 | 
					    call creator.createPrimary(a:name)
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: s:Creator.createPrimary(a:name) {{{1
 | 
				
			||||||
 | 
					"name: the name of a bookmark or a directory
 | 
				
			||||||
 | 
					function! s:Creator.createPrimary(name)
 | 
				
			||||||
 | 
					    let path = self._pathForString(a:name)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    "if instructed to, then change the vim CWD to the dir the NERDTree is
 | 
				
			||||||
 | 
					    "inited in
 | 
				
			||||||
 | 
					    if g:NERDTreeChDirMode != 0
 | 
				
			||||||
 | 
					        call path.changeToDir()
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if nerdtree#treeExistsForTab()
 | 
				
			||||||
 | 
					        if nerdtree#isTreeOpen()
 | 
				
			||||||
 | 
					            call nerdtree#closeTree()
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					        unlet t:NERDTreeBufName
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let newRoot = g:NERDTreeDirNode.New(path)
 | 
				
			||||||
 | 
					    call newRoot.open()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    call self._createTreeWin()
 | 
				
			||||||
 | 
					    let b:treeShowHelp = 0
 | 
				
			||||||
 | 
					    let b:NERDTreeIgnoreEnabled = 1
 | 
				
			||||||
 | 
					    let b:NERDTreeShowFiles = g:NERDTreeShowFiles
 | 
				
			||||||
 | 
					    let b:NERDTreeShowHidden = g:NERDTreeShowHidden
 | 
				
			||||||
 | 
					    let b:NERDTreeShowBookmarks = g:NERDTreeShowBookmarks
 | 
				
			||||||
 | 
					    let b:NERDTreeRoot = newRoot
 | 
				
			||||||
 | 
					    let b:NERDTreeType = "primary"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    call nerdtree#renderView()
 | 
				
			||||||
 | 
					    call b:NERDTreeRoot.putCursorHere(0, 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    call self._broadcastInitEvent()
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: s:Creator.CreateSecondary(dir) {{{1
 | 
				
			||||||
 | 
					function! s:Creator.CreateSecondary(dir)
 | 
				
			||||||
 | 
					    let creator = s:Creator.New()
 | 
				
			||||||
 | 
					    call creator.createSecondary(a:dir)
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: s:Creator.createSecondary(dir) {{{1
 | 
				
			||||||
 | 
					function! s:Creator.createSecondary(dir)
 | 
				
			||||||
 | 
					    try
 | 
				
			||||||
 | 
					        let path = g:NERDTreePath.New(a:dir)
 | 
				
			||||||
 | 
					    catch /^NERDTree.InvalidArgumentsError/
 | 
				
			||||||
 | 
					        call nerdtree#echo("Invalid directory name:" . a:name)
 | 
				
			||||||
 | 
					        return
 | 
				
			||||||
 | 
					    endtry
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    "we want the directory buffer to disappear when we do the :edit below
 | 
				
			||||||
 | 
					    setlocal bufhidden=wipe
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let previousBuf = expand("#")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    "we need a unique name for each secondary tree buffer to ensure they are
 | 
				
			||||||
 | 
					    "all independent
 | 
				
			||||||
 | 
					    exec "silent edit " . self._nextBufferName()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let b:NERDTreePreviousBuf = bufnr(previousBuf)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let b:NERDTreeRoot = g:NERDTreeDirNode.New(path)
 | 
				
			||||||
 | 
					    call b:NERDTreeRoot.open()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    call self._setCommonBufOptions()
 | 
				
			||||||
 | 
					    let b:NERDTreeType = "secondary"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    call nerdtree#renderView()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    call self._broadcastInitEvent()
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					" FUNCTION: s:Creator.CreateMirror() {{{1
 | 
				
			||||||
 | 
					function! s:Creator.CreateMirror()
 | 
				
			||||||
 | 
					    let creator = s:Creator.New()
 | 
				
			||||||
 | 
					    call creator.createMirror()
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					" FUNCTION: s:Creator.createMirror() {{{1
 | 
				
			||||||
 | 
					function! s:Creator.createMirror()
 | 
				
			||||||
 | 
					    "get the names off all the nerd tree buffers
 | 
				
			||||||
 | 
					    let treeBufNames = []
 | 
				
			||||||
 | 
					    for i in range(1, tabpagenr("$"))
 | 
				
			||||||
 | 
					        let nextName = nerdtree#tabpagevar(i, 'NERDTreeBufName')
 | 
				
			||||||
 | 
					        if nextName != -1 && (!exists("t:NERDTreeBufName") || nextName != t:NERDTreeBufName)
 | 
				
			||||||
 | 
					            call add(treeBufNames, nextName)
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					    endfor
 | 
				
			||||||
 | 
					    let treeBufNames = nerdtree#unique(treeBufNames)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    "map the option names (that the user will be prompted with) to the nerd
 | 
				
			||||||
 | 
					    "tree buffer names
 | 
				
			||||||
 | 
					    let options = {}
 | 
				
			||||||
 | 
					    let i = 0
 | 
				
			||||||
 | 
					    while i < len(treeBufNames)
 | 
				
			||||||
 | 
					        let bufName = treeBufNames[i]
 | 
				
			||||||
 | 
					        let treeRoot = getbufvar(bufName, "NERDTreeRoot")
 | 
				
			||||||
 | 
					        let options[i+1 . '. ' . treeRoot.path.str() . '  (buf name: ' . bufName . ')'] = bufName
 | 
				
			||||||
 | 
					        let i = i + 1
 | 
				
			||||||
 | 
					    endwhile
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    "work out which tree to mirror, if there is more than 1 then ask the user
 | 
				
			||||||
 | 
					    let bufferName = ''
 | 
				
			||||||
 | 
					    if len(keys(options)) > 1
 | 
				
			||||||
 | 
					        let choices = ["Choose a tree to mirror"]
 | 
				
			||||||
 | 
					        let choices = extend(choices, sort(keys(options)))
 | 
				
			||||||
 | 
					        let choice = inputlist(choices)
 | 
				
			||||||
 | 
					        if choice < 1 || choice > len(options) || choice ==# ''
 | 
				
			||||||
 | 
					            return
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let bufferName = options[sort(keys(options))[choice-1]]
 | 
				
			||||||
 | 
					    elseif len(keys(options)) ==# 1
 | 
				
			||||||
 | 
					        let bufferName = values(options)[0]
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        call nerdtree#echo("No trees to mirror")
 | 
				
			||||||
 | 
					        return
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if nerdtree#treeExistsForTab() && nerdtree#isTreeOpen()
 | 
				
			||||||
 | 
					        call nerdtree#closeTree()
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let t:NERDTreeBufName = bufferName
 | 
				
			||||||
 | 
					    call self._createTreeWin()
 | 
				
			||||||
 | 
					    exec 'buffer ' .  bufferName
 | 
				
			||||||
 | 
					    if !&hidden
 | 
				
			||||||
 | 
					        call nerdtree#renderView()
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: s:Creator._createTreeWin() {{{1
 | 
				
			||||||
 | 
					"Inits the NERD tree window. ie. opens it, sizes it, sets all the local
 | 
				
			||||||
 | 
					"options etc
 | 
				
			||||||
 | 
					function! s:Creator._createTreeWin()
 | 
				
			||||||
 | 
					    "create the nerd tree window
 | 
				
			||||||
 | 
					    let splitLocation = g:NERDTreeWinPos ==# "left" ? "topleft " : "botright "
 | 
				
			||||||
 | 
					    let splitSize = g:NERDTreeWinSize
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if !exists('t:NERDTreeBufName')
 | 
				
			||||||
 | 
					        let t:NERDTreeBufName = self._nextBufferName()
 | 
				
			||||||
 | 
					        silent! exec splitLocation . 'vertical ' . splitSize . ' new'
 | 
				
			||||||
 | 
					        silent! exec "edit " . t:NERDTreeBufName
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        silent! exec splitLocation . 'vertical ' . splitSize . ' split'
 | 
				
			||||||
 | 
					        silent! exec "buffer " . t:NERDTreeBufName
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    setlocal winfixwidth
 | 
				
			||||||
 | 
					    call self._setCommonBufOptions()
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: s:Creator.New() {{{1
 | 
				
			||||||
 | 
					function! s:Creator.New()
 | 
				
			||||||
 | 
					    let newCreator = copy(self)
 | 
				
			||||||
 | 
					    return newCreator
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					" FUNCTION: s:Creator._nextBufferName() {{{2
 | 
				
			||||||
 | 
					" returns the buffer name for the next nerd tree
 | 
				
			||||||
 | 
					function! s:Creator._nextBufferName()
 | 
				
			||||||
 | 
					    let name = s:Creator.BufNamePrefix() . self._nextBufferNumber()
 | 
				
			||||||
 | 
					    return name
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					" FUNCTION: s:Creator._nextBufferNumber() {{{2
 | 
				
			||||||
 | 
					" the number to add to the nerd tree buffer name to make the buf name unique
 | 
				
			||||||
 | 
					function! s:Creator._nextBufferNumber()
 | 
				
			||||||
 | 
					    if !exists("s:Creator._NextBufNum")
 | 
				
			||||||
 | 
					        let s:Creator._NextBufNum = 1
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        let s:Creator._NextBufNum += 1
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return s:Creator._NextBufNum
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: s:Creator._pathForString(str) {{{1
 | 
				
			||||||
 | 
					"find a bookmark or adirectory for the given string
 | 
				
			||||||
 | 
					function! s:Creator._pathForString(str)
 | 
				
			||||||
 | 
					    let path = {}
 | 
				
			||||||
 | 
					    if g:NERDTreeBookmark.BookmarkExistsFor(a:str)
 | 
				
			||||||
 | 
					        let path = g:NERDTreeBookmark.BookmarkFor(a:str).path
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        let dir = a:str ==# '' ? getcwd() : a:str
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        "hack to get an absolute path if a relative path is given
 | 
				
			||||||
 | 
					        if dir =~# '^\.'
 | 
				
			||||||
 | 
					            let dir = getcwd() . g:NERDTreePath.Slash() . dir
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					        let dir = g:NERDTreePath.Resolve(dir)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        try
 | 
				
			||||||
 | 
					            let path = g:NERDTreePath.New(dir)
 | 
				
			||||||
 | 
					        catch /^NERDTree.InvalidArgumentsError/
 | 
				
			||||||
 | 
					            call nerdtree#echo("No bookmark or directory found for: " . a:str)
 | 
				
			||||||
 | 
					            return
 | 
				
			||||||
 | 
					        endtry
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					    if !path.isDirectory
 | 
				
			||||||
 | 
					        let path = path.getParent()
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return path
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: s:Creator._setCommonBufOptions() {{{1
 | 
				
			||||||
 | 
					function! s:Creator._setCommonBufOptions()
 | 
				
			||||||
 | 
					    "throwaway buffer options
 | 
				
			||||||
 | 
					    setlocal noswapfile
 | 
				
			||||||
 | 
					    setlocal buftype=nofile
 | 
				
			||||||
 | 
					    setlocal bufhidden=hide
 | 
				
			||||||
 | 
					    setlocal nowrap
 | 
				
			||||||
 | 
					    setlocal foldcolumn=0
 | 
				
			||||||
 | 
					    setlocal foldmethod=manual
 | 
				
			||||||
 | 
					    setlocal nofoldenable
 | 
				
			||||||
 | 
					    setlocal nobuflisted
 | 
				
			||||||
 | 
					    setlocal nospell
 | 
				
			||||||
 | 
					    if g:NERDTreeShowLineNumbers
 | 
				
			||||||
 | 
					        setlocal nu
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        setlocal nonu
 | 
				
			||||||
 | 
					        if v:version >= 703
 | 
				
			||||||
 | 
					            setlocal nornu
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    iabc <buffer>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if g:NERDTreeHighlightCursorline
 | 
				
			||||||
 | 
					        setlocal cursorline
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    call self._setupStatusline()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let b:treeShowHelp = 0
 | 
				
			||||||
 | 
					    let b:NERDTreeIgnoreEnabled = 1
 | 
				
			||||||
 | 
					    let b:NERDTreeShowFiles = g:NERDTreeShowFiles
 | 
				
			||||||
 | 
					    let b:NERDTreeShowHidden = g:NERDTreeShowHidden
 | 
				
			||||||
 | 
					    let b:NERDTreeShowBookmarks = g:NERDTreeShowBookmarks
 | 
				
			||||||
 | 
					    setfiletype nerdtree
 | 
				
			||||||
 | 
					    call self._bindMappings()
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: s:Creator._setupStatusline() {{{1
 | 
				
			||||||
 | 
					function! s:Creator._setupStatusline()
 | 
				
			||||||
 | 
					    if g:NERDTreeStatusline != -1
 | 
				
			||||||
 | 
					        let &l:statusline = g:NERDTreeStatusline
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: s:Creator.TogglePrimary(dir) {{{1
 | 
				
			||||||
 | 
					function! s:Creator.TogglePrimary(dir)
 | 
				
			||||||
 | 
					    let creator = s:Creator.New()
 | 
				
			||||||
 | 
					    call creator.togglePrimary(a:dir)
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: s:Creator.togglePrimary(dir) {{{1
 | 
				
			||||||
 | 
					"Toggles the NERD tree. I.e the NERD tree is open, it is closed, if it is
 | 
				
			||||||
 | 
					"closed it is restored or initialized (if it doesnt exist)
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Args:
 | 
				
			||||||
 | 
					"dir: the full path for the root node (is only used if the NERD tree is being
 | 
				
			||||||
 | 
					"initialized.
 | 
				
			||||||
 | 
					function! s:Creator.togglePrimary(dir)
 | 
				
			||||||
 | 
					    if nerdtree#treeExistsForTab()
 | 
				
			||||||
 | 
					        if !nerdtree#isTreeOpen()
 | 
				
			||||||
 | 
					            call self._createTreeWin()
 | 
				
			||||||
 | 
					            if !&hidden
 | 
				
			||||||
 | 
					                call nerdtree#renderView()
 | 
				
			||||||
 | 
					            endif
 | 
				
			||||||
 | 
					            call nerdtree#restoreScreenState()
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					            call nerdtree#closeTree()
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        call self.createPrimary(a:dir)
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					" vim: set sw=4 sts=4 et fdm=marker:
 | 
				
			||||||
							
								
								
									
										143
									
								
								vim/bundle/nerdtree/lib/nerdtree/key_map.vim
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										143
									
								
								vim/bundle/nerdtree/lib/nerdtree/key_map.vim
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,143 @@
 | 
				
			||||||
 | 
					"CLASS: KeyMap
 | 
				
			||||||
 | 
					"============================================================
 | 
				
			||||||
 | 
					let s:KeyMap = {}
 | 
				
			||||||
 | 
					let g:NERDTreeKeyMap = s:KeyMap
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: KeyMap.All() {{{1
 | 
				
			||||||
 | 
					function! s:KeyMap.All()
 | 
				
			||||||
 | 
					    if !exists("s:keyMaps")
 | 
				
			||||||
 | 
					        let s:keyMaps = []
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					    return s:keyMaps
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: KeyMap.FindFor(key, scope) {{{1
 | 
				
			||||||
 | 
					function! s:KeyMap.FindFor(key, scope)
 | 
				
			||||||
 | 
					    for i in s:KeyMap.All()
 | 
				
			||||||
 | 
					         if i.key ==# a:key && i.scope ==# a:scope
 | 
				
			||||||
 | 
					            return i
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					    endfor
 | 
				
			||||||
 | 
					    return {}
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: KeyMap.BindAll() {{{1
 | 
				
			||||||
 | 
					function! s:KeyMap.BindAll()
 | 
				
			||||||
 | 
					    for i in s:KeyMap.All()
 | 
				
			||||||
 | 
					        call i.bind()
 | 
				
			||||||
 | 
					    endfor
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: KeyMap.bind() {{{1
 | 
				
			||||||
 | 
					function! s:KeyMap.bind()
 | 
				
			||||||
 | 
					    " If the key sequence we're trying to map contains any '<>' notation, we
 | 
				
			||||||
 | 
					    " must replace each of the '<' characters with '<lt>' to ensure the string
 | 
				
			||||||
 | 
					    " is not translated into its corresponding keycode during the later part
 | 
				
			||||||
 | 
					    " of the map command below
 | 
				
			||||||
 | 
					    " :he <>
 | 
				
			||||||
 | 
					    let specialNotationRegex = '\m<\([[:alnum:]_-]\+>\)'
 | 
				
			||||||
 | 
					    if self.key =~# specialNotationRegex
 | 
				
			||||||
 | 
					        let keymapInvokeString = substitute(self.key, specialNotationRegex, '<lt>\1', 'g')
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        let keymapInvokeString = self.key
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let premap = self.key == "<LeftRelease>" ? " <LeftRelease>" : " "
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    exec 'nnoremap <buffer> <silent> '. self.key . premap . ':call nerdtree#invokeKeyMap("'. keymapInvokeString .'")<cr>'
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: KeyMap.Remove(key, scope) {{{1
 | 
				
			||||||
 | 
					function! s:KeyMap.Remove(key, scope)
 | 
				
			||||||
 | 
					    let maps = s:KeyMap.All()
 | 
				
			||||||
 | 
					    for i in range(len(maps))
 | 
				
			||||||
 | 
					         if maps[i].key ==# a:key && maps[i].scope ==# a:scope
 | 
				
			||||||
 | 
					            return remove(maps, i)
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					    endfor
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: KeyMap.invoke() {{{1
 | 
				
			||||||
 | 
					"Call the KeyMaps callback function
 | 
				
			||||||
 | 
					function! s:KeyMap.invoke(...)
 | 
				
			||||||
 | 
					    let Callback = function(self.callback)
 | 
				
			||||||
 | 
					    if a:0
 | 
				
			||||||
 | 
					        call Callback(a:1)
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        call Callback()
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: KeyMap.Invoke() {{{1
 | 
				
			||||||
 | 
					"Find a keymapping for a:key and the current scope invoke it.
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Scope is determined as follows:
 | 
				
			||||||
 | 
					"   * if the cursor is on a dir node then "DirNode"
 | 
				
			||||||
 | 
					"   * if the cursor is on a file node then "FileNode"
 | 
				
			||||||
 | 
					"   * if the cursor is on a bookmark then "Bookmark"
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"If a keymap has the scope of "all" then it will be called if no other keymap
 | 
				
			||||||
 | 
					"is found for a:key and the scope.
 | 
				
			||||||
 | 
					function! s:KeyMap.Invoke(key)
 | 
				
			||||||
 | 
					    let node = g:NERDTreeFileNode.GetSelected()
 | 
				
			||||||
 | 
					    if !empty(node)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        "try file node
 | 
				
			||||||
 | 
					        if !node.path.isDirectory
 | 
				
			||||||
 | 
					            let km = s:KeyMap.FindFor(a:key, "FileNode")
 | 
				
			||||||
 | 
					            if !empty(km)
 | 
				
			||||||
 | 
					                return km.invoke(node)
 | 
				
			||||||
 | 
					            endif
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        "try dir node
 | 
				
			||||||
 | 
					        if node.path.isDirectory
 | 
				
			||||||
 | 
					            let km = s:KeyMap.FindFor(a:key, "DirNode")
 | 
				
			||||||
 | 
					            if !empty(km)
 | 
				
			||||||
 | 
					                return km.invoke(node)
 | 
				
			||||||
 | 
					            endif
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        "try generic node
 | 
				
			||||||
 | 
					        let km = s:KeyMap.FindFor(a:key, "Node")
 | 
				
			||||||
 | 
					        if !empty(km)
 | 
				
			||||||
 | 
					            return km.invoke(node)
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    "try bookmark
 | 
				
			||||||
 | 
					    let bm = g:NERDTreeBookmark.GetSelected()
 | 
				
			||||||
 | 
					    if !empty(bm)
 | 
				
			||||||
 | 
					        let km = s:KeyMap.FindFor(a:key, "Bookmark")
 | 
				
			||||||
 | 
					        if !empty(km)
 | 
				
			||||||
 | 
					            return km.invoke(bm)
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    "try all
 | 
				
			||||||
 | 
					    let km = s:KeyMap.FindFor(a:key, "all")
 | 
				
			||||||
 | 
					    if !empty(km)
 | 
				
			||||||
 | 
					        return km.invoke()
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: KeyMap.Create(options) {{{1
 | 
				
			||||||
 | 
					function! s:KeyMap.Create(options)
 | 
				
			||||||
 | 
					    let newKeyMap = copy(self)
 | 
				
			||||||
 | 
					    let opts = extend({'scope': 'all', 'quickhelpText': ''}, copy(a:options))
 | 
				
			||||||
 | 
					    let newKeyMap.key = opts['key']
 | 
				
			||||||
 | 
					    let newKeyMap.quickhelpText = opts['quickhelpText']
 | 
				
			||||||
 | 
					    let newKeyMap.callback = opts['callback']
 | 
				
			||||||
 | 
					    let newKeyMap.scope = opts['scope']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    call s:KeyMap.Add(newKeyMap)
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: KeyMap.Add(keymap) {{{1
 | 
				
			||||||
 | 
					function! s:KeyMap.Add(keymap)
 | 
				
			||||||
 | 
					    call s:KeyMap.Remove(a:keymap.key, a:keymap.scope)
 | 
				
			||||||
 | 
					    call add(s:KeyMap.All(), a:keymap)
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					" vim: set sw=4 sts=4 et fdm=marker:
 | 
				
			||||||
							
								
								
									
										180
									
								
								vim/bundle/nerdtree/lib/nerdtree/menu_controller.vim
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										180
									
								
								vim/bundle/nerdtree/lib/nerdtree/menu_controller.vim
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,180 @@
 | 
				
			||||||
 | 
					"CLASS: MenuController
 | 
				
			||||||
 | 
					"============================================================
 | 
				
			||||||
 | 
					let s:MenuController = {}
 | 
				
			||||||
 | 
					let g:NERDTreeMenuController = s:MenuController
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: MenuController.New(menuItems) {{{1
 | 
				
			||||||
 | 
					"create a new menu controller that operates on the given menu items
 | 
				
			||||||
 | 
					function! s:MenuController.New(menuItems)
 | 
				
			||||||
 | 
					    let newMenuController =  copy(self)
 | 
				
			||||||
 | 
					    if a:menuItems[0].isSeparator()
 | 
				
			||||||
 | 
					        let newMenuController.menuItems = a:menuItems[1:-1]
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        let newMenuController.menuItems = a:menuItems
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					    return newMenuController
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: MenuController.showMenu() {{{1
 | 
				
			||||||
 | 
					"start the main loop of the menu and get the user to choose/execute a menu
 | 
				
			||||||
 | 
					"item
 | 
				
			||||||
 | 
					function! s:MenuController.showMenu()
 | 
				
			||||||
 | 
					    call self._saveOptions()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    try
 | 
				
			||||||
 | 
					        let self.selection = 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let done = 0
 | 
				
			||||||
 | 
					        while !done
 | 
				
			||||||
 | 
					            redraw!
 | 
				
			||||||
 | 
					            call self._echoPrompt()
 | 
				
			||||||
 | 
					            let key = nr2char(getchar())
 | 
				
			||||||
 | 
					            let done = self._handleKeypress(key)
 | 
				
			||||||
 | 
					        endwhile
 | 
				
			||||||
 | 
					    finally
 | 
				
			||||||
 | 
					        call self._restoreOptions()
 | 
				
			||||||
 | 
					    endtry
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if self.selection != -1
 | 
				
			||||||
 | 
					        let m = self._current()
 | 
				
			||||||
 | 
					        call m.execute()
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: MenuController._echoPrompt() {{{1
 | 
				
			||||||
 | 
					function! s:MenuController._echoPrompt()
 | 
				
			||||||
 | 
					    echo "NERDTree Menu. Use j/k/enter and the shortcuts indicated"
 | 
				
			||||||
 | 
					    echo "=========================================================="
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for i in range(0, len(self.menuItems)-1)
 | 
				
			||||||
 | 
					        if self.selection == i
 | 
				
			||||||
 | 
					            echo "> " . self.menuItems[i].text
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					            echo "  " . self.menuItems[i].text
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					    endfor
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: MenuController._current(key) {{{1
 | 
				
			||||||
 | 
					"get the MenuItem that is currently selected
 | 
				
			||||||
 | 
					function! s:MenuController._current()
 | 
				
			||||||
 | 
					    return self.menuItems[self.selection]
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: MenuController._handleKeypress(key) {{{1
 | 
				
			||||||
 | 
					"change the selection (if appropriate) and return 1 if the user has made
 | 
				
			||||||
 | 
					"their choice, 0 otherwise
 | 
				
			||||||
 | 
					function! s:MenuController._handleKeypress(key)
 | 
				
			||||||
 | 
					    if a:key == 'j'
 | 
				
			||||||
 | 
					        call self._cursorDown()
 | 
				
			||||||
 | 
					    elseif a:key == 'k'
 | 
				
			||||||
 | 
					        call self._cursorUp()
 | 
				
			||||||
 | 
					    elseif a:key == nr2char(27) "escape
 | 
				
			||||||
 | 
					        let self.selection = -1
 | 
				
			||||||
 | 
					        return 1
 | 
				
			||||||
 | 
					    elseif a:key == "\r" || a:key == "\n" "enter and ctrl-j
 | 
				
			||||||
 | 
					        return 1
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        let index = self._nextIndexFor(a:key)
 | 
				
			||||||
 | 
					        if index != -1
 | 
				
			||||||
 | 
					            let self.selection = index
 | 
				
			||||||
 | 
					            if len(self._allIndexesFor(a:key)) == 1
 | 
				
			||||||
 | 
					                return 1
 | 
				
			||||||
 | 
					            endif
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return 0
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: MenuController._allIndexesFor(shortcut) {{{1
 | 
				
			||||||
 | 
					"get indexes to all menu items with the given shortcut
 | 
				
			||||||
 | 
					function! s:MenuController._allIndexesFor(shortcut)
 | 
				
			||||||
 | 
					    let toReturn = []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for i in range(0, len(self.menuItems)-1)
 | 
				
			||||||
 | 
					        if self.menuItems[i].shortcut == a:shortcut
 | 
				
			||||||
 | 
					            call add(toReturn, i)
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					    endfor
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return toReturn
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: MenuController._nextIndexFor(shortcut) {{{1
 | 
				
			||||||
 | 
					"get the index to the next menu item with the given shortcut, starts from the
 | 
				
			||||||
 | 
					"current cursor location and wraps around to the top again if need be
 | 
				
			||||||
 | 
					function! s:MenuController._nextIndexFor(shortcut)
 | 
				
			||||||
 | 
					    for i in range(self.selection+1, len(self.menuItems)-1)
 | 
				
			||||||
 | 
					        if self.menuItems[i].shortcut == a:shortcut
 | 
				
			||||||
 | 
					            return i
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					    endfor
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for i in range(0, self.selection)
 | 
				
			||||||
 | 
					        if self.menuItems[i].shortcut == a:shortcut
 | 
				
			||||||
 | 
					            return i
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					    endfor
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return -1
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: MenuController._setCmdheight() {{{1
 | 
				
			||||||
 | 
					"sets &cmdheight to whatever is needed to display the menu
 | 
				
			||||||
 | 
					function! s:MenuController._setCmdheight()
 | 
				
			||||||
 | 
					    let &cmdheight = len(self.menuItems) + 3
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: MenuController._saveOptions() {{{1
 | 
				
			||||||
 | 
					"set any vim options that are required to make the menu work (saving their old
 | 
				
			||||||
 | 
					"values)
 | 
				
			||||||
 | 
					function! s:MenuController._saveOptions()
 | 
				
			||||||
 | 
					    let self._oldLazyredraw = &lazyredraw
 | 
				
			||||||
 | 
					    let self._oldCmdheight = &cmdheight
 | 
				
			||||||
 | 
					    set nolazyredraw
 | 
				
			||||||
 | 
					    call self._setCmdheight()
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: MenuController._restoreOptions() {{{1
 | 
				
			||||||
 | 
					"restore the options we saved in _saveOptions()
 | 
				
			||||||
 | 
					function! s:MenuController._restoreOptions()
 | 
				
			||||||
 | 
					    let &cmdheight = self._oldCmdheight
 | 
				
			||||||
 | 
					    let &lazyredraw = self._oldLazyredraw
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: MenuController._cursorDown() {{{1
 | 
				
			||||||
 | 
					"move the cursor to the next menu item, skipping separators
 | 
				
			||||||
 | 
					function! s:MenuController._cursorDown()
 | 
				
			||||||
 | 
					    let done = 0
 | 
				
			||||||
 | 
					    while !done
 | 
				
			||||||
 | 
					        if self.selection < len(self.menuItems)-1
 | 
				
			||||||
 | 
					            let self.selection += 1
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					            let self.selection = 0
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if !self._current().isSeparator()
 | 
				
			||||||
 | 
					            let done = 1
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					    endwhile
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: MenuController._cursorUp() {{{1
 | 
				
			||||||
 | 
					"move the cursor to the previous menu item, skipping separators
 | 
				
			||||||
 | 
					function! s:MenuController._cursorUp()
 | 
				
			||||||
 | 
					    let done = 0
 | 
				
			||||||
 | 
					    while !done
 | 
				
			||||||
 | 
					        if self.selection > 0
 | 
				
			||||||
 | 
					            let self.selection -= 1
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					            let self.selection = len(self.menuItems)-1
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if !self._current().isSeparator()
 | 
				
			||||||
 | 
					            let done = 1
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					    endwhile
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					" vim: set sw=4 sts=4 et fdm=marker:
 | 
				
			||||||
							
								
								
									
										114
									
								
								vim/bundle/nerdtree/lib/nerdtree/menu_item.vim
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										114
									
								
								vim/bundle/nerdtree/lib/nerdtree/menu_item.vim
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,114 @@
 | 
				
			||||||
 | 
					"CLASS: MenuItem
 | 
				
			||||||
 | 
					"============================================================
 | 
				
			||||||
 | 
					let s:MenuItem = {}
 | 
				
			||||||
 | 
					let g:NERDTreeMenuItem = s:MenuItem
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: MenuItem.All() {{{1
 | 
				
			||||||
 | 
					"get all top level menu items
 | 
				
			||||||
 | 
					function! s:MenuItem.All()
 | 
				
			||||||
 | 
					    if !exists("s:menuItems")
 | 
				
			||||||
 | 
					        let s:menuItems = []
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					    return s:menuItems
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: MenuItem.AllEnabled() {{{1
 | 
				
			||||||
 | 
					"get all top level menu items that are currently enabled
 | 
				
			||||||
 | 
					function! s:MenuItem.AllEnabled()
 | 
				
			||||||
 | 
					    let toReturn = []
 | 
				
			||||||
 | 
					    for i in s:MenuItem.All()
 | 
				
			||||||
 | 
					        if i.enabled()
 | 
				
			||||||
 | 
					            call add(toReturn, i)
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					    endfor
 | 
				
			||||||
 | 
					    return toReturn
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: MenuItem.Create(options) {{{1
 | 
				
			||||||
 | 
					"make a new menu item and add it to the global list
 | 
				
			||||||
 | 
					function! s:MenuItem.Create(options)
 | 
				
			||||||
 | 
					    let newMenuItem = copy(self)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let newMenuItem.text = a:options['text']
 | 
				
			||||||
 | 
					    let newMenuItem.shortcut = a:options['shortcut']
 | 
				
			||||||
 | 
					    let newMenuItem.children = []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let newMenuItem.isActiveCallback = -1
 | 
				
			||||||
 | 
					    if has_key(a:options, 'isActiveCallback')
 | 
				
			||||||
 | 
					        let newMenuItem.isActiveCallback = a:options['isActiveCallback']
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let newMenuItem.callback = -1
 | 
				
			||||||
 | 
					    if has_key(a:options, 'callback')
 | 
				
			||||||
 | 
					        let newMenuItem.callback = a:options['callback']
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if has_key(a:options, 'parent')
 | 
				
			||||||
 | 
					        call add(a:options['parent'].children, newMenuItem)
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        call add(s:MenuItem.All(), newMenuItem)
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return newMenuItem
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: MenuItem.CreateSeparator(options) {{{1
 | 
				
			||||||
 | 
					"make a new separator menu item and add it to the global list
 | 
				
			||||||
 | 
					function! s:MenuItem.CreateSeparator(options)
 | 
				
			||||||
 | 
					    let standard_options = { 'text': '--------------------',
 | 
				
			||||||
 | 
					                \ 'shortcut': -1,
 | 
				
			||||||
 | 
					                \ 'callback': -1 }
 | 
				
			||||||
 | 
					    let options = extend(a:options, standard_options, "force")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return s:MenuItem.Create(options)
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: MenuItem.CreateSubmenu(options) {{{1
 | 
				
			||||||
 | 
					"make a new submenu and add it to global list
 | 
				
			||||||
 | 
					function! s:MenuItem.CreateSubmenu(options)
 | 
				
			||||||
 | 
					    let standard_options = { 'callback': -1 }
 | 
				
			||||||
 | 
					    let options = extend(a:options, standard_options, "force")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return s:MenuItem.Create(options)
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: MenuItem.enabled() {{{1
 | 
				
			||||||
 | 
					"return 1 if this menu item should be displayed
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"delegates off to the isActiveCallback, and defaults to 1 if no callback was
 | 
				
			||||||
 | 
					"specified
 | 
				
			||||||
 | 
					function! s:MenuItem.enabled()
 | 
				
			||||||
 | 
					    if self.isActiveCallback != -1
 | 
				
			||||||
 | 
					        return {self.isActiveCallback}()
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					    return 1
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: MenuItem.execute() {{{1
 | 
				
			||||||
 | 
					"perform the action behind this menu item, if this menuitem has children then
 | 
				
			||||||
 | 
					"display a new menu for them, otherwise deletegate off to the menuitem's
 | 
				
			||||||
 | 
					"callback
 | 
				
			||||||
 | 
					function! s:MenuItem.execute()
 | 
				
			||||||
 | 
					    if len(self.children)
 | 
				
			||||||
 | 
					        let mc = s:MenuController.New(self.children)
 | 
				
			||||||
 | 
					        call mc.showMenu()
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        if self.callback != -1
 | 
				
			||||||
 | 
					            call {self.callback}()
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: MenuItem.isSeparator() {{{1
 | 
				
			||||||
 | 
					"return 1 if this menuitem is a separator
 | 
				
			||||||
 | 
					function! s:MenuItem.isSeparator()
 | 
				
			||||||
 | 
					    return self.callback == -1 && self.children == []
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: MenuItem.isSubmenu() {{{1
 | 
				
			||||||
 | 
					"return 1 if this menuitem is a submenu
 | 
				
			||||||
 | 
					function! s:MenuItem.isSubmenu()
 | 
				
			||||||
 | 
					    return self.callback == -1 && !empty(self.children)
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					" vim: set sw=4 sts=4 et fdm=marker:
 | 
				
			||||||
							
								
								
									
										264
									
								
								vim/bundle/nerdtree/lib/nerdtree/opener.vim
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										264
									
								
								vim/bundle/nerdtree/lib/nerdtree/opener.vim
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,264 @@
 | 
				
			||||||
 | 
					"CLASS: Opener
 | 
				
			||||||
 | 
					"============================================================
 | 
				
			||||||
 | 
					let s:Opener = {}
 | 
				
			||||||
 | 
					let g:NERDTreeOpener = s:Opener
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: Opener._checkToCloseTree(newtab) {{{1
 | 
				
			||||||
 | 
					"Check the class options and global options (i.e. NERDTreeQuitOnOpen) to see
 | 
				
			||||||
 | 
					"if the tree should be closed now.
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Args:
 | 
				
			||||||
 | 
					"a:newtab - boolean. If set, only close the tree now if we are opening the
 | 
				
			||||||
 | 
					"target in a new tab. This is needed because we have to close tree before we
 | 
				
			||||||
 | 
					"leave the tab
 | 
				
			||||||
 | 
					function! s:Opener._checkToCloseTree(newtab)
 | 
				
			||||||
 | 
					    if self._keepopen
 | 
				
			||||||
 | 
					        return
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (a:newtab && self._where == 't') || !a:newtab
 | 
				
			||||||
 | 
					        call nerdtree#closeTreeIfQuitOnOpen()
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: Opener._gotoTargetWin() {{{1
 | 
				
			||||||
 | 
					function! s:Opener._gotoTargetWin()
 | 
				
			||||||
 | 
					    if b:NERDTreeType ==# "secondary"
 | 
				
			||||||
 | 
					        if self._where == 'v'
 | 
				
			||||||
 | 
					            vsplit
 | 
				
			||||||
 | 
					        elseif self._where == 'h'
 | 
				
			||||||
 | 
					            split
 | 
				
			||||||
 | 
					        elseif self._where == 't'
 | 
				
			||||||
 | 
					            tabnew
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        call self._checkToCloseTree(1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if self._where == 'v'
 | 
				
			||||||
 | 
					            call self._newVSplit()
 | 
				
			||||||
 | 
					        elseif self._where == 'h'
 | 
				
			||||||
 | 
					            call self._newSplit()
 | 
				
			||||||
 | 
					        elseif self._where == 't'
 | 
				
			||||||
 | 
					            tabnew
 | 
				
			||||||
 | 
					        elseif self._where == 'p'
 | 
				
			||||||
 | 
					            call self._previousWindow()
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        call self._checkToCloseTree(0)
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: Opener.New(path, opts) {{{1
 | 
				
			||||||
 | 
					"Args:
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"a:path: The path object that is to be opened.
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"a:opts:
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"A dictionary containing the following keys (all optional):
 | 
				
			||||||
 | 
					"  'where': Specifies whether the node should be opened in new split/tab or in
 | 
				
			||||||
 | 
					"           the previous window. Can be either 'v' or 'h' or 't' (for open in
 | 
				
			||||||
 | 
					"           new tab)
 | 
				
			||||||
 | 
					"  'reuse': if a window is displaying the file then jump the cursor there
 | 
				
			||||||
 | 
					"  'keepopen': dont close the tree window
 | 
				
			||||||
 | 
					"  'stay': open the file, but keep the cursor in the tree win
 | 
				
			||||||
 | 
					function! s:Opener.New(path, opts)
 | 
				
			||||||
 | 
					    let newObj = copy(self)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let newObj._path = a:path
 | 
				
			||||||
 | 
					    let newObj._stay = nerdtree#has_opt(a:opts, 'stay')
 | 
				
			||||||
 | 
					    let newObj._reuse = nerdtree#has_opt(a:opts, 'reuse')
 | 
				
			||||||
 | 
					    let newObj._keepopen = nerdtree#has_opt(a:opts, 'keepopen')
 | 
				
			||||||
 | 
					    let newObj._where = has_key(a:opts, 'where') ? a:opts['where'] : ''
 | 
				
			||||||
 | 
					    let newObj._treetype = b:NERDTreeType
 | 
				
			||||||
 | 
					    call newObj._saveCursorPos()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return newObj
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: Opener._newSplit() {{{1
 | 
				
			||||||
 | 
					function! s:Opener._newSplit()
 | 
				
			||||||
 | 
					    " Save the user's settings for splitbelow and splitright
 | 
				
			||||||
 | 
					    let savesplitbelow=&splitbelow
 | 
				
			||||||
 | 
					    let savesplitright=&splitright
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    " 'there' will be set to a command to move from the split window
 | 
				
			||||||
 | 
					    " back to the explorer window
 | 
				
			||||||
 | 
					    "
 | 
				
			||||||
 | 
					    " 'back' will be set to a command to move from the explorer window
 | 
				
			||||||
 | 
					    " back to the newly split window
 | 
				
			||||||
 | 
					    "
 | 
				
			||||||
 | 
					    " 'right' and 'below' will be set to the settings needed for
 | 
				
			||||||
 | 
					    " splitbelow and splitright IF the explorer is the only window.
 | 
				
			||||||
 | 
					    "
 | 
				
			||||||
 | 
					    let there= g:NERDTreeWinPos ==# "left" ? "wincmd h" : "wincmd l"
 | 
				
			||||||
 | 
					    let back = g:NERDTreeWinPos ==# "left" ? "wincmd l" : "wincmd h"
 | 
				
			||||||
 | 
					    let right= g:NERDTreeWinPos ==# "left"
 | 
				
			||||||
 | 
					    let below=0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    " Attempt to go to adjacent window
 | 
				
			||||||
 | 
					    call nerdtree#exec(back)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let onlyOneWin = (winnr("$") ==# 1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    " If no adjacent window, set splitright and splitbelow appropriately
 | 
				
			||||||
 | 
					    if onlyOneWin
 | 
				
			||||||
 | 
					        let &splitright=right
 | 
				
			||||||
 | 
					        let &splitbelow=below
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        " found adjacent window - invert split direction
 | 
				
			||||||
 | 
					        let &splitright=!right
 | 
				
			||||||
 | 
					        let &splitbelow=!below
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let splitMode = onlyOneWin ? "vertical" : ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    " Open the new window
 | 
				
			||||||
 | 
					    try
 | 
				
			||||||
 | 
					        exec(splitMode." sp ")
 | 
				
			||||||
 | 
					    catch /^Vim\%((\a\+)\)\=:E37/
 | 
				
			||||||
 | 
					        call nerdtree#putCursorInTreeWin()
 | 
				
			||||||
 | 
					        throw "NERDTree.FileAlreadyOpenAndModifiedError: ". self._path.str() ." is already open and modified."
 | 
				
			||||||
 | 
					    catch /^Vim\%((\a\+)\)\=:/
 | 
				
			||||||
 | 
					        "do nothing
 | 
				
			||||||
 | 
					    endtry
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    "resize the tree window if no other window was open before
 | 
				
			||||||
 | 
					    if onlyOneWin
 | 
				
			||||||
 | 
					        let size = exists("b:NERDTreeOldWindowSize") ? b:NERDTreeOldWindowSize : g:NERDTreeWinSize
 | 
				
			||||||
 | 
					        call nerdtree#exec(there)
 | 
				
			||||||
 | 
					        exec("silent ". splitMode ." resize ". size)
 | 
				
			||||||
 | 
					        call nerdtree#exec('wincmd p')
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    " Restore splitmode settings
 | 
				
			||||||
 | 
					    let &splitbelow=savesplitbelow
 | 
				
			||||||
 | 
					    let &splitright=savesplitright
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: Opener._newVSplit() {{{1
 | 
				
			||||||
 | 
					function! s:Opener._newVSplit()
 | 
				
			||||||
 | 
					    let winwidth = winwidth(".")
 | 
				
			||||||
 | 
					    if winnr("$")==#1
 | 
				
			||||||
 | 
					        let winwidth = g:NERDTreeWinSize
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    call nerdtree#exec("wincmd p")
 | 
				
			||||||
 | 
					    vnew
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    "resize the nerd tree back to the original size
 | 
				
			||||||
 | 
					    call nerdtree#putCursorInTreeWin()
 | 
				
			||||||
 | 
					    exec("silent vertical resize ". winwidth)
 | 
				
			||||||
 | 
					    call nerdtree#exec('wincmd p')
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: Opener.open(target) {{{1
 | 
				
			||||||
 | 
					function! s:Opener.open(target)
 | 
				
			||||||
 | 
					    if self._path.isDirectory
 | 
				
			||||||
 | 
					        call self._openDirectory(a:target)
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        call self._openFile()
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: Opener._openFile() {{{1
 | 
				
			||||||
 | 
					function! s:Opener._openFile()
 | 
				
			||||||
 | 
					    if self._reuse && self._reuseWindow()
 | 
				
			||||||
 | 
					        return
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    call self._gotoTargetWin()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if self._treetype ==# "secondary"
 | 
				
			||||||
 | 
					        call self._path.edit()
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        call self._path.edit()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if self._stay
 | 
				
			||||||
 | 
					            call self._restoreCursorPos()
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: Opener._openDirectory(node) {{{1
 | 
				
			||||||
 | 
					function! s:Opener._openDirectory(node)
 | 
				
			||||||
 | 
					    if self._treetype ==# "secondary"
 | 
				
			||||||
 | 
					        call self._gotoTargetWin()
 | 
				
			||||||
 | 
					        call g:NERDTreeCreator.CreateSecondary(a:node.path.str())
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        call self._gotoTargetWin()
 | 
				
			||||||
 | 
					        if empty(self._where)
 | 
				
			||||||
 | 
					            call a:node.makeRoot()
 | 
				
			||||||
 | 
					            call nerdtree#renderView()
 | 
				
			||||||
 | 
					            call a:node.putCursorHere(0, 0)
 | 
				
			||||||
 | 
					        elseif self._where == 't'
 | 
				
			||||||
 | 
					            call g:NERDTreeCreator.CreatePrimary(a:node.path.str())
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					            call g:NERDTreeCreator.CreateSecondary(a:node.path.str())
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if self._stay
 | 
				
			||||||
 | 
					        call self._restoreCursorPos()
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: Opener._previousWindow() {{{1
 | 
				
			||||||
 | 
					function! s:Opener._previousWindow()
 | 
				
			||||||
 | 
					    if !nerdtree#isWindowUsable(winnr("#")) && nerdtree#firstUsableWindow() ==# -1
 | 
				
			||||||
 | 
					        call self._newSplit()
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        try
 | 
				
			||||||
 | 
					            if !nerdtree#isWindowUsable(winnr("#"))
 | 
				
			||||||
 | 
					                call nerdtree#exec(nerdtree#firstUsableWindow() . "wincmd w")
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					                call nerdtree#exec('wincmd p')
 | 
				
			||||||
 | 
					            endif
 | 
				
			||||||
 | 
					        catch /^Vim\%((\a\+)\)\=:E37/
 | 
				
			||||||
 | 
					            call nerdtree#putCursorInTreeWin()
 | 
				
			||||||
 | 
					            throw "NERDTree.FileAlreadyOpenAndModifiedError: ". self._path.str() ." is already open and modified."
 | 
				
			||||||
 | 
					        catch /^Vim\%((\a\+)\)\=:/
 | 
				
			||||||
 | 
					            echo v:exception
 | 
				
			||||||
 | 
					        endtry
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: Opener._restoreCursorPos(){{{1
 | 
				
			||||||
 | 
					function! s:Opener._restoreCursorPos()
 | 
				
			||||||
 | 
					    call nerdtree#exec('normal ' . self._tabnr . 'gt')
 | 
				
			||||||
 | 
					    call nerdtree#exec(bufwinnr(self._bufnr) . 'wincmd w')
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: Opener._reuseWindow(){{{1
 | 
				
			||||||
 | 
					"put the cursor in the first window we find for this file
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"return 1 if we were successful
 | 
				
			||||||
 | 
					function! s:Opener._reuseWindow()
 | 
				
			||||||
 | 
					    "check the current tab for the window
 | 
				
			||||||
 | 
					    let winnr = bufwinnr('^' . self._path.str() . '$')
 | 
				
			||||||
 | 
					    if winnr != -1
 | 
				
			||||||
 | 
					        call nerdtree#exec(winnr . "wincmd w")
 | 
				
			||||||
 | 
					        call self._checkToCloseTree(0)
 | 
				
			||||||
 | 
					        return 1
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        "check other tabs
 | 
				
			||||||
 | 
					        let tabnr = self._path.tabnr()
 | 
				
			||||||
 | 
					        if tabnr
 | 
				
			||||||
 | 
					            call self._checkToCloseTree(1)
 | 
				
			||||||
 | 
					            call nerdtree#exec('normal! ' . tabnr . 'gt')
 | 
				
			||||||
 | 
					            let winnr = bufwinnr('^' . self._path.str() . '$')
 | 
				
			||||||
 | 
					            call nerdtree#exec(winnr . "wincmd w")
 | 
				
			||||||
 | 
					            return 1
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					    return 0
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: Opener._saveCursorPos(){{{1
 | 
				
			||||||
 | 
					function! s:Opener._saveCursorPos()
 | 
				
			||||||
 | 
					    let self._bufnr = bufnr("")
 | 
				
			||||||
 | 
					    let self._tabnr = tabpagenr()
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					" vim: set sw=4 sts=4 et fdm=marker:
 | 
				
			||||||
							
								
								
									
										724
									
								
								vim/bundle/nerdtree/lib/nerdtree/path.vim
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										724
									
								
								vim/bundle/nerdtree/lib/nerdtree/path.vim
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,724 @@
 | 
				
			||||||
 | 
					"we need to use this number many times for sorting... so we calculate it only
 | 
				
			||||||
 | 
					"once here
 | 
				
			||||||
 | 
					let s:NERDTreeSortStarIndex = index(g:NERDTreeSortOrder, '*')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"CLASS: Path
 | 
				
			||||||
 | 
					"============================================================
 | 
				
			||||||
 | 
					let s:Path = {}
 | 
				
			||||||
 | 
					let g:NERDTreePath = s:Path
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: Path.AbsolutePathFor(str) {{{1
 | 
				
			||||||
 | 
					function! s:Path.AbsolutePathFor(str)
 | 
				
			||||||
 | 
					    let prependCWD = 0
 | 
				
			||||||
 | 
					    if nerdtree#runningWindows()
 | 
				
			||||||
 | 
					        let prependCWD = a:str !~# '^.:\(\\\|\/\)' && a:str !~# '^\(\\\\\|\/\/\)'
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        let prependCWD = a:str !~# '^/'
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let toReturn = a:str
 | 
				
			||||||
 | 
					    if prependCWD
 | 
				
			||||||
 | 
					        let toReturn = getcwd() . s:Path.Slash() . a:str
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return toReturn
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: Path.bookmarkNames() {{{1
 | 
				
			||||||
 | 
					function! s:Path.bookmarkNames()
 | 
				
			||||||
 | 
					    if !exists("self._bookmarkNames")
 | 
				
			||||||
 | 
					        call self.cacheDisplayString()
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					    return self._bookmarkNames
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: Path.cacheDisplayString() {{{1
 | 
				
			||||||
 | 
					function! s:Path.cacheDisplayString()
 | 
				
			||||||
 | 
					    let self.cachedDisplayString = self.getLastPathComponent(1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if self.isExecutable
 | 
				
			||||||
 | 
					        let self.cachedDisplayString = self.cachedDisplayString . '*'
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let self._bookmarkNames = []
 | 
				
			||||||
 | 
					    for i in g:NERDTreeBookmark.Bookmarks()
 | 
				
			||||||
 | 
					        if i.path.equals(self)
 | 
				
			||||||
 | 
					            call add(self._bookmarkNames, i.name)
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					    endfor
 | 
				
			||||||
 | 
					    if !empty(self._bookmarkNames)
 | 
				
			||||||
 | 
					        let self.cachedDisplayString .= ' {' . join(self._bookmarkNames) . '}'
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if self.isSymLink
 | 
				
			||||||
 | 
					        let self.cachedDisplayString .=  ' -> ' . self.symLinkDest
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if self.isReadOnly
 | 
				
			||||||
 | 
					        let self.cachedDisplayString .=  ' [RO]'
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: Path.changeToDir() {{{1
 | 
				
			||||||
 | 
					function! s:Path.changeToDir()
 | 
				
			||||||
 | 
					    let dir = self.str({'format': 'Cd'})
 | 
				
			||||||
 | 
					    if self.isDirectory ==# 0
 | 
				
			||||||
 | 
					        let dir = self.getParent().str({'format': 'Cd'})
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    try
 | 
				
			||||||
 | 
					        execute "cd " . dir
 | 
				
			||||||
 | 
					        call nerdtree#echo("CWD is now: " . getcwd())
 | 
				
			||||||
 | 
					    catch
 | 
				
			||||||
 | 
					        throw "NERDTree.PathChangeError: cannot change CWD to " . dir
 | 
				
			||||||
 | 
					    endtry
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: Path.compareTo() {{{1
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Compares this Path to the given path and returns 0 if they are equal, -1 if
 | 
				
			||||||
 | 
					"this Path is "less than" the given path, or 1 if it is "greater".
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Args:
 | 
				
			||||||
 | 
					"path: the path object to compare this to
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Return:
 | 
				
			||||||
 | 
					"1, -1 or 0
 | 
				
			||||||
 | 
					function! s:Path.compareTo(path)
 | 
				
			||||||
 | 
					    let thisPath = self.getLastPathComponent(1)
 | 
				
			||||||
 | 
					    let thatPath = a:path.getLastPathComponent(1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    "if the paths are the same then clearly we return 0
 | 
				
			||||||
 | 
					    if thisPath ==# thatPath
 | 
				
			||||||
 | 
					        return 0
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let thisSS = self.getSortOrderIndex()
 | 
				
			||||||
 | 
					    let thatSS = a:path.getSortOrderIndex()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    "compare the sort sequences, if they are different then the return
 | 
				
			||||||
 | 
					    "value is easy
 | 
				
			||||||
 | 
					    if thisSS < thatSS
 | 
				
			||||||
 | 
					        return -1
 | 
				
			||||||
 | 
					    elseif thisSS > thatSS
 | 
				
			||||||
 | 
					        return 1
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        "if the sort sequences are the same then compare the paths
 | 
				
			||||||
 | 
					        "alphabetically
 | 
				
			||||||
 | 
					        let pathCompare = g:NERDTreeCaseSensitiveSort ? thisPath <# thatPath : thisPath <? thatPath
 | 
				
			||||||
 | 
					        if pathCompare
 | 
				
			||||||
 | 
					            return -1
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					            return 1
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: Path.Create(fullpath) {{{1
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Factory method.
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Creates a path object with the given path. The path is also created on the
 | 
				
			||||||
 | 
					"filesystem. If the path already exists, a NERDTree.Path.Exists exception is
 | 
				
			||||||
 | 
					"thrown. If any other errors occur, a NERDTree.Path exception is thrown.
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Args:
 | 
				
			||||||
 | 
					"fullpath: the full filesystem path to the file/dir to create
 | 
				
			||||||
 | 
					function! s:Path.Create(fullpath)
 | 
				
			||||||
 | 
					    "bail if the a:fullpath already exists
 | 
				
			||||||
 | 
					    if isdirectory(a:fullpath) || filereadable(a:fullpath)
 | 
				
			||||||
 | 
					        throw "NERDTree.CreatePathError: Directory Exists: '" . a:fullpath . "'"
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    try
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        "if it ends with a slash, assume its a dir create it
 | 
				
			||||||
 | 
					        if a:fullpath =~# '\(\\\|\/\)$'
 | 
				
			||||||
 | 
					            "whack the trailing slash off the end if it exists
 | 
				
			||||||
 | 
					            let fullpath = substitute(a:fullpath, '\(\\\|\/\)$', '', '')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            call mkdir(fullpath, 'p')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        "assume its a file and create
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					            call writefile([], a:fullpath)
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					    catch
 | 
				
			||||||
 | 
					        throw "NERDTree.CreatePathError: Could not create path: '" . a:fullpath . "'"
 | 
				
			||||||
 | 
					    endtry
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return s:Path.New(a:fullpath)
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: Path.copy(dest) {{{1
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Copies the file/dir represented by this Path to the given location
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Args:
 | 
				
			||||||
 | 
					"dest: the location to copy this dir/file to
 | 
				
			||||||
 | 
					function! s:Path.copy(dest)
 | 
				
			||||||
 | 
					    if !s:Path.CopyingSupported()
 | 
				
			||||||
 | 
					        throw "NERDTree.CopyingNotSupportedError: Copying is not supported on this OS"
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let dest = s:Path.WinToUnixPath(a:dest)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let cmd = g:NERDTreeCopyCmd . " " . escape(self.str(), nerdtree#escChars()) . " " . escape(dest, nerdtree#escChars())
 | 
				
			||||||
 | 
					    let success = system(cmd)
 | 
				
			||||||
 | 
					    if success != 0
 | 
				
			||||||
 | 
					        throw "NERDTree.CopyError: Could not copy ''". self.str() ."'' to: '" . a:dest . "'"
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: Path.CopyingSupported() {{{1
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"returns 1 if copying is supported for this OS
 | 
				
			||||||
 | 
					function! s:Path.CopyingSupported()
 | 
				
			||||||
 | 
					    return exists('g:NERDTreeCopyCmd')
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: Path.copyingWillOverwrite(dest) {{{1
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"returns 1 if copy this path to the given location will cause files to
 | 
				
			||||||
 | 
					"overwritten
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Args:
 | 
				
			||||||
 | 
					"dest: the location this path will be copied to
 | 
				
			||||||
 | 
					function! s:Path.copyingWillOverwrite(dest)
 | 
				
			||||||
 | 
					    if filereadable(a:dest)
 | 
				
			||||||
 | 
					        return 1
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if isdirectory(a:dest)
 | 
				
			||||||
 | 
					        let path = s:Path.JoinPathStrings(a:dest, self.getLastPathComponent(0))
 | 
				
			||||||
 | 
					        if filereadable(path)
 | 
				
			||||||
 | 
					            return 1
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: Path.delete() {{{1
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Deletes the file represented by this path.
 | 
				
			||||||
 | 
					"Deletion of directories is not supported
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Throws NERDTree.Path.Deletion exceptions
 | 
				
			||||||
 | 
					function! s:Path.delete()
 | 
				
			||||||
 | 
					    if self.isDirectory
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let cmd = g:NERDTreeRemoveDirCmd . self.str({'escape': 1})
 | 
				
			||||||
 | 
					        let success = system(cmd)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if v:shell_error != 0
 | 
				
			||||||
 | 
					            throw "NERDTree.PathDeletionError: Could not delete directory: '" . self.str() . "'"
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        let success = delete(self.str())
 | 
				
			||||||
 | 
					        if success != 0
 | 
				
			||||||
 | 
					            throw "NERDTree.PathDeletionError: Could not delete file: '" . self.str() . "'"
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    "delete all bookmarks for this path
 | 
				
			||||||
 | 
					    for i in self.bookmarkNames()
 | 
				
			||||||
 | 
					        let bookmark = g:NERDTreeBookmark.BookmarkFor(i)
 | 
				
			||||||
 | 
					        call bookmark.delete()
 | 
				
			||||||
 | 
					    endfor
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: Path.displayString() {{{1
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Returns a string that specifies how the path should be represented as a
 | 
				
			||||||
 | 
					"string
 | 
				
			||||||
 | 
					function! s:Path.displayString()
 | 
				
			||||||
 | 
					    if self.cachedDisplayString ==# ""
 | 
				
			||||||
 | 
					        call self.cacheDisplayString()
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return self.cachedDisplayString
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: Path.edit() {{{1
 | 
				
			||||||
 | 
					function! s:Path.edit()
 | 
				
			||||||
 | 
					    exec "edit " . self.str({'format': 'Edit'})
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: Path.extractDriveLetter(fullpath) {{{1
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"If running windows, cache the drive letter for this path
 | 
				
			||||||
 | 
					function! s:Path.extractDriveLetter(fullpath)
 | 
				
			||||||
 | 
					    if nerdtree#runningWindows()
 | 
				
			||||||
 | 
					        if a:fullpath =~ '^\(\\\\\|\/\/\)'
 | 
				
			||||||
 | 
					            "For network shares, the 'drive' consists of the first two parts of the path, i.e. \\boxname\share
 | 
				
			||||||
 | 
					            let self.drive = substitute(a:fullpath, '^\(\(\\\\\|\/\/\)[^\\\/]*\(\\\|\/\)[^\\\/]*\).*', '\1', '')
 | 
				
			||||||
 | 
					            let self.drive = substitute(self.drive, '/', '\', "g")
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					            let self.drive = substitute(a:fullpath, '\(^[a-zA-Z]:\).*', '\1', '')
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        let self.drive = ''
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: Path.exists() {{{1
 | 
				
			||||||
 | 
					"return 1 if this path points to a location that is readable or is a directory
 | 
				
			||||||
 | 
					function! s:Path.exists()
 | 
				
			||||||
 | 
					    let p = self.str()
 | 
				
			||||||
 | 
					    return filereadable(p) || isdirectory(p)
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: Path.getDir() {{{1
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Returns this path if it is a directory, else this paths parent.
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Return:
 | 
				
			||||||
 | 
					"a Path object
 | 
				
			||||||
 | 
					function! s:Path.getDir()
 | 
				
			||||||
 | 
					    if self.isDirectory
 | 
				
			||||||
 | 
					        return self
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        return self.getParent()
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: Path.getParent() {{{1
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Returns a new path object for this paths parent
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Return:
 | 
				
			||||||
 | 
					"a new Path object
 | 
				
			||||||
 | 
					function! s:Path.getParent()
 | 
				
			||||||
 | 
					    if nerdtree#runningWindows()
 | 
				
			||||||
 | 
					        let path = self.drive . '\' . join(self.pathSegments[0:-2], '\')
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        let path = '/'. join(self.pathSegments[0:-2], '/')
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return s:Path.New(path)
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: Path.getLastPathComponent(dirSlash) {{{1
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Gets the last part of this path.
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Args:
 | 
				
			||||||
 | 
					"dirSlash: if 1 then a trailing slash will be added to the returned value for
 | 
				
			||||||
 | 
					"directory nodes.
 | 
				
			||||||
 | 
					function! s:Path.getLastPathComponent(dirSlash)
 | 
				
			||||||
 | 
					    if empty(self.pathSegments)
 | 
				
			||||||
 | 
					        return ''
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					    let toReturn = self.pathSegments[-1]
 | 
				
			||||||
 | 
					    if a:dirSlash && self.isDirectory
 | 
				
			||||||
 | 
					        let toReturn = toReturn . '/'
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					    return toReturn
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: Path.getSortOrderIndex() {{{1
 | 
				
			||||||
 | 
					"returns the index of the pattern in g:NERDTreeSortOrder that this path matches
 | 
				
			||||||
 | 
					function! s:Path.getSortOrderIndex()
 | 
				
			||||||
 | 
					    let i = 0
 | 
				
			||||||
 | 
					    while i < len(g:NERDTreeSortOrder)
 | 
				
			||||||
 | 
					        if  self.getLastPathComponent(1) =~# g:NERDTreeSortOrder[i]
 | 
				
			||||||
 | 
					            return i
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					        let i = i + 1
 | 
				
			||||||
 | 
					    endwhile
 | 
				
			||||||
 | 
					    return s:NERDTreeSortStarIndex
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: Path.isUnixHiddenFile() {{{1
 | 
				
			||||||
 | 
					"check for unix hidden files
 | 
				
			||||||
 | 
					function! s:Path.isUnixHiddenFile()
 | 
				
			||||||
 | 
					    return self.getLastPathComponent(0) =~# '^\.'
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: Path.isUnixHiddenPath() {{{1
 | 
				
			||||||
 | 
					"check for unix path with hidden components
 | 
				
			||||||
 | 
					function! s:Path.isUnixHiddenPath()
 | 
				
			||||||
 | 
					    if self.getLastPathComponent(0) =~# '^\.'
 | 
				
			||||||
 | 
					        return 1
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        for segment in self.pathSegments
 | 
				
			||||||
 | 
					            if segment =~# '^\.'
 | 
				
			||||||
 | 
					                return 1
 | 
				
			||||||
 | 
					            endif
 | 
				
			||||||
 | 
					        endfor
 | 
				
			||||||
 | 
					        return 0
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: Path.ignore() {{{1
 | 
				
			||||||
 | 
					"returns true if this path should be ignored
 | 
				
			||||||
 | 
					function! s:Path.ignore()
 | 
				
			||||||
 | 
					    "filter out the user specified paths to ignore
 | 
				
			||||||
 | 
					    if b:NERDTreeIgnoreEnabled
 | 
				
			||||||
 | 
					        for i in g:NERDTreeIgnore
 | 
				
			||||||
 | 
					            if self._ignorePatternMatches(i)
 | 
				
			||||||
 | 
					                return 1
 | 
				
			||||||
 | 
					            endif
 | 
				
			||||||
 | 
					        endfor
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    "dont show hidden files unless instructed to
 | 
				
			||||||
 | 
					    if b:NERDTreeShowHidden ==# 0 && self.isUnixHiddenFile()
 | 
				
			||||||
 | 
					        return 1
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if b:NERDTreeShowFiles ==# 0 && self.isDirectory ==# 0
 | 
				
			||||||
 | 
					        return 1
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if exists("*NERDTreeCustomIgnoreFilter") && NERDTreeCustomIgnoreFilter(self)
 | 
				
			||||||
 | 
					        return 1
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return 0
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: Path._ignorePatternMatches(pattern) {{{1
 | 
				
			||||||
 | 
					"returns true if this path matches the given ignore pattern
 | 
				
			||||||
 | 
					function! s:Path._ignorePatternMatches(pattern)
 | 
				
			||||||
 | 
					    let pat = a:pattern
 | 
				
			||||||
 | 
					    if strpart(pat,len(pat)-7) == '[[dir]]'
 | 
				
			||||||
 | 
					        if !self.isDirectory
 | 
				
			||||||
 | 
					            return 0
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					        let pat = strpart(pat,0, len(pat)-7)
 | 
				
			||||||
 | 
					    elseif strpart(pat,len(pat)-8) == '[[file]]'
 | 
				
			||||||
 | 
					        if self.isDirectory
 | 
				
			||||||
 | 
					            return 0
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					        let pat = strpart(pat,0, len(pat)-8)
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return self.getLastPathComponent(0) =~# pat
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: Path.isUnder(path) {{{1
 | 
				
			||||||
 | 
					"return 1 if this path is somewhere under the given path in the filesystem.
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"a:path should be a dir
 | 
				
			||||||
 | 
					function! s:Path.isUnder(path)
 | 
				
			||||||
 | 
					    if a:path.isDirectory == 0
 | 
				
			||||||
 | 
					        return 0
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let this = self.str()
 | 
				
			||||||
 | 
					    let that = a:path.str()
 | 
				
			||||||
 | 
					    return stridx(this, that . s:Path.Slash()) == 0
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: Path.JoinPathStrings(...) {{{1
 | 
				
			||||||
 | 
					function! s:Path.JoinPathStrings(...)
 | 
				
			||||||
 | 
					    let components = []
 | 
				
			||||||
 | 
					    for i in a:000
 | 
				
			||||||
 | 
					        let components = extend(components, split(i, '/'))
 | 
				
			||||||
 | 
					    endfor
 | 
				
			||||||
 | 
					    return '/' . join(components, '/')
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: Path.equals() {{{1
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Determines whether 2 path objects are "equal".
 | 
				
			||||||
 | 
					"They are equal if the paths they represent are the same
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Args:
 | 
				
			||||||
 | 
					"path: the other path obj to compare this with
 | 
				
			||||||
 | 
					function! s:Path.equals(path)
 | 
				
			||||||
 | 
					    return self.str() ==# a:path.str()
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: Path.New() {{{1
 | 
				
			||||||
 | 
					"The Constructor for the Path object
 | 
				
			||||||
 | 
					function! s:Path.New(path)
 | 
				
			||||||
 | 
					    let newPath = copy(self)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    call newPath.readInfoFromDisk(s:Path.AbsolutePathFor(a:path))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let newPath.cachedDisplayString = ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return newPath
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: Path.Slash() {{{1
 | 
				
			||||||
 | 
					"return the slash to use for the current OS
 | 
				
			||||||
 | 
					function! s:Path.Slash()
 | 
				
			||||||
 | 
					    return nerdtree#runningWindows() ? '\' : '/'
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: Path.Resolve() {{{1
 | 
				
			||||||
 | 
					"Invoke the vim resolve() function and return the result
 | 
				
			||||||
 | 
					"This is necessary because in some versions of vim resolve() removes trailing
 | 
				
			||||||
 | 
					"slashes while in other versions it doesn't.  This always removes the trailing
 | 
				
			||||||
 | 
					"slash
 | 
				
			||||||
 | 
					function! s:Path.Resolve(path)
 | 
				
			||||||
 | 
					    let tmp = resolve(a:path)
 | 
				
			||||||
 | 
					    return tmp =~# '.\+/$' ? substitute(tmp, '/$', '', '') : tmp
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: Path.readInfoFromDisk(fullpath) {{{1
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Throws NERDTree.Path.InvalidArguments exception.
 | 
				
			||||||
 | 
					function! s:Path.readInfoFromDisk(fullpath)
 | 
				
			||||||
 | 
					    call self.extractDriveLetter(a:fullpath)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let fullpath = s:Path.WinToUnixPath(a:fullpath)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if getftype(fullpath) ==# "fifo"
 | 
				
			||||||
 | 
					        throw "NERDTree.InvalidFiletypeError: Cant handle FIFO files: " . a:fullpath
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let self.pathSegments = split(fullpath, '/')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let self.isReadOnly = 0
 | 
				
			||||||
 | 
					    if isdirectory(a:fullpath)
 | 
				
			||||||
 | 
					        let self.isDirectory = 1
 | 
				
			||||||
 | 
					    elseif filereadable(a:fullpath)
 | 
				
			||||||
 | 
					        let self.isDirectory = 0
 | 
				
			||||||
 | 
					        let self.isReadOnly = filewritable(a:fullpath) ==# 0
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        throw "NERDTree.InvalidArgumentsError: Invalid path = " . a:fullpath
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let self.isExecutable = 0
 | 
				
			||||||
 | 
					    if !self.isDirectory
 | 
				
			||||||
 | 
					        let self.isExecutable = getfperm(a:fullpath) =~# 'x'
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    "grab the last part of the path (minus the trailing slash)
 | 
				
			||||||
 | 
					    let lastPathComponent = self.getLastPathComponent(0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    "get the path to the new node with the parent dir fully resolved
 | 
				
			||||||
 | 
					    let hardPath = s:Path.Resolve(self.strTrunk()) . '/' . lastPathComponent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    "if  the last part of the path is a symlink then flag it as such
 | 
				
			||||||
 | 
					    let self.isSymLink = (s:Path.Resolve(hardPath) != hardPath)
 | 
				
			||||||
 | 
					    if self.isSymLink
 | 
				
			||||||
 | 
					        let self.symLinkDest = s:Path.Resolve(fullpath)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        "if the link is a dir then slap a / on the end of its dest
 | 
				
			||||||
 | 
					        if isdirectory(self.symLinkDest)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            "we always wanna treat MS windows shortcuts as files for
 | 
				
			||||||
 | 
					            "simplicity
 | 
				
			||||||
 | 
					            if hardPath !~# '\.lnk$'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                let self.symLinkDest = self.symLinkDest . '/'
 | 
				
			||||||
 | 
					            endif
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: Path.refresh() {{{1
 | 
				
			||||||
 | 
					function! s:Path.refresh()
 | 
				
			||||||
 | 
					    call self.readInfoFromDisk(self.str())
 | 
				
			||||||
 | 
					    call self.cacheDisplayString()
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: Path.rename() {{{1
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Renames this node on the filesystem
 | 
				
			||||||
 | 
					function! s:Path.rename(newPath)
 | 
				
			||||||
 | 
					    if a:newPath ==# ''
 | 
				
			||||||
 | 
					        throw "NERDTree.InvalidArgumentsError: Invalid newPath for renaming = ". a:newPath
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let success =  rename(self.str(), a:newPath)
 | 
				
			||||||
 | 
					    if success != 0
 | 
				
			||||||
 | 
					        throw "NERDTree.PathRenameError: Could not rename: '" . self.str() . "'" . 'to:' . a:newPath
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					    call self.readInfoFromDisk(a:newPath)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for i in self.bookmarkNames()
 | 
				
			||||||
 | 
					        let b = g:NERDTreeBookmark.BookmarkFor(i)
 | 
				
			||||||
 | 
					        call b.setPath(copy(self))
 | 
				
			||||||
 | 
					    endfor
 | 
				
			||||||
 | 
					    call g:NERDTreeBookmark.Write()
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: Path.str() {{{1
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Returns a string representation of this Path
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Takes an optional dictionary param to specify how the output should be
 | 
				
			||||||
 | 
					"formatted.
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"The dict may have the following keys:
 | 
				
			||||||
 | 
					"  'format'
 | 
				
			||||||
 | 
					"  'escape'
 | 
				
			||||||
 | 
					"  'truncateTo'
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"The 'format' key may have a value of:
 | 
				
			||||||
 | 
					"  'Cd' - a string to be used with the :cd command
 | 
				
			||||||
 | 
					"  'Edit' - a string to be used with :e :sp :new :tabedit etc
 | 
				
			||||||
 | 
					"  'UI' - a string used in the NERD tree UI
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"The 'escape' key, if specified will cause the output to be escaped with
 | 
				
			||||||
 | 
					"shellescape()
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"The 'truncateTo' key causes the resulting string to be truncated to the value
 | 
				
			||||||
 | 
					"'truncateTo' maps to. A '<' char will be prepended.
 | 
				
			||||||
 | 
					function! s:Path.str(...)
 | 
				
			||||||
 | 
					    let options = a:0 ? a:1 : {}
 | 
				
			||||||
 | 
					    let toReturn = ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if has_key(options, 'format')
 | 
				
			||||||
 | 
					        let format = options['format']
 | 
				
			||||||
 | 
					        if has_key(self, '_strFor' . format)
 | 
				
			||||||
 | 
					            exec 'let toReturn = self._strFor' . format . '()'
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					            raise 'NERDTree.UnknownFormatError: unknown format "'. format .'"'
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        let toReturn = self._str()
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if nerdtree#has_opt(options, 'escape')
 | 
				
			||||||
 | 
					        let toReturn = shellescape(toReturn)
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if has_key(options, 'truncateTo')
 | 
				
			||||||
 | 
					        let limit = options['truncateTo']
 | 
				
			||||||
 | 
					        if len(toReturn) > limit
 | 
				
			||||||
 | 
					            let toReturn = "<" . strpart(toReturn, len(toReturn) - limit + 1)
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return toReturn
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: Path._strForUI() {{{1
 | 
				
			||||||
 | 
					function! s:Path._strForUI()
 | 
				
			||||||
 | 
					    let toReturn = '/' . join(self.pathSegments, '/')
 | 
				
			||||||
 | 
					    if self.isDirectory && toReturn != '/'
 | 
				
			||||||
 | 
					        let toReturn  = toReturn . '/'
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					    return toReturn
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: Path._strForCd() {{{1
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					" returns a string that can be used with :cd
 | 
				
			||||||
 | 
					function! s:Path._strForCd()
 | 
				
			||||||
 | 
					    return escape(self.str(), nerdtree#escChars())
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: Path._strForEdit() {{{1
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Return: the string for this path that is suitable to be used with the :edit
 | 
				
			||||||
 | 
					"command
 | 
				
			||||||
 | 
					function! s:Path._strForEdit()
 | 
				
			||||||
 | 
					    let p = escape(self.str({'format': 'UI'}), nerdtree#escChars())
 | 
				
			||||||
 | 
					    let cwd = getcwd() . s:Path.Slash()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    "return a relative path if we can
 | 
				
			||||||
 | 
					    let isRelative = 0
 | 
				
			||||||
 | 
					    if nerdtree#runningWindows()
 | 
				
			||||||
 | 
					        let isRelative = stridx(tolower(p), tolower(cwd)) == 0
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        let isRelative = stridx(p, cwd) == 0
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if isRelative
 | 
				
			||||||
 | 
					        let p = strpart(p, strlen(cwd))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        "handle the edge case where the file begins with a + (vim interprets
 | 
				
			||||||
 | 
					        "the +foo in `:e +foo` as an option to :edit)
 | 
				
			||||||
 | 
					        if p[0] == "+"
 | 
				
			||||||
 | 
					            let p = '\' . p
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if p ==# ''
 | 
				
			||||||
 | 
					        let p = '.'
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return p
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: Path._strForGlob() {{{1
 | 
				
			||||||
 | 
					function! s:Path._strForGlob()
 | 
				
			||||||
 | 
					    let lead = s:Path.Slash()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    "if we are running windows then slap a drive letter on the front
 | 
				
			||||||
 | 
					    if nerdtree#runningWindows()
 | 
				
			||||||
 | 
					        let lead = self.drive . '\'
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let toReturn = lead . join(self.pathSegments, s:Path.Slash())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if !nerdtree#runningWindows()
 | 
				
			||||||
 | 
					        let toReturn = escape(toReturn, nerdtree#escChars())
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					    return toReturn
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: Path._str() {{{1
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Gets the string path for this path object that is appropriate for the OS.
 | 
				
			||||||
 | 
					"EG, in windows c:\foo\bar
 | 
				
			||||||
 | 
					"    in *nix  /foo/bar
 | 
				
			||||||
 | 
					function! s:Path._str()
 | 
				
			||||||
 | 
					    let lead = s:Path.Slash()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    "if we are running windows then slap a drive letter on the front
 | 
				
			||||||
 | 
					    if nerdtree#runningWindows()
 | 
				
			||||||
 | 
					        let lead = self.drive . '\'
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return lead . join(self.pathSegments, s:Path.Slash())
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: Path.strTrunk() {{{1
 | 
				
			||||||
 | 
					"Gets the path without the last segment on the end.
 | 
				
			||||||
 | 
					function! s:Path.strTrunk()
 | 
				
			||||||
 | 
					    return self.drive . '/' . join(self.pathSegments[0:-2], '/')
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					" FUNCTION: Path.tabnr() {{{1
 | 
				
			||||||
 | 
					" return the number of the first tab that is displaying this file
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					" return 0 if no tab was found
 | 
				
			||||||
 | 
					function! s:Path.tabnr()
 | 
				
			||||||
 | 
					    let str = self.str()
 | 
				
			||||||
 | 
					    for t in range(tabpagenr('$'))
 | 
				
			||||||
 | 
					        for b in tabpagebuflist(t+1)
 | 
				
			||||||
 | 
					            if str == expand('#' . b . ':p')
 | 
				
			||||||
 | 
					                return t+1
 | 
				
			||||||
 | 
					            endif
 | 
				
			||||||
 | 
					        endfor
 | 
				
			||||||
 | 
					    endfor
 | 
				
			||||||
 | 
					    return 0
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: Path.WinToUnixPath(pathstr){{{1
 | 
				
			||||||
 | 
					"Takes in a windows path and returns the unix equiv
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"A class level method
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Args:
 | 
				
			||||||
 | 
					"pathstr: the windows path to convert
 | 
				
			||||||
 | 
					function! s:Path.WinToUnixPath(pathstr)
 | 
				
			||||||
 | 
					    if !nerdtree#runningWindows()
 | 
				
			||||||
 | 
					        return a:pathstr
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let toReturn = a:pathstr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    "remove the x:\ of the front
 | 
				
			||||||
 | 
					    let toReturn = substitute(toReturn, '^.*:\(\\\|/\)\?', '/', "")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    "remove the \\ network share from the front
 | 
				
			||||||
 | 
					    let toReturn = substitute(toReturn, '^\(\\\\\|\/\/\)[^\\\/]*\(\\\|\/\)[^\\\/]*\(\\\|\/\)\?', '/', "")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    "convert all \ chars to /
 | 
				
			||||||
 | 
					    let toReturn = substitute(toReturn, '\', '/', "g")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return toReturn
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					" vim: set sw=4 sts=4 et fdm=marker:
 | 
				
			||||||
							
								
								
									
										528
									
								
								vim/bundle/nerdtree/lib/nerdtree/tree_dir_node.vim
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										528
									
								
								vim/bundle/nerdtree/lib/nerdtree/tree_dir_node.vim
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,528 @@
 | 
				
			||||||
 | 
					"CLASS: TreeDirNode
 | 
				
			||||||
 | 
					"A subclass of NERDTreeFileNode.
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"The 'composite' part of the file/dir composite.
 | 
				
			||||||
 | 
					"============================================================
 | 
				
			||||||
 | 
					let s:TreeDirNode = copy(g:NERDTreeFileNode)
 | 
				
			||||||
 | 
					let g:NERDTreeDirNode = s:TreeDirNode
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: TreeDirNode.AbsoluteTreeRoot(){{{1
 | 
				
			||||||
 | 
					"class method that returns the highest cached ancestor of the current root
 | 
				
			||||||
 | 
					function! s:TreeDirNode.AbsoluteTreeRoot()
 | 
				
			||||||
 | 
					    let currentNode = b:NERDTreeRoot
 | 
				
			||||||
 | 
					    while currentNode.parent != {}
 | 
				
			||||||
 | 
					        let currentNode = currentNode.parent
 | 
				
			||||||
 | 
					    endwhile
 | 
				
			||||||
 | 
					    return currentNode
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: TreeDirNode.activate([options]) {{{1
 | 
				
			||||||
 | 
					unlet s:TreeDirNode.activate
 | 
				
			||||||
 | 
					function! s:TreeDirNode.activate(...)
 | 
				
			||||||
 | 
					    let opts = a:0 ? a:1 : {}
 | 
				
			||||||
 | 
					    call self.toggleOpen(opts)
 | 
				
			||||||
 | 
					    call nerdtree#renderView()
 | 
				
			||||||
 | 
					    call self.putCursorHere(0, 0)
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: TreeDirNode.addChild(treenode, inOrder) {{{1
 | 
				
			||||||
 | 
					"Adds the given treenode to the list of children for this node
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Args:
 | 
				
			||||||
 | 
					"-treenode: the node to add
 | 
				
			||||||
 | 
					"-inOrder: 1 if the new node should be inserted in sorted order
 | 
				
			||||||
 | 
					function! s:TreeDirNode.addChild(treenode, inOrder)
 | 
				
			||||||
 | 
					    call add(self.children, a:treenode)
 | 
				
			||||||
 | 
					    let a:treenode.parent = self
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if a:inOrder
 | 
				
			||||||
 | 
					        call self.sortChildren()
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: TreeDirNode.close() {{{1
 | 
				
			||||||
 | 
					"Closes this directory
 | 
				
			||||||
 | 
					function! s:TreeDirNode.close()
 | 
				
			||||||
 | 
					    let self.isOpen = 0
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: TreeDirNode.closeChildren() {{{1
 | 
				
			||||||
 | 
					"Closes all the child dir nodes of this node
 | 
				
			||||||
 | 
					function! s:TreeDirNode.closeChildren()
 | 
				
			||||||
 | 
					    for i in self.children
 | 
				
			||||||
 | 
					        if i.path.isDirectory
 | 
				
			||||||
 | 
					            call i.close()
 | 
				
			||||||
 | 
					            call i.closeChildren()
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					    endfor
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: TreeDirNode.createChild(path, inOrder) {{{1
 | 
				
			||||||
 | 
					"Instantiates a new child node for this node with the given path. The new
 | 
				
			||||||
 | 
					"nodes parent is set to this node.
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Args:
 | 
				
			||||||
 | 
					"path: a Path object that this node will represent/contain
 | 
				
			||||||
 | 
					"inOrder: 1 if the new node should be inserted in sorted order
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Returns:
 | 
				
			||||||
 | 
					"the newly created node
 | 
				
			||||||
 | 
					function! s:TreeDirNode.createChild(path, inOrder)
 | 
				
			||||||
 | 
					    let newTreeNode = g:NERDTreeFileNode.New(a:path)
 | 
				
			||||||
 | 
					    call self.addChild(newTreeNode, a:inOrder)
 | 
				
			||||||
 | 
					    return newTreeNode
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: TreeDirNode.findNode(path) {{{1
 | 
				
			||||||
 | 
					"Will find one of the children (recursively) that has the given path
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Args:
 | 
				
			||||||
 | 
					"path: a path object
 | 
				
			||||||
 | 
					unlet s:TreeDirNode.findNode
 | 
				
			||||||
 | 
					function! s:TreeDirNode.findNode(path)
 | 
				
			||||||
 | 
					    if a:path.equals(self.path)
 | 
				
			||||||
 | 
					        return self
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					    if stridx(a:path.str(), self.path.str(), 0) ==# -1
 | 
				
			||||||
 | 
					        return {}
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if self.path.isDirectory
 | 
				
			||||||
 | 
					        for i in self.children
 | 
				
			||||||
 | 
					            let retVal = i.findNode(a:path)
 | 
				
			||||||
 | 
					            if retVal != {}
 | 
				
			||||||
 | 
					                return retVal
 | 
				
			||||||
 | 
					            endif
 | 
				
			||||||
 | 
					        endfor
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					    return {}
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: TreeDirNode.getChildCount() {{{1
 | 
				
			||||||
 | 
					"Returns the number of children this node has
 | 
				
			||||||
 | 
					function! s:TreeDirNode.getChildCount()
 | 
				
			||||||
 | 
					    return len(self.children)
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: TreeDirNode.getChild(path) {{{1
 | 
				
			||||||
 | 
					"Returns child node of this node that has the given path or {} if no such node
 | 
				
			||||||
 | 
					"exists.
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"This function doesnt not recurse into child dir nodes
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Args:
 | 
				
			||||||
 | 
					"path: a path object
 | 
				
			||||||
 | 
					function! s:TreeDirNode.getChild(path)
 | 
				
			||||||
 | 
					    if stridx(a:path.str(), self.path.str(), 0) ==# -1
 | 
				
			||||||
 | 
					        return {}
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let index = self.getChildIndex(a:path)
 | 
				
			||||||
 | 
					    if index ==# -1
 | 
				
			||||||
 | 
					        return {}
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        return self.children[index]
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: TreeDirNode.getChildByIndex(indx, visible) {{{1
 | 
				
			||||||
 | 
					"returns the child at the given index
 | 
				
			||||||
 | 
					"Args:
 | 
				
			||||||
 | 
					"indx: the index to get the child from
 | 
				
			||||||
 | 
					"visible: 1 if only the visible children array should be used, 0 if all the
 | 
				
			||||||
 | 
					"children should be searched.
 | 
				
			||||||
 | 
					function! s:TreeDirNode.getChildByIndex(indx, visible)
 | 
				
			||||||
 | 
					    let array_to_search = a:visible? self.getVisibleChildren() : self.children
 | 
				
			||||||
 | 
					    if a:indx > len(array_to_search)
 | 
				
			||||||
 | 
					        throw "NERDTree.InvalidArgumentsError: Index is out of bounds."
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					    return array_to_search[a:indx]
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: TreeDirNode.getChildIndex(path) {{{1
 | 
				
			||||||
 | 
					"Returns the index of the child node of this node that has the given path or
 | 
				
			||||||
 | 
					"-1 if no such node exists.
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"This function doesnt not recurse into child dir nodes
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Args:
 | 
				
			||||||
 | 
					"path: a path object
 | 
				
			||||||
 | 
					function! s:TreeDirNode.getChildIndex(path)
 | 
				
			||||||
 | 
					    if stridx(a:path.str(), self.path.str(), 0) ==# -1
 | 
				
			||||||
 | 
					        return -1
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    "do a binary search for the child
 | 
				
			||||||
 | 
					    let a = 0
 | 
				
			||||||
 | 
					    let z = self.getChildCount()
 | 
				
			||||||
 | 
					    while a < z
 | 
				
			||||||
 | 
					        let mid = (a+z)/2
 | 
				
			||||||
 | 
					        let diff = a:path.compareTo(self.children[mid].path)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if diff ==# -1
 | 
				
			||||||
 | 
					            let z = mid
 | 
				
			||||||
 | 
					        elseif diff ==# 1
 | 
				
			||||||
 | 
					            let a = mid+1
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					            return mid
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					    endwhile
 | 
				
			||||||
 | 
					    return -1
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: TreeDirNode.GetSelected() {{{1
 | 
				
			||||||
 | 
					"Returns the current node if it is a dir node, or else returns the current
 | 
				
			||||||
 | 
					"nodes parent
 | 
				
			||||||
 | 
					unlet s:TreeDirNode.GetSelected
 | 
				
			||||||
 | 
					function! s:TreeDirNode.GetSelected()
 | 
				
			||||||
 | 
					    let currentDir = g:NERDTreeFileNode.GetSelected()
 | 
				
			||||||
 | 
					    if currentDir != {} && !currentDir.isRoot()
 | 
				
			||||||
 | 
					        if currentDir.path.isDirectory ==# 0
 | 
				
			||||||
 | 
					            let currentDir = currentDir.parent
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					    return currentDir
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: TreeDirNode.getVisibleChildCount() {{{1
 | 
				
			||||||
 | 
					"Returns the number of visible children this node has
 | 
				
			||||||
 | 
					function! s:TreeDirNode.getVisibleChildCount()
 | 
				
			||||||
 | 
					    return len(self.getVisibleChildren())
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: TreeDirNode.getVisibleChildren() {{{1
 | 
				
			||||||
 | 
					"Returns a list of children to display for this node, in the correct order
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Return:
 | 
				
			||||||
 | 
					"an array of treenodes
 | 
				
			||||||
 | 
					function! s:TreeDirNode.getVisibleChildren()
 | 
				
			||||||
 | 
					    let toReturn = []
 | 
				
			||||||
 | 
					    for i in self.children
 | 
				
			||||||
 | 
					        if i.path.ignore() ==# 0
 | 
				
			||||||
 | 
					            call add(toReturn, i)
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					    endfor
 | 
				
			||||||
 | 
					    return toReturn
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: TreeDirNode.hasVisibleChildren() {{{1
 | 
				
			||||||
 | 
					"returns 1 if this node has any childre, 0 otherwise..
 | 
				
			||||||
 | 
					function! s:TreeDirNode.hasVisibleChildren()
 | 
				
			||||||
 | 
					    return self.getVisibleChildCount() != 0
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: TreeDirNode._initChildren() {{{1
 | 
				
			||||||
 | 
					"Removes all childen from this node and re-reads them
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Args:
 | 
				
			||||||
 | 
					"silent: 1 if the function should not echo any "please wait" messages for
 | 
				
			||||||
 | 
					"large directories
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Return: the number of child nodes read
 | 
				
			||||||
 | 
					function! s:TreeDirNode._initChildren(silent)
 | 
				
			||||||
 | 
					    "remove all the current child nodes
 | 
				
			||||||
 | 
					    let self.children = []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    "get an array of all the files in the nodes dir
 | 
				
			||||||
 | 
					    let dir = self.path
 | 
				
			||||||
 | 
					    let globDir = dir.str({'format': 'Glob'})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if version >= 703
 | 
				
			||||||
 | 
					        let filesStr = globpath(globDir, '*', 1) . "\n" . globpath(globDir, '.*', 1)
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        let filesStr = globpath(globDir, '*') . "\n" . globpath(globDir, '.*')
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let files = split(filesStr, "\n")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if !a:silent && len(files) > g:NERDTreeNotificationThreshold
 | 
				
			||||||
 | 
					        call nerdtree#echo("Please wait, caching a large dir ...")
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let invalidFilesFound = 0
 | 
				
			||||||
 | 
					    for i in files
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        "filter out the .. and . directories
 | 
				
			||||||
 | 
					        "Note: we must match .. AND ../ cos sometimes the globpath returns
 | 
				
			||||||
 | 
					        "../ for path with strange chars (eg $)
 | 
				
			||||||
 | 
					        if i !~# '\/\.\.\/\?$' && i !~# '\/\.\/\?$'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            "put the next file in a new node and attach it
 | 
				
			||||||
 | 
					            try
 | 
				
			||||||
 | 
					                let path = g:NERDTreePath.New(i)
 | 
				
			||||||
 | 
					                call self.createChild(path, 0)
 | 
				
			||||||
 | 
					            catch /^NERDTree.\(InvalidArguments\|InvalidFiletype\)Error/
 | 
				
			||||||
 | 
					                let invalidFilesFound += 1
 | 
				
			||||||
 | 
					            endtry
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					    endfor
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    call self.sortChildren()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if !a:silent && len(files) > g:NERDTreeNotificationThreshold
 | 
				
			||||||
 | 
					        call nerdtree#echo("Please wait, caching a large dir ... DONE (". self.getChildCount() ." nodes cached).")
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if invalidFilesFound
 | 
				
			||||||
 | 
					        call nerdtree#echoWarning(invalidFilesFound . " file(s) could not be loaded into the NERD tree")
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					    return self.getChildCount()
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: TreeDirNode.New(path) {{{1
 | 
				
			||||||
 | 
					"Returns a new TreeNode object with the given path and parent
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Args:
 | 
				
			||||||
 | 
					"path: a path object representing the full filesystem path to the file/dir that the node represents
 | 
				
			||||||
 | 
					unlet s:TreeDirNode.New
 | 
				
			||||||
 | 
					function! s:TreeDirNode.New(path)
 | 
				
			||||||
 | 
					    if a:path.isDirectory != 1
 | 
				
			||||||
 | 
					        throw "NERDTree.InvalidArgumentsError: A TreeDirNode object must be instantiated with a directory Path object."
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let newTreeNode = copy(self)
 | 
				
			||||||
 | 
					    let newTreeNode.path = a:path
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let newTreeNode.isOpen = 0
 | 
				
			||||||
 | 
					    let newTreeNode.children = []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let newTreeNode.parent = {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return newTreeNode
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: TreeDirNode.open([opts]) {{{1
 | 
				
			||||||
 | 
					"Open the dir in the current tree or in a new tree elsewhere.
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"If opening in the current tree, return the number of cached nodes.
 | 
				
			||||||
 | 
					unlet s:TreeDirNode.open
 | 
				
			||||||
 | 
					function! s:TreeDirNode.open(...)
 | 
				
			||||||
 | 
					    let opts = a:0 ? a:1 : {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if has_key(opts, 'where') && !empty(opts['where'])
 | 
				
			||||||
 | 
					        let opener = g:NERDTreeOpener.New(self.path, opts)
 | 
				
			||||||
 | 
					        call opener.open(self)
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        let self.isOpen = 1
 | 
				
			||||||
 | 
					        if self.children ==# []
 | 
				
			||||||
 | 
					            return self._initChildren(0)
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					            return 0
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: TreeDirNode.openAlong([opts]) {{{1
 | 
				
			||||||
 | 
					"recursive open the dir if it has only one directory child.
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"return the level of opened directories.
 | 
				
			||||||
 | 
					function! s:TreeDirNode.openAlong(...)
 | 
				
			||||||
 | 
					    let opts = a:0 ? a:1 : {}
 | 
				
			||||||
 | 
					    let level = 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let node = self
 | 
				
			||||||
 | 
					    while node.path.isDirectory
 | 
				
			||||||
 | 
					        call node.open(opts)
 | 
				
			||||||
 | 
					        let level += 1
 | 
				
			||||||
 | 
					        if node.getVisibleChildCount() == 1
 | 
				
			||||||
 | 
					            let node = node.getChildByIndex(0, 1)
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					            break
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					    endwhile
 | 
				
			||||||
 | 
					    return level
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					" FUNCTION: TreeDirNode.openExplorer() {{{1
 | 
				
			||||||
 | 
					" opens an explorer window for this node in the previous window (could be a
 | 
				
			||||||
 | 
					" nerd tree or a netrw)
 | 
				
			||||||
 | 
					function! s:TreeDirNode.openExplorer()
 | 
				
			||||||
 | 
					    call self.open({'where': 'p'})
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: TreeDirNode.openInNewTab(options) {{{1
 | 
				
			||||||
 | 
					unlet s:TreeDirNode.openInNewTab
 | 
				
			||||||
 | 
					function! s:TreeDirNode.openInNewTab(options)
 | 
				
			||||||
 | 
					    call nerdtree#deprecated('TreeDirNode.openInNewTab', 'is deprecated, use open() instead')
 | 
				
			||||||
 | 
					    call self.open({'where': 't'})
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: TreeDirNode._openInNewTab() {{{1
 | 
				
			||||||
 | 
					function! s:TreeDirNode._openInNewTab()
 | 
				
			||||||
 | 
					    tabnew
 | 
				
			||||||
 | 
					    call g:NERDTreeCreator.CreatePrimary(self.path.str())
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: TreeDirNode.openRecursively() {{{1
 | 
				
			||||||
 | 
					"Opens this treenode and all of its children whose paths arent 'ignored'
 | 
				
			||||||
 | 
					"because of the file filters.
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"This method is actually a wrapper for the OpenRecursively2 method which does
 | 
				
			||||||
 | 
					"the work.
 | 
				
			||||||
 | 
					function! s:TreeDirNode.openRecursively()
 | 
				
			||||||
 | 
					    call self._openRecursively2(1)
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: TreeDirNode._openRecursively2() {{{1
 | 
				
			||||||
 | 
					"Opens this all children of this treenode recursively if either:
 | 
				
			||||||
 | 
					"   *they arent filtered by file filters
 | 
				
			||||||
 | 
					"   *a:forceOpen is 1
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Args:
 | 
				
			||||||
 | 
					"forceOpen: 1 if this node should be opened regardless of file filters
 | 
				
			||||||
 | 
					function! s:TreeDirNode._openRecursively2(forceOpen)
 | 
				
			||||||
 | 
					    if self.path.ignore() ==# 0 || a:forceOpen
 | 
				
			||||||
 | 
					        let self.isOpen = 1
 | 
				
			||||||
 | 
					        if self.children ==# []
 | 
				
			||||||
 | 
					            call self._initChildren(1)
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for i in self.children
 | 
				
			||||||
 | 
					            if i.path.isDirectory ==# 1
 | 
				
			||||||
 | 
					                call i._openRecursively2(0)
 | 
				
			||||||
 | 
					            endif
 | 
				
			||||||
 | 
					        endfor
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: TreeDirNode.refresh() {{{1
 | 
				
			||||||
 | 
					unlet s:TreeDirNode.refresh
 | 
				
			||||||
 | 
					function! s:TreeDirNode.refresh()
 | 
				
			||||||
 | 
					    call self.path.refresh()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    "if this node was ever opened, refresh its children
 | 
				
			||||||
 | 
					    if self.isOpen || !empty(self.children)
 | 
				
			||||||
 | 
					        "go thru all the files/dirs under this node
 | 
				
			||||||
 | 
					        let newChildNodes = []
 | 
				
			||||||
 | 
					        let invalidFilesFound = 0
 | 
				
			||||||
 | 
					        let dir = self.path
 | 
				
			||||||
 | 
					        let globDir = dir.str({'format': 'Glob'})
 | 
				
			||||||
 | 
					        let filesStr = globpath(globDir, '*') . "\n" . globpath(globDir, '.*')
 | 
				
			||||||
 | 
					        let files = split(filesStr, "\n")
 | 
				
			||||||
 | 
					        for i in files
 | 
				
			||||||
 | 
					            "filter out the .. and . directories
 | 
				
			||||||
 | 
					            "Note: we must match .. AND ../ cos sometimes the globpath returns
 | 
				
			||||||
 | 
					            "../ for path with strange chars (eg $)
 | 
				
			||||||
 | 
					            if i !~# '\/\.\.\/\?$' && i !~# '\/\.\/\?$'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                try
 | 
				
			||||||
 | 
					                    "create a new path and see if it exists in this nodes children
 | 
				
			||||||
 | 
					                    let path = g:NERDTreePath.New(i)
 | 
				
			||||||
 | 
					                    let newNode = self.getChild(path)
 | 
				
			||||||
 | 
					                    if newNode != {}
 | 
				
			||||||
 | 
					                        call newNode.refresh()
 | 
				
			||||||
 | 
					                        call add(newChildNodes, newNode)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    "the node doesnt exist so create it
 | 
				
			||||||
 | 
					                    else
 | 
				
			||||||
 | 
					                        let newNode = g:NERDTreeFileNode.New(path)
 | 
				
			||||||
 | 
					                        let newNode.parent = self
 | 
				
			||||||
 | 
					                        call add(newChildNodes, newNode)
 | 
				
			||||||
 | 
					                    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                catch /^NERDTree.\(InvalidArguments\|InvalidFiletype\)Error/
 | 
				
			||||||
 | 
					                    let invalidFilesFound = 1
 | 
				
			||||||
 | 
					                endtry
 | 
				
			||||||
 | 
					            endif
 | 
				
			||||||
 | 
					        endfor
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        "swap this nodes children out for the children we just read/refreshed
 | 
				
			||||||
 | 
					        let self.children = newChildNodes
 | 
				
			||||||
 | 
					        call self.sortChildren()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if invalidFilesFound
 | 
				
			||||||
 | 
					            call nerdtree#echoWarning("some files could not be loaded into the NERD tree")
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: TreeDirNode.reveal(path) {{{1
 | 
				
			||||||
 | 
					"reveal the given path, i.e. cache and open all treenodes needed to display it
 | 
				
			||||||
 | 
					"in the UI
 | 
				
			||||||
 | 
					function! s:TreeDirNode.reveal(path)
 | 
				
			||||||
 | 
					    if !a:path.isUnder(self.path)
 | 
				
			||||||
 | 
					        throw "NERDTree.InvalidArgumentsError: " . a:path.str() . " should be under " . self.path.str()
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    call self.open()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if self.path.equals(a:path.getParent())
 | 
				
			||||||
 | 
					        let n = self.findNode(a:path)
 | 
				
			||||||
 | 
					        call nerdtree#renderView()
 | 
				
			||||||
 | 
					        call n.putCursorHere(1,0)
 | 
				
			||||||
 | 
					        return
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let p = a:path
 | 
				
			||||||
 | 
					    while !p.getParent().equals(self.path)
 | 
				
			||||||
 | 
					        let p = p.getParent()
 | 
				
			||||||
 | 
					    endwhile
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let n = self.findNode(p)
 | 
				
			||||||
 | 
					    call n.reveal(a:path)
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: TreeDirNode.removeChild(treenode) {{{1
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Removes the given treenode from this nodes set of children
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Args:
 | 
				
			||||||
 | 
					"treenode: the node to remove
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Throws a NERDTree.ChildNotFoundError if the given treenode is not found
 | 
				
			||||||
 | 
					function! s:TreeDirNode.removeChild(treenode)
 | 
				
			||||||
 | 
					    for i in range(0, self.getChildCount()-1)
 | 
				
			||||||
 | 
					        if self.children[i].equals(a:treenode)
 | 
				
			||||||
 | 
					            call remove(self.children, i)
 | 
				
			||||||
 | 
					            return
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					    endfor
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    throw "NERDTree.ChildNotFoundError: child node was not found"
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: TreeDirNode.sortChildren() {{{1
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Sorts the children of this node according to alphabetical order and the
 | 
				
			||||||
 | 
					"directory priority.
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					function! s:TreeDirNode.sortChildren()
 | 
				
			||||||
 | 
					    let CompareFunc = function("nerdtree#compareNodes")
 | 
				
			||||||
 | 
					    call sort(self.children, CompareFunc)
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: TreeDirNode.toggleOpen([options]) {{{1
 | 
				
			||||||
 | 
					"Opens this directory if it is closed and vice versa
 | 
				
			||||||
 | 
					function! s:TreeDirNode.toggleOpen(...)
 | 
				
			||||||
 | 
					    let opts = a:0 ? a:1 : {}
 | 
				
			||||||
 | 
					    if self.isOpen ==# 1
 | 
				
			||||||
 | 
					        call self.close()
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        if g:NERDTreeCasadeOpenSingleChildDir == 0
 | 
				
			||||||
 | 
					            call self.open(opts)
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					            call self.openAlong(opts)
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: TreeDirNode.transplantChild(newNode) {{{1
 | 
				
			||||||
 | 
					"Replaces the child of this with the given node (where the child node's full
 | 
				
			||||||
 | 
					"path matches a:newNode's fullpath). The search for the matching node is
 | 
				
			||||||
 | 
					"non-recursive
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Arg:
 | 
				
			||||||
 | 
					"newNode: the node to graft into the tree
 | 
				
			||||||
 | 
					function! s:TreeDirNode.transplantChild(newNode)
 | 
				
			||||||
 | 
					    for i in range(0, self.getChildCount()-1)
 | 
				
			||||||
 | 
					        if self.children[i].equals(a:newNode)
 | 
				
			||||||
 | 
					            let self.children[i] = a:newNode
 | 
				
			||||||
 | 
					            let a:newNode.parent = self
 | 
				
			||||||
 | 
					            break
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					    endfor
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					" vim: set sw=4 sts=4 et fdm=marker:
 | 
				
			||||||
							
								
								
									
										485
									
								
								vim/bundle/nerdtree/lib/nerdtree/tree_file_node.vim
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										485
									
								
								vim/bundle/nerdtree/lib/nerdtree/tree_file_node.vim
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,485 @@
 | 
				
			||||||
 | 
					"CLASS: TreeFileNode
 | 
				
			||||||
 | 
					"This class is the parent of the TreeDirNode class and is the
 | 
				
			||||||
 | 
					"'Component' part of the composite design pattern between the treenode
 | 
				
			||||||
 | 
					"classes.
 | 
				
			||||||
 | 
					"============================================================
 | 
				
			||||||
 | 
					let s:TreeFileNode = {}
 | 
				
			||||||
 | 
					let g:NERDTreeFileNode = s:TreeFileNode
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: TreeFileNode.activate(...) {{{1
 | 
				
			||||||
 | 
					function! s:TreeFileNode.activate(...)
 | 
				
			||||||
 | 
					    call self.open(a:0 ? a:1 : {})
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: TreeFileNode.bookmark(name) {{{1
 | 
				
			||||||
 | 
					"bookmark this node with a:name
 | 
				
			||||||
 | 
					function! s:TreeFileNode.bookmark(name)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    "if a bookmark exists with the same name and the node is cached then save
 | 
				
			||||||
 | 
					    "it so we can update its display string
 | 
				
			||||||
 | 
					    let oldMarkedNode = {}
 | 
				
			||||||
 | 
					    try
 | 
				
			||||||
 | 
					        let oldMarkedNode = g:NERDTreeBookmark.GetNodeForName(a:name, 1)
 | 
				
			||||||
 | 
					    catch /^NERDTree.BookmarkNotFoundError/
 | 
				
			||||||
 | 
					    catch /^NERDTree.BookmarkedNodeNotFoundError/
 | 
				
			||||||
 | 
					    endtry
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    call g:NERDTreeBookmark.AddBookmark(a:name, self.path)
 | 
				
			||||||
 | 
					    call self.path.cacheDisplayString()
 | 
				
			||||||
 | 
					    call g:NERDTreeBookmark.Write()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if !empty(oldMarkedNode)
 | 
				
			||||||
 | 
					        call oldMarkedNode.path.cacheDisplayString()
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: TreeFileNode.cacheParent() {{{1
 | 
				
			||||||
 | 
					"initializes self.parent if it isnt already
 | 
				
			||||||
 | 
					function! s:TreeFileNode.cacheParent()
 | 
				
			||||||
 | 
					    if empty(self.parent)
 | 
				
			||||||
 | 
					        let parentPath = self.path.getParent()
 | 
				
			||||||
 | 
					        if parentPath.equals(self.path)
 | 
				
			||||||
 | 
					            throw "NERDTree.CannotCacheParentError: already at root"
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					        let self.parent = s:TreeFileNode.New(parentPath)
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: TreeFileNode.clearBookmarks() {{{1
 | 
				
			||||||
 | 
					function! s:TreeFileNode.clearBookmarks()
 | 
				
			||||||
 | 
					    for i in g:NERDTreeBookmark.Bookmarks()
 | 
				
			||||||
 | 
					        if i.path.equals(self.path)
 | 
				
			||||||
 | 
					            call i.delete()
 | 
				
			||||||
 | 
					        end
 | 
				
			||||||
 | 
					    endfor
 | 
				
			||||||
 | 
					    call self.path.cacheDisplayString()
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: TreeFileNode.copy(dest) {{{1
 | 
				
			||||||
 | 
					function! s:TreeFileNode.copy(dest)
 | 
				
			||||||
 | 
					    call self.path.copy(a:dest)
 | 
				
			||||||
 | 
					    let newPath = g:NERDTreePath.New(a:dest)
 | 
				
			||||||
 | 
					    let parent = b:NERDTreeRoot.findNode(newPath.getParent())
 | 
				
			||||||
 | 
					    if !empty(parent)
 | 
				
			||||||
 | 
					        call parent.refresh()
 | 
				
			||||||
 | 
					        return parent.findNode(newPath)
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        return {}
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: TreeFileNode.delete {{{1
 | 
				
			||||||
 | 
					"Removes this node from the tree and calls the Delete method for its path obj
 | 
				
			||||||
 | 
					function! s:TreeFileNode.delete()
 | 
				
			||||||
 | 
					    call self.path.delete()
 | 
				
			||||||
 | 
					    call self.parent.removeChild(self)
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: TreeFileNode.displayString() {{{1
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Returns a string that specifies how the node should be represented as a
 | 
				
			||||||
 | 
					"string
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Return:
 | 
				
			||||||
 | 
					"a string that can be used in the view to represent this node
 | 
				
			||||||
 | 
					function! s:TreeFileNode.displayString()
 | 
				
			||||||
 | 
					    return self.path.displayString()
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: TreeFileNode.equals(treenode) {{{1
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Compares this treenode to the input treenode and returns 1 if they are the
 | 
				
			||||||
 | 
					"same node.
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Use this method instead of ==  because sometimes when the treenodes contain
 | 
				
			||||||
 | 
					"many children, vim seg faults when doing ==
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Args:
 | 
				
			||||||
 | 
					"treenode: the other treenode to compare to
 | 
				
			||||||
 | 
					function! s:TreeFileNode.equals(treenode)
 | 
				
			||||||
 | 
					    return self.path.str() ==# a:treenode.path.str()
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: TreeFileNode.findNode(path) {{{1
 | 
				
			||||||
 | 
					"Returns self if this node.path.Equals the given path.
 | 
				
			||||||
 | 
					"Returns {} if not equal.
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Args:
 | 
				
			||||||
 | 
					"path: the path object to compare against
 | 
				
			||||||
 | 
					function! s:TreeFileNode.findNode(path)
 | 
				
			||||||
 | 
					    if a:path.equals(self.path)
 | 
				
			||||||
 | 
					        return self
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					    return {}
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: TreeFileNode.findOpenDirSiblingWithVisibleChildren(direction) {{{1
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Finds the next sibling for this node in the indicated direction. This sibling
 | 
				
			||||||
 | 
					"must be a directory and may/may not have children as specified.
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Args:
 | 
				
			||||||
 | 
					"direction: 0 if you want to find the previous sibling, 1 for the next sibling
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Return:
 | 
				
			||||||
 | 
					"a treenode object or {} if no appropriate sibling could be found
 | 
				
			||||||
 | 
					function! s:TreeFileNode.findOpenDirSiblingWithVisibleChildren(direction)
 | 
				
			||||||
 | 
					    "if we have no parent then we can have no siblings
 | 
				
			||||||
 | 
					    if self.parent != {}
 | 
				
			||||||
 | 
					        let nextSibling = self.findSibling(a:direction)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        while nextSibling != {}
 | 
				
			||||||
 | 
					            if nextSibling.path.isDirectory && nextSibling.hasVisibleChildren() && nextSibling.isOpen
 | 
				
			||||||
 | 
					                return nextSibling
 | 
				
			||||||
 | 
					            endif
 | 
				
			||||||
 | 
					            let nextSibling = nextSibling.findSibling(a:direction)
 | 
				
			||||||
 | 
					        endwhile
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return {}
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: TreeFileNode.findSibling(direction) {{{1
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Finds the next sibling for this node in the indicated direction
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Args:
 | 
				
			||||||
 | 
					"direction: 0 if you want to find the previous sibling, 1 for the next sibling
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Return:
 | 
				
			||||||
 | 
					"a treenode object or {} if no sibling could be found
 | 
				
			||||||
 | 
					function! s:TreeFileNode.findSibling(direction)
 | 
				
			||||||
 | 
					    "if we have no parent then we can have no siblings
 | 
				
			||||||
 | 
					    if self.parent != {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        "get the index of this node in its parents children
 | 
				
			||||||
 | 
					        let siblingIndx = self.parent.getChildIndex(self.path)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if siblingIndx != -1
 | 
				
			||||||
 | 
					            "move a long to the next potential sibling node
 | 
				
			||||||
 | 
					            let siblingIndx = a:direction ==# 1 ? siblingIndx+1 : siblingIndx-1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            "keep moving along to the next sibling till we find one that is valid
 | 
				
			||||||
 | 
					            let numSiblings = self.parent.getChildCount()
 | 
				
			||||||
 | 
					            while siblingIndx >= 0 && siblingIndx < numSiblings
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                "if the next node is not an ignored node (i.e. wont show up in the
 | 
				
			||||||
 | 
					                "view) then return it
 | 
				
			||||||
 | 
					                if self.parent.children[siblingIndx].path.ignore() ==# 0
 | 
				
			||||||
 | 
					                    return self.parent.children[siblingIndx]
 | 
				
			||||||
 | 
					                endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                "go to next node
 | 
				
			||||||
 | 
					                let siblingIndx = a:direction ==# 1 ? siblingIndx+1 : siblingIndx-1
 | 
				
			||||||
 | 
					            endwhile
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return {}
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: TreeFileNode.getLineNum(){{{1
 | 
				
			||||||
 | 
					"returns the line number this node is rendered on, or -1 if it isnt rendered
 | 
				
			||||||
 | 
					function! s:TreeFileNode.getLineNum()
 | 
				
			||||||
 | 
					    "if the node is the root then return the root line no.
 | 
				
			||||||
 | 
					    if self.isRoot()
 | 
				
			||||||
 | 
					        return s:TreeFileNode.GetRootLineNum()
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let totalLines = line("$")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    "the path components we have matched so far
 | 
				
			||||||
 | 
					    let pathcomponents = [substitute(b:NERDTreeRoot.path.str({'format': 'UI'}), '/ *$', '', '')]
 | 
				
			||||||
 | 
					    "the index of the component we are searching for
 | 
				
			||||||
 | 
					    let curPathComponent = 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let fullpath = self.path.str({'format': 'UI'})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let lnum = s:TreeFileNode.GetRootLineNum()
 | 
				
			||||||
 | 
					    while lnum > 0
 | 
				
			||||||
 | 
					        let lnum = lnum + 1
 | 
				
			||||||
 | 
					        "have we reached the bottom of the tree?
 | 
				
			||||||
 | 
					        if lnum ==# totalLines+1
 | 
				
			||||||
 | 
					            return -1
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let curLine = getline(lnum)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let indent = nerdtree#indentLevelFor(curLine)
 | 
				
			||||||
 | 
					        if indent ==# curPathComponent
 | 
				
			||||||
 | 
					            let curLine = nerdtree#stripMarkupFromLine(curLine, 1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            let curPath =  join(pathcomponents, '/') . '/' . curLine
 | 
				
			||||||
 | 
					            if stridx(fullpath, curPath, 0) ==# 0
 | 
				
			||||||
 | 
					                if fullpath ==# curPath || strpart(fullpath, len(curPath)-1,1) ==# '/'
 | 
				
			||||||
 | 
					                    let curLine = substitute(curLine, '/ *$', '', '')
 | 
				
			||||||
 | 
					                    call add(pathcomponents, curLine)
 | 
				
			||||||
 | 
					                    let curPathComponent = curPathComponent + 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if fullpath ==# curPath
 | 
				
			||||||
 | 
					                        return lnum
 | 
				
			||||||
 | 
					                    endif
 | 
				
			||||||
 | 
					                endif
 | 
				
			||||||
 | 
					            endif
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					    endwhile
 | 
				
			||||||
 | 
					    return -1
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: TreeFileNode.GetRootForTab(){{{1
 | 
				
			||||||
 | 
					"get the root node for this tab
 | 
				
			||||||
 | 
					function! s:TreeFileNode.GetRootForTab()
 | 
				
			||||||
 | 
					    if nerdtree#treeExistsForTab()
 | 
				
			||||||
 | 
					        return getbufvar(t:NERDTreeBufName, 'NERDTreeRoot')
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					    return {}
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: TreeFileNode.GetRootLineNum(){{{1
 | 
				
			||||||
 | 
					"gets the line number of the root node
 | 
				
			||||||
 | 
					function! s:TreeFileNode.GetRootLineNum()
 | 
				
			||||||
 | 
					    let rootLine = 1
 | 
				
			||||||
 | 
					    while getline(rootLine) !~# '^\(/\|<\)'
 | 
				
			||||||
 | 
					        let rootLine = rootLine + 1
 | 
				
			||||||
 | 
					    endwhile
 | 
				
			||||||
 | 
					    return rootLine
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: TreeFileNode.GetSelected() {{{1
 | 
				
			||||||
 | 
					"gets the treenode that the cursor is currently over
 | 
				
			||||||
 | 
					function! s:TreeFileNode.GetSelected()
 | 
				
			||||||
 | 
					    try
 | 
				
			||||||
 | 
					        let path = nerdtree#getPath(line("."))
 | 
				
			||||||
 | 
					        if path ==# {}
 | 
				
			||||||
 | 
					            return {}
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					        return b:NERDTreeRoot.findNode(path)
 | 
				
			||||||
 | 
					    catch /^NERDTree/
 | 
				
			||||||
 | 
					        return {}
 | 
				
			||||||
 | 
					    endtry
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: TreeFileNode.isVisible() {{{1
 | 
				
			||||||
 | 
					"returns 1 if this node should be visible according to the tree filters and
 | 
				
			||||||
 | 
					"hidden file filters (and their on/off status)
 | 
				
			||||||
 | 
					function! s:TreeFileNode.isVisible()
 | 
				
			||||||
 | 
					    return !self.path.ignore()
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: TreeFileNode.isRoot() {{{1
 | 
				
			||||||
 | 
					"returns 1 if this node is b:NERDTreeRoot
 | 
				
			||||||
 | 
					function! s:TreeFileNode.isRoot()
 | 
				
			||||||
 | 
					    if !nerdtree#treeExistsForBuf()
 | 
				
			||||||
 | 
					        throw "NERDTree.NoTreeError: No tree exists for the current buffer"
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return self.equals(b:NERDTreeRoot)
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: TreeFileNode.makeRoot() {{{1
 | 
				
			||||||
 | 
					"Make this node the root of the tree
 | 
				
			||||||
 | 
					function! s:TreeFileNode.makeRoot()
 | 
				
			||||||
 | 
					    if self.path.isDirectory
 | 
				
			||||||
 | 
					        let b:NERDTreeRoot = self
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        call self.cacheParent()
 | 
				
			||||||
 | 
					        let b:NERDTreeRoot = self.parent
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    call b:NERDTreeRoot.open()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    "change dir to the dir of the new root if instructed to
 | 
				
			||||||
 | 
					    if g:NERDTreeChDirMode ==# 2
 | 
				
			||||||
 | 
					        exec "cd " . b:NERDTreeRoot.path.str({'format': 'Edit'})
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    silent doautocmd User NERDTreeNewRoot
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: TreeFileNode.New(path) {{{1
 | 
				
			||||||
 | 
					"Returns a new TreeNode object with the given path and parent
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Args:
 | 
				
			||||||
 | 
					"path: a path object representing the full filesystem path to the file/dir that the node represents
 | 
				
			||||||
 | 
					function! s:TreeFileNode.New(path)
 | 
				
			||||||
 | 
					    if a:path.isDirectory
 | 
				
			||||||
 | 
					        return g:NERDTreeDirNode.New(a:path)
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        let newTreeNode = copy(self)
 | 
				
			||||||
 | 
					        let newTreeNode.path = a:path
 | 
				
			||||||
 | 
					        let newTreeNode.parent = {}
 | 
				
			||||||
 | 
					        return newTreeNode
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: TreeFileNode.open() {{{1
 | 
				
			||||||
 | 
					function! s:TreeFileNode.open(...)
 | 
				
			||||||
 | 
					    let opts = a:0 ? a:1 : {}
 | 
				
			||||||
 | 
					    let opener = g:NERDTreeOpener.New(self.path, opts)
 | 
				
			||||||
 | 
					    call opener.open(self)
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: TreeFileNode.openSplit() {{{1
 | 
				
			||||||
 | 
					"Open this node in a new window
 | 
				
			||||||
 | 
					function! s:TreeFileNode.openSplit()
 | 
				
			||||||
 | 
					    call nerdtree#deprecated('TreeFileNode.openSplit', 'is deprecated, use .open() instead.')
 | 
				
			||||||
 | 
					    call self.open({'where': 'h'})
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: TreeFileNode.openVSplit() {{{1
 | 
				
			||||||
 | 
					"Open this node in a new vertical window
 | 
				
			||||||
 | 
					function! s:TreeFileNode.openVSplit()
 | 
				
			||||||
 | 
					    call nerdtree#deprecated('TreeFileNode.openVSplit', 'is deprecated, use .open() instead.')
 | 
				
			||||||
 | 
					    call self.open({'where': 'v'})
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: TreeFileNode.openInNewTab(options) {{{1
 | 
				
			||||||
 | 
					function! s:TreeFileNode.openInNewTab(options)
 | 
				
			||||||
 | 
					    echomsg 'TreeFileNode.openInNewTab is deprecated'
 | 
				
			||||||
 | 
					    call self.open(extend({'where': 't'}, a:options))
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: TreeFileNode.putCursorHere(isJump, recurseUpward){{{1
 | 
				
			||||||
 | 
					"Places the cursor on the line number this node is rendered on
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Args:
 | 
				
			||||||
 | 
					"isJump: 1 if this cursor movement should be counted as a jump by vim
 | 
				
			||||||
 | 
					"recurseUpward: try to put the cursor on the parent if the this node isnt
 | 
				
			||||||
 | 
					"visible
 | 
				
			||||||
 | 
					function! s:TreeFileNode.putCursorHere(isJump, recurseUpward)
 | 
				
			||||||
 | 
					    let ln = self.getLineNum()
 | 
				
			||||||
 | 
					    if ln != -1
 | 
				
			||||||
 | 
					        if a:isJump
 | 
				
			||||||
 | 
					            mark '
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					        call cursor(ln, col("."))
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        if a:recurseUpward
 | 
				
			||||||
 | 
					            let node = self
 | 
				
			||||||
 | 
					            while node != {} && node.getLineNum() ==# -1
 | 
				
			||||||
 | 
					                let node = node.parent
 | 
				
			||||||
 | 
					                call node.open()
 | 
				
			||||||
 | 
					            endwhile
 | 
				
			||||||
 | 
					            call nerdtree#renderView()
 | 
				
			||||||
 | 
					            call node.putCursorHere(a:isJump, 0)
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: TreeFileNode.refresh() {{{1
 | 
				
			||||||
 | 
					function! s:TreeFileNode.refresh()
 | 
				
			||||||
 | 
					    call self.path.refresh()
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: TreeFileNode.rename() {{{1
 | 
				
			||||||
 | 
					"Calls the rename method for this nodes path obj
 | 
				
			||||||
 | 
					function! s:TreeFileNode.rename(newName)
 | 
				
			||||||
 | 
					    let newName = substitute(a:newName, '\(\\\|\/\)$', '', '')
 | 
				
			||||||
 | 
					    call self.path.rename(newName)
 | 
				
			||||||
 | 
					    call self.parent.removeChild(self)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let parentPath = self.path.getParent()
 | 
				
			||||||
 | 
					    let newParent = b:NERDTreeRoot.findNode(parentPath)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if newParent != {}
 | 
				
			||||||
 | 
					        call newParent.createChild(self.path, 1)
 | 
				
			||||||
 | 
					        call newParent.refresh()
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: TreeFileNode.renderToString {{{1
 | 
				
			||||||
 | 
					"returns a string representation for this tree to be rendered in the view
 | 
				
			||||||
 | 
					function! s:TreeFileNode.renderToString()
 | 
				
			||||||
 | 
					    return self._renderToString(0, 0, [], self.getChildCount() ==# 1)
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"Args:
 | 
				
			||||||
 | 
					"depth: the current depth in the tree for this call
 | 
				
			||||||
 | 
					"drawText: 1 if we should actually draw the line for this node (if 0 then the
 | 
				
			||||||
 | 
					"child nodes are rendered only)
 | 
				
			||||||
 | 
					"vertMap: a binary array that indicates whether a vertical bar should be draw
 | 
				
			||||||
 | 
					"for each depth in the tree
 | 
				
			||||||
 | 
					"isLastChild:true if this curNode is the last child of its parent
 | 
				
			||||||
 | 
					function! s:TreeFileNode._renderToString(depth, drawText, vertMap, isLastChild)
 | 
				
			||||||
 | 
					    let output = ""
 | 
				
			||||||
 | 
					    if a:drawText ==# 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let treeParts = ''
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        "get all the leading spaces and vertical tree parts for this line
 | 
				
			||||||
 | 
					        if a:depth > 1
 | 
				
			||||||
 | 
					            for j in a:vertMap[0:-2]
 | 
				
			||||||
 | 
					                if g:NERDTreeDirArrows
 | 
				
			||||||
 | 
					                    let treeParts = treeParts . '  '
 | 
				
			||||||
 | 
					                else
 | 
				
			||||||
 | 
					                    if j ==# 1
 | 
				
			||||||
 | 
					                        let treeParts = treeParts . '| '
 | 
				
			||||||
 | 
					                    else
 | 
				
			||||||
 | 
					                        let treeParts = treeParts . '  '
 | 
				
			||||||
 | 
					                    endif
 | 
				
			||||||
 | 
					                endif
 | 
				
			||||||
 | 
					            endfor
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        "get the last vertical tree part for this line which will be different
 | 
				
			||||||
 | 
					        "if this node is the last child of its parent
 | 
				
			||||||
 | 
					        if !g:NERDTreeDirArrows
 | 
				
			||||||
 | 
					            if a:isLastChild
 | 
				
			||||||
 | 
					                let treeParts = treeParts . '`'
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					                let treeParts = treeParts . '|'
 | 
				
			||||||
 | 
					            endif
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        "smack the appropriate dir/file symbol on the line before the file/dir
 | 
				
			||||||
 | 
					        "name itself
 | 
				
			||||||
 | 
					        if self.path.isDirectory
 | 
				
			||||||
 | 
					            if self.isOpen
 | 
				
			||||||
 | 
					                if g:NERDTreeDirArrows
 | 
				
			||||||
 | 
					                    let treeParts = treeParts . '▾ '
 | 
				
			||||||
 | 
					                else
 | 
				
			||||||
 | 
					                    let treeParts = treeParts . '~'
 | 
				
			||||||
 | 
					                endif
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					                if g:NERDTreeDirArrows
 | 
				
			||||||
 | 
					                    let treeParts = treeParts . '▸ '
 | 
				
			||||||
 | 
					                else
 | 
				
			||||||
 | 
					                    let treeParts = treeParts . '+'
 | 
				
			||||||
 | 
					                endif
 | 
				
			||||||
 | 
					            endif
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					            if g:NERDTreeDirArrows
 | 
				
			||||||
 | 
					                let treeParts = treeParts . '  '
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					                let treeParts = treeParts . '-'
 | 
				
			||||||
 | 
					            endif
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					        let line = treeParts . self.displayString()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let output = output . line . "\n"
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    "if the node is an open dir, draw its children
 | 
				
			||||||
 | 
					    if self.path.isDirectory ==# 1 && self.isOpen ==# 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let childNodesToDraw = self.getVisibleChildren()
 | 
				
			||||||
 | 
					        if len(childNodesToDraw) > 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            "draw all the nodes children except the last
 | 
				
			||||||
 | 
					            let lastIndx = len(childNodesToDraw)-1
 | 
				
			||||||
 | 
					            if lastIndx > 0
 | 
				
			||||||
 | 
					                for i in childNodesToDraw[0:lastIndx-1]
 | 
				
			||||||
 | 
					                    let output = output . i._renderToString(a:depth + 1, 1, add(copy(a:vertMap), 1), 0)
 | 
				
			||||||
 | 
					                endfor
 | 
				
			||||||
 | 
					            endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            "draw the last child, indicating that it IS the last
 | 
				
			||||||
 | 
					            let output = output . childNodesToDraw[lastIndx]._renderToString(a:depth + 1, 1, add(copy(a:vertMap), 0), 1)
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return output
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					" vim: set sw=4 sts=4 et fdm=marker:
 | 
				
			||||||
							
								
								
									
										41
									
								
								vim/bundle/nerdtree/nerdtree_plugin/exec_menuitem.vim
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								vim/bundle/nerdtree/nerdtree_plugin/exec_menuitem.vim
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,41 @@
 | 
				
			||||||
 | 
					" ============================================================================
 | 
				
			||||||
 | 
					" File:        exec_menuitem.vim
 | 
				
			||||||
 | 
					" Description: plugin for NERD Tree that provides an execute file menu item
 | 
				
			||||||
 | 
					" Maintainer:  Martin Grenfell <martin.grenfell at gmail dot com>
 | 
				
			||||||
 | 
					" Last Change: 22 July, 2009
 | 
				
			||||||
 | 
					" 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.
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					" ============================================================================
 | 
				
			||||||
 | 
					if exists("g:loaded_nerdtree_exec_menuitem")
 | 
				
			||||||
 | 
					    finish
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					let g:loaded_nerdtree_exec_menuitem = 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					call NERDTreeAddMenuItem({
 | 
				
			||||||
 | 
					            \ 'text': '(!)Execute file',
 | 
				
			||||||
 | 
					            \ 'shortcut': '!',
 | 
				
			||||||
 | 
					            \ 'callback': 'NERDTreeExecFile',
 | 
				
			||||||
 | 
					            \ 'isActiveCallback': 'NERDTreeExecFileActive' })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function! NERDTreeExecFileActive()
 | 
				
			||||||
 | 
					    let node = g:NERDTreeFileNode.GetSelected()
 | 
				
			||||||
 | 
					    return !node.path.isDirectory && node.path.isExecutable
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function! NERDTreeExecFile()
 | 
				
			||||||
 | 
					    let treenode = g:NERDTreeFileNode.GetSelected()
 | 
				
			||||||
 | 
					    echo "==========================================================\n"
 | 
				
			||||||
 | 
					    echo "Complete the command to execute (add arguments etc):\n"
 | 
				
			||||||
 | 
					    let cmd = treenode.path.str({'escape': 1})
 | 
				
			||||||
 | 
					    let cmd = input(':!', cmd . ' ')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if cmd != ''
 | 
				
			||||||
 | 
					        exec ':!' . cmd
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        echo "Aborted"
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
							
								
								
									
										262
									
								
								vim/bundle/nerdtree/nerdtree_plugin/fs_menu.vim
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										262
									
								
								vim/bundle/nerdtree/nerdtree_plugin/fs_menu.vim
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,262 @@
 | 
				
			||||||
 | 
					" ============================================================================
 | 
				
			||||||
 | 
					" File:        fs_menu.vim
 | 
				
			||||||
 | 
					" Description: plugin for the NERD Tree that provides a file system menu
 | 
				
			||||||
 | 
					" Maintainer:  Martin Grenfell <martin.grenfell at gmail dot com>
 | 
				
			||||||
 | 
					" Last Change: 17 July, 2009
 | 
				
			||||||
 | 
					" 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.
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					" ============================================================================
 | 
				
			||||||
 | 
					if exists("g:loaded_nerdtree_fs_menu")
 | 
				
			||||||
 | 
					    finish
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					let g:loaded_nerdtree_fs_menu = 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"Automatically delete the buffer after deleting or renaming a file
 | 
				
			||||||
 | 
					if !exists("g:NERDTreeAutoDeleteBuffer")
 | 
				
			||||||
 | 
					    let g:NERDTreeAutoDeleteBuffer = 0
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					call NERDTreeAddMenuItem({'text': '(a)dd a childnode', 'shortcut': 'a', 'callback': 'NERDTreeAddNode'})
 | 
				
			||||||
 | 
					call NERDTreeAddMenuItem({'text': '(m)ove the current node', 'shortcut': 'm', 'callback': 'NERDTreeMoveNode'})
 | 
				
			||||||
 | 
					call NERDTreeAddMenuItem({'text': '(d)elete the current node', 'shortcut': 'd', 'callback': 'NERDTreeDeleteNode'})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if has("gui_mac") || has("gui_macvim") 
 | 
				
			||||||
 | 
					    call NERDTreeAddMenuItem({'text': '(r)eveal in Finder the current node', 'shortcut': 'r', 'callback': 'NERDTreeRevealInFinder'})
 | 
				
			||||||
 | 
					    call NERDTreeAddMenuItem({'text': '(o)pen the current node with system editor', 'shortcut': 'o', 'callback': 'NERDTreeExecuteFile'})
 | 
				
			||||||
 | 
					    call NERDTreeAddMenuItem({'text': '(q)uicklook the current node', 'shortcut': 'q', 'callback': 'NERDTreeQuickLook'})
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if g:NERDTreePath.CopyingSupported()
 | 
				
			||||||
 | 
					    call NERDTreeAddMenuItem({'text': '(c)opy the current node', 'shortcut': 'c', 'callback': 'NERDTreeCopyNode'})
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: s:echo(msg){{{1
 | 
				
			||||||
 | 
					function! s:echo(msg)
 | 
				
			||||||
 | 
					    redraw
 | 
				
			||||||
 | 
					    echomsg "NERDTree: " . a:msg
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: s:echoWarning(msg){{{1
 | 
				
			||||||
 | 
					function! s:echoWarning(msg)
 | 
				
			||||||
 | 
					    echohl warningmsg
 | 
				
			||||||
 | 
					    call s:echo(a:msg)
 | 
				
			||||||
 | 
					    echohl normal
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: s:promptToDelBuffer(bufnum, msg){{{1
 | 
				
			||||||
 | 
					"prints out the given msg and, if the user responds by pushing 'y' then the
 | 
				
			||||||
 | 
					"buffer with the given bufnum is deleted
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Args:
 | 
				
			||||||
 | 
					"bufnum: the buffer that may be deleted
 | 
				
			||||||
 | 
					"msg: a message that will be echoed to the user asking them if they wish to
 | 
				
			||||||
 | 
					"     del the buffer
 | 
				
			||||||
 | 
					function! s:promptToDelBuffer(bufnum, msg)
 | 
				
			||||||
 | 
					    echo a:msg
 | 
				
			||||||
 | 
					    if g:NERDTreeAutoDeleteBuffer || nr2char(getchar()) ==# 'y'
 | 
				
			||||||
 | 
					        " 1. ensure that all windows which display the just deleted filename
 | 
				
			||||||
 | 
					        " now display an empty buffer (so a layout is preserved).
 | 
				
			||||||
 | 
					        " Is not it better to close single tabs with this file only ?
 | 
				
			||||||
 | 
					        let s:originalTabNumber = tabpagenr()
 | 
				
			||||||
 | 
					        let s:originalWindowNumber = winnr()
 | 
				
			||||||
 | 
					        exec "tabdo windo if winbufnr(0) == " . a:bufnum . " | exec ':enew! ' | endif"
 | 
				
			||||||
 | 
					        exec "tabnext " . s:originalTabNumber
 | 
				
			||||||
 | 
					        exec s:originalWindowNumber . "wincmd w"
 | 
				
			||||||
 | 
					        " 3. We don't need a previous buffer anymore
 | 
				
			||||||
 | 
					        exec "bwipeout! " . a:bufnum
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: s:promptToRenameBuffer(bufnum, msg){{{1
 | 
				
			||||||
 | 
					"prints out the given msg and, if the user responds by pushing 'y' then the
 | 
				
			||||||
 | 
					"buffer with the given bufnum is replaced with a new one
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Args:
 | 
				
			||||||
 | 
					"bufnum: the buffer that may be deleted
 | 
				
			||||||
 | 
					"msg: a message that will be echoed to the user asking them if they wish to
 | 
				
			||||||
 | 
					"     del the buffer
 | 
				
			||||||
 | 
					function! s:promptToRenameBuffer(bufnum, msg, newFileName)
 | 
				
			||||||
 | 
					    echo a:msg
 | 
				
			||||||
 | 
					    if g:NERDTreeAutoDeleteBuffer || nr2char(getchar()) ==# 'y'
 | 
				
			||||||
 | 
					        " 1. ensure that a new buffer is loaded
 | 
				
			||||||
 | 
					        exec "badd " . a:newFileName
 | 
				
			||||||
 | 
					        " 2. ensure that all windows which display the just deleted filename
 | 
				
			||||||
 | 
					        " display a buffer for a new filename. 
 | 
				
			||||||
 | 
					        let s:originalTabNumber = tabpagenr()
 | 
				
			||||||
 | 
					        let s:originalWindowNumber = winnr()
 | 
				
			||||||
 | 
					        exec "tabdo windo if winbufnr(0) == " . a:bufnum . " | exec ':e! " . a:newFileName . "' | endif"
 | 
				
			||||||
 | 
					        exec "tabnext " . s:originalTabNumber
 | 
				
			||||||
 | 
					        exec s:originalWindowNumber . "wincmd w"
 | 
				
			||||||
 | 
					        " 3. We don't need a previous buffer anymore
 | 
				
			||||||
 | 
					        exec "bwipeout! " . a:bufnum
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					"FUNCTION: NERDTreeAddNode(){{{1
 | 
				
			||||||
 | 
					function! NERDTreeAddNode()
 | 
				
			||||||
 | 
					    let curDirNode = g:NERDTreeDirNode.GetSelected()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let newNodeName = input("Add a childnode\n".
 | 
				
			||||||
 | 
					                          \ "==========================================================\n".
 | 
				
			||||||
 | 
					                          \ "Enter the dir/file name to be created. Dirs end with a '/'\n" .
 | 
				
			||||||
 | 
					                          \ "", curDirNode.path.str() . g:NERDTreePath.Slash(), "file")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if newNodeName ==# ''
 | 
				
			||||||
 | 
					        call s:echo("Node Creation Aborted.")
 | 
				
			||||||
 | 
					        return
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    try
 | 
				
			||||||
 | 
					        let newPath = g:NERDTreePath.Create(newNodeName)
 | 
				
			||||||
 | 
					        let parentNode = b:NERDTreeRoot.findNode(newPath.getParent())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let newTreeNode = g:NERDTreeFileNode.New(newPath)
 | 
				
			||||||
 | 
					        if parentNode.isOpen || !empty(parentNode.children)
 | 
				
			||||||
 | 
					            call parentNode.addChild(newTreeNode, 1)
 | 
				
			||||||
 | 
					            call NERDTreeRender()
 | 
				
			||||||
 | 
					            call newTreeNode.putCursorHere(1, 0)
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					    catch /^NERDTree/
 | 
				
			||||||
 | 
					        call s:echoWarning("Node Not Created.")
 | 
				
			||||||
 | 
					    endtry
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"FUNCTION: NERDTreeMoveNode(){{{1
 | 
				
			||||||
 | 
					function! NERDTreeMoveNode()
 | 
				
			||||||
 | 
					    let curNode = g:NERDTreeFileNode.GetSelected()
 | 
				
			||||||
 | 
					    let newNodePath = input("Rename the current node\n" .
 | 
				
			||||||
 | 
					                          \ "==========================================================\n" .
 | 
				
			||||||
 | 
					                          \ "Enter the new path for the node:                          \n" .
 | 
				
			||||||
 | 
					                          \ "", curNode.path.str(), "file")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if newNodePath ==# ''
 | 
				
			||||||
 | 
					        call s:echo("Node Renaming Aborted.")
 | 
				
			||||||
 | 
					        return
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    try
 | 
				
			||||||
 | 
					        let bufnum = bufnr(curNode.path.str())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        call curNode.rename(newNodePath)
 | 
				
			||||||
 | 
					        call NERDTreeRender()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        "if the node is open in a buffer, ask the user if they want to
 | 
				
			||||||
 | 
					        "close that buffer
 | 
				
			||||||
 | 
					        if bufnum != -1
 | 
				
			||||||
 | 
					            let prompt = "\nNode renamed.\n\nThe old file is open in buffer ". bufnum . (bufwinnr(bufnum) ==# -1 ? " (hidden)" : "") .". Replace this buffer with a new file? (yN)"
 | 
				
			||||||
 | 
					            call s:promptToRenameBuffer(bufnum,  prompt, newNodePath)
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        call curNode.putCursorHere(1, 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        redraw
 | 
				
			||||||
 | 
					    catch /^NERDTree/
 | 
				
			||||||
 | 
					        call s:echoWarning("Node Not Renamed.")
 | 
				
			||||||
 | 
					    endtry
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					" FUNCTION: NERDTreeDeleteNode() {{{1
 | 
				
			||||||
 | 
					function! NERDTreeDeleteNode()
 | 
				
			||||||
 | 
					    let currentNode = g:NERDTreeFileNode.GetSelected()
 | 
				
			||||||
 | 
					    let confirmed = 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if currentNode.path.isDirectory
 | 
				
			||||||
 | 
					        let choice =input("Delete the current node\n" .
 | 
				
			||||||
 | 
					                         \ "==========================================================\n" .
 | 
				
			||||||
 | 
					                         \ "STOP! To delete this entire directory, type 'yes'\n" .
 | 
				
			||||||
 | 
					                         \ "" . currentNode.path.str() . ": ")
 | 
				
			||||||
 | 
					        let confirmed = choice ==# 'yes'
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        echo "Delete the current node\n" .
 | 
				
			||||||
 | 
					           \ "==========================================================\n".
 | 
				
			||||||
 | 
					           \ "Are you sure you wish to delete the node:\n" .
 | 
				
			||||||
 | 
					           \ "" . currentNode.path.str() . " (yN):"
 | 
				
			||||||
 | 
					        let choice = nr2char(getchar())
 | 
				
			||||||
 | 
					        let confirmed = choice ==# 'y'
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if confirmed
 | 
				
			||||||
 | 
					        try
 | 
				
			||||||
 | 
					            call currentNode.delete()
 | 
				
			||||||
 | 
					            call NERDTreeRender()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            "if the node is open in a buffer, ask the user if they want to
 | 
				
			||||||
 | 
					            "close that buffer
 | 
				
			||||||
 | 
					            let bufnum = bufnr(currentNode.path.str())
 | 
				
			||||||
 | 
					            if buflisted(bufnum)
 | 
				
			||||||
 | 
					                let prompt = "\nNode deleted.\n\nThe file is open in buffer ". bufnum . (bufwinnr(bufnum) ==# -1 ? " (hidden)" : "") .". Delete this buffer? (yN)"
 | 
				
			||||||
 | 
					                call s:promptToDelBuffer(bufnum, prompt)
 | 
				
			||||||
 | 
					            endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            redraw
 | 
				
			||||||
 | 
					        catch /^NERDTree/
 | 
				
			||||||
 | 
					            call s:echoWarning("Could not remove node")
 | 
				
			||||||
 | 
					        endtry
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        call s:echo("delete aborted")
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					" FUNCTION: NERDTreeCopyNode() {{{1
 | 
				
			||||||
 | 
					function! NERDTreeCopyNode()
 | 
				
			||||||
 | 
					    let currentNode = g:NERDTreeFileNode.GetSelected()
 | 
				
			||||||
 | 
					    let newNodePath = input("Copy the current node\n" .
 | 
				
			||||||
 | 
					                          \ "==========================================================\n" .
 | 
				
			||||||
 | 
					                          \ "Enter the new path to copy the node to:                   \n" .
 | 
				
			||||||
 | 
					                          \ "", currentNode.path.str(), "file")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if newNodePath != ""
 | 
				
			||||||
 | 
					        "strip trailing slash
 | 
				
			||||||
 | 
					        let newNodePath = substitute(newNodePath, '\/$', '', '')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let confirmed = 1
 | 
				
			||||||
 | 
					        if currentNode.path.copyingWillOverwrite(newNodePath)
 | 
				
			||||||
 | 
					            call s:echo("Warning: copying may overwrite files! Continue? (yN)")
 | 
				
			||||||
 | 
					            let choice = nr2char(getchar())
 | 
				
			||||||
 | 
					            let confirmed = choice ==# 'y'
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if confirmed
 | 
				
			||||||
 | 
					            try
 | 
				
			||||||
 | 
					                let newNode = currentNode.copy(newNodePath)
 | 
				
			||||||
 | 
					                if !empty(newNode)
 | 
				
			||||||
 | 
					                    call NERDTreeRender()
 | 
				
			||||||
 | 
					                    call newNode.putCursorHere(0, 0)
 | 
				
			||||||
 | 
					                endif
 | 
				
			||||||
 | 
					            catch /^NERDTree/
 | 
				
			||||||
 | 
					                call s:echoWarning("Could not copy node")
 | 
				
			||||||
 | 
					            endtry
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        call s:echo("Copy aborted.")
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					    redraw
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function! NERDTreeQuickLook()
 | 
				
			||||||
 | 
					    let treenode = g:NERDTreeFileNode.GetSelected()
 | 
				
			||||||
 | 
					    if treenode != {}
 | 
				
			||||||
 | 
					        call system("qlmanage -p 2>/dev/null '" . treenode.path.str() . "'")
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function! NERDTreeRevealInFinder()
 | 
				
			||||||
 | 
					    let treenode = g:NERDTreeFileNode.GetSelected()
 | 
				
			||||||
 | 
					    if treenode != {}
 | 
				
			||||||
 | 
					        let x = system("open -R '" . treenode.path.str() . "'")
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function! NERDTreeExecuteFile()
 | 
				
			||||||
 | 
					    let treenode = g:NERDTreeFileNode.GetSelected()
 | 
				
			||||||
 | 
					    if treenode != {}
 | 
				
			||||||
 | 
					        let x = system("open '" . treenode.path.str() . "'")
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					" vim: set sw=4 sts=4 et fdm=marker:
 | 
				
			||||||
							
								
								
									
										210
									
								
								vim/bundle/nerdtree/plugin/NERD_tree.vim
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										210
									
								
								vim/bundle/nerdtree/plugin/NERD_tree.vim
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,210 @@
 | 
				
			||||||
 | 
					" ============================================================================
 | 
				
			||||||
 | 
					" File:        NERD_tree.vim
 | 
				
			||||||
 | 
					" Description: vim global plugin that provides a nice tree explorer
 | 
				
			||||||
 | 
					" Maintainer:  Martin Grenfell <martin.grenfell at gmail dot com>
 | 
				
			||||||
 | 
					" Last Change: 28 December, 2011
 | 
				
			||||||
 | 
					" 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.
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					" ============================================================================
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					" SECTION: Script init stuff {{{1
 | 
				
			||||||
 | 
					"============================================================
 | 
				
			||||||
 | 
					if exists("loaded_nerd_tree")
 | 
				
			||||||
 | 
					    finish
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					if v:version < 700
 | 
				
			||||||
 | 
					    echoerr "NERDTree: this plugin requires vim >= 7. DOWNLOAD IT! You'll thank me later!"
 | 
				
			||||||
 | 
					    finish
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					let loaded_nerd_tree = 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"for line continuation - i.e dont want C in &cpo
 | 
				
			||||||
 | 
					let s:old_cpo = &cpo
 | 
				
			||||||
 | 
					set cpo&vim
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"Function: s:initVariable() function {{{2
 | 
				
			||||||
 | 
					"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)
 | 
				
			||||||
 | 
					    if !exists(a:var)
 | 
				
			||||||
 | 
					        exec 'let ' . a:var . ' = ' . "'" . substitute(a:value, "'", "''", "g") . "'"
 | 
				
			||||||
 | 
					        return 1
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					    return 0
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"SECTION: Init variable calls and other random constants {{{2
 | 
				
			||||||
 | 
					call s:initVariable("g:NERDChristmasTree", 1)
 | 
				
			||||||
 | 
					call s:initVariable("g:NERDTreeAutoCenter", 1)
 | 
				
			||||||
 | 
					call s:initVariable("g:NERDTreeAutoCenterThreshold", 3)
 | 
				
			||||||
 | 
					call s:initVariable("g:NERDTreeCaseSensitiveSort", 0)
 | 
				
			||||||
 | 
					call s:initVariable("g:NERDTreeChDirMode", 0)
 | 
				
			||||||
 | 
					call s:initVariable("g:NERDTreeMinimalUI", 0)
 | 
				
			||||||
 | 
					if !exists("g:NERDTreeIgnore")
 | 
				
			||||||
 | 
					    let g:NERDTreeIgnore = ['\~$']
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					call s:initVariable("g:NERDTreeBookmarksFile", expand('$HOME') . '/.NERDTreeBookmarks')
 | 
				
			||||||
 | 
					call s:initVariable("g:NERDTreeHighlightCursorline", 1)
 | 
				
			||||||
 | 
					call s:initVariable("g:NERDTreeHijackNetrw", 1)
 | 
				
			||||||
 | 
					call s:initVariable("g:NERDTreeMouseMode", 1)
 | 
				
			||||||
 | 
					call s:initVariable("g:NERDTreeNotificationThreshold", 100)
 | 
				
			||||||
 | 
					call s:initVariable("g:NERDTreeQuitOnOpen", 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)
 | 
				
			||||||
 | 
					call s:initVariable("g:NERDTreeDirArrows", !nerdtree#runningWindows())
 | 
				
			||||||
 | 
					call s:initVariable("g:NERDTreeCasadeOpenSingleChildDir", 1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if !exists("g:NERDTreeSortOrder")
 | 
				
			||||||
 | 
					    let g:NERDTreeSortOrder = ['\/$', '*', '\.swp$',  '\.bak$', '\~$']
 | 
				
			||||||
 | 
					else
 | 
				
			||||||
 | 
					    "if there isnt a * in the sort sequence then add one
 | 
				
			||||||
 | 
					    if count(g:NERDTreeSortOrder, '*') < 1
 | 
				
			||||||
 | 
					        call add(g:NERDTreeSortOrder, '*')
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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:NERDTreeRoot (its a b: var, and its a hash)
 | 
				
			||||||
 | 
					    let g:NERDTreeStatusline = "%{exists('b:NERDTreeRoot')?b:NERDTreeRoot.path.str():''}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					call s:initVariable("g:NERDTreeWinPos", "left")
 | 
				
			||||||
 | 
					call s:initVariable("g:NERDTreeWinSize", 31)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"init the shell commands that will be used to copy nodes, and remove dir trees
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					"Note: the space after the command is important
 | 
				
			||||||
 | 
					if nerdtree#runningWindows()
 | 
				
			||||||
 | 
					    call s:initVariable("g:NERDTreeRemoveDirCmd", 'rmdir /s /q ')
 | 
				
			||||||
 | 
					else
 | 
				
			||||||
 | 
					    call s:initVariable("g:NERDTreeRemoveDirCmd", 'rm -rf ')
 | 
				
			||||||
 | 
					    call s:initVariable("g:NERDTreeCopyCmd", 'cp -r ')
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"SECTION: Init variable calls for key mappings {{{2
 | 
				
			||||||
 | 
					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")
 | 
				
			||||||
 | 
					call s:initVariable("g:NERDTreeMapJumpNextSibling", "<C-j>")
 | 
				
			||||||
 | 
					call s:initVariable("g:NERDTreeMapJumpParent", "p")
 | 
				
			||||||
 | 
					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")
 | 
				
			||||||
 | 
					call s:initVariable("g:NERDTreeMapOpenSplit", "i")
 | 
				
			||||||
 | 
					call s:initVariable("g:NERDTreeMapOpenVSplit", "s")
 | 
				
			||||||
 | 
					call s:initVariable("g:NERDTreeMapPreview", "g" . NERDTreeMapActivateNode)
 | 
				
			||||||
 | 
					call s:initVariable("g:NERDTreeMapPreviewSplit", "g" . NERDTreeMapOpenSplit)
 | 
				
			||||||
 | 
					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")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"SECTION: Load class files{{{2
 | 
				
			||||||
 | 
					call nerdtree#loadClassFiles()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					" SECTION: Commands {{{1
 | 
				
			||||||
 | 
					"============================================================
 | 
				
			||||||
 | 
					"init the command that users start the nerd tree with
 | 
				
			||||||
 | 
					command! -n=? -complete=dir -bar NERDTree :call g:NERDTreeCreator.CreatePrimary('<args>')
 | 
				
			||||||
 | 
					command! -n=? -complete=dir -bar NERDTreeToggle :call g:NERDTreeCreator.TogglePrimary('<args>')
 | 
				
			||||||
 | 
					command! -n=0 -bar NERDTreeClose :call nerdtree#closeTreeIfOpen()
 | 
				
			||||||
 | 
					command! -n=1 -complete=customlist,nerdtree#completeBookmarks -bar NERDTreeFromBookmark call g:NERDTreeCreator.CreatePrimary('<args>')
 | 
				
			||||||
 | 
					command! -n=0 -bar NERDTreeMirror call g:NERDTreeCreator.CreateMirror()
 | 
				
			||||||
 | 
					command! -n=0 -bar NERDTreeFind call nerdtree#findAndRevealPath()
 | 
				
			||||||
 | 
					command! -n=0 -bar NERDTreeFocus call NERDTreeFocus()
 | 
				
			||||||
 | 
					command! -n=0 -bar NERDTreeCWD call NERDTreeCWD()
 | 
				
			||||||
 | 
					" SECTION: Auto commands {{{1
 | 
				
			||||||
 | 
					"============================================================
 | 
				
			||||||
 | 
					augroup NERDTree
 | 
				
			||||||
 | 
					    "Save the cursor position whenever we close the nerd tree
 | 
				
			||||||
 | 
					    exec "autocmd BufWinLeave ". g:NERDTreeCreator.BufNamePrefix() ."* call nerdtree#saveScreenState()"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    "disallow insert mode in the NERDTree
 | 
				
			||||||
 | 
					    exec "autocmd BufEnter ". g:NERDTreeCreator.BufNamePrefix() ."* stopinsert"
 | 
				
			||||||
 | 
					augroup END
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if g:NERDTreeHijackNetrw
 | 
				
			||||||
 | 
					    augroup NERDTreeHijackNetrw
 | 
				
			||||||
 | 
					        autocmd VimEnter * silent! autocmd! FileExplorer
 | 
				
			||||||
 | 
					        au BufEnter,VimEnter * call nerdtree#checkForBrowse(expand("<amatch>"))
 | 
				
			||||||
 | 
					    augroup END
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					" SECTION: Public API {{{1
 | 
				
			||||||
 | 
					"============================================================
 | 
				
			||||||
 | 
					function! NERDTreeAddMenuItem(options)
 | 
				
			||||||
 | 
					    call g:NERDTreeMenuItem.Create(a:options)
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function! NERDTreeAddMenuSeparator(...)
 | 
				
			||||||
 | 
					    let opts = a:0 ? a:1 : {}
 | 
				
			||||||
 | 
					    call g:NERDTreeMenuItem.CreateSeparator(opts)
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function! NERDTreeAddSubmenu(options)
 | 
				
			||||||
 | 
					    return g:NERDTreeMenuItem.Create(a:options)
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function! NERDTreeAddKeyMap(options)
 | 
				
			||||||
 | 
					    call g:NERDTreeKeyMap.Create(a:options)
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function! NERDTreeRender()
 | 
				
			||||||
 | 
					    call nerdtree#renderView()
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function! NERDTreeFocus()
 | 
				
			||||||
 | 
					    if nerdtree#isTreeOpen()
 | 
				
			||||||
 | 
					        call nerdtree#putCursorInTreeWin()
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        call g:NERDTreeCreator.TogglePrimary("")
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function! NERDTreeCWD()
 | 
				
			||||||
 | 
					    call NERDTreeFocus()
 | 
				
			||||||
 | 
					    call nerdtree#chRootCwd()
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					" SECTION: Post Source Actions {{{1
 | 
				
			||||||
 | 
					call nerdtree#postSourceActions()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"reset &cpo back to users setting
 | 
				
			||||||
 | 
					let &cpo = s:old_cpo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					" vim: set sw=4 sts=4 et fdm=marker:
 | 
				
			||||||
							
								
								
									
										88
									
								
								vim/bundle/nerdtree/syntax/nerdtree.vim
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								vim/bundle/nerdtree/syntax/nerdtree.vim
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,88 @@
 | 
				
			||||||
 | 
					let s:tree_up_dir_line = '.. (up a dir)'
 | 
				
			||||||
 | 
					"NERDTreeFlags are syntax items that should be invisible, but give clues as to
 | 
				
			||||||
 | 
					"how things should be highlighted
 | 
				
			||||||
 | 
					syn match NERDTreeFlag #\~#
 | 
				
			||||||
 | 
					syn match NERDTreeFlag #\[RO\]#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"highlighting for the .. (up dir) line at the top of the tree
 | 
				
			||||||
 | 
					execute "syn match NERDTreeUp #\\V". s:tree_up_dir_line ."#"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"highlighting for the ~/+ symbols for the directory nodes
 | 
				
			||||||
 | 
					syn match NERDTreeClosable #\~\<#
 | 
				
			||||||
 | 
					syn match NERDTreeClosable #\~\.#
 | 
				
			||||||
 | 
					syn match NERDTreeOpenable #+\<#
 | 
				
			||||||
 | 
					syn match NERDTreeOpenable #+\.#he=e-1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"highlighting for the tree structural parts
 | 
				
			||||||
 | 
					syn match NERDTreePart #|#
 | 
				
			||||||
 | 
					syn match NERDTreePart #`#
 | 
				
			||||||
 | 
					syn match NERDTreePartFile #[|`]-#hs=s+1 contains=NERDTreePart
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"quickhelp syntax elements
 | 
				
			||||||
 | 
					syn match NERDTreeHelpKey #" \{1,2\}[^ ]*:#hs=s+2,he=e-1
 | 
				
			||||||
 | 
					syn match NERDTreeHelpKey #" \{1,2\}[^ ]*,#hs=s+2,he=e-1
 | 
				
			||||||
 | 
					syn match NERDTreeHelpTitle #" .*\~#hs=s+2,he=e-1 contains=NERDTreeFlag
 | 
				
			||||||
 | 
					syn match NERDTreeToggleOn #".*(on)#hs=e-2,he=e-1 contains=NERDTreeHelpKey
 | 
				
			||||||
 | 
					syn match NERDTreeToggleOff #".*(off)#hs=e-3,he=e-1 contains=NERDTreeHelpKey
 | 
				
			||||||
 | 
					syn match NERDTreeHelpCommand #" :.\{-}\>#hs=s+3
 | 
				
			||||||
 | 
					syn match NERDTreeHelp  #^".*# contains=NERDTreeHelpKey,NERDTreeHelpTitle,NERDTreeFlag,NERDTreeToggleOff,NERDTreeToggleOn,NERDTreeHelpCommand
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"highlighting for readonly files
 | 
				
			||||||
 | 
					syn match NERDTreeRO #.*\[RO\]#hs=s+2 contains=NERDTreeFlag,NERDTreeBookmark,NERDTreePart,NERDTreePartFile
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"highlighting for sym links
 | 
				
			||||||
 | 
					syn match NERDTreeLink #[^-| `].* -> # contains=NERDTreeBookmark,NERDTreeOpenable,NERDTreeClosable,NERDTreeDirSlash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"highlighing for directory nodes and file nodes
 | 
				
			||||||
 | 
					syn match NERDTreeDirSlash #/#
 | 
				
			||||||
 | 
					syn match NERDTreeDir #[^-| `].*/# contains=NERDTreeLink,NERDTreeDirSlash,NERDTreeOpenable,NERDTreeClosable
 | 
				
			||||||
 | 
					syn match NERDTreeExecFile  #[|` ].*\*\($\| \)# contains=NERDTreeLink,NERDTreePart,NERDTreeRO,NERDTreePartFile,NERDTreeBookmark
 | 
				
			||||||
 | 
					syn match NERDTreeFile  #|-.*# contains=NERDTreeLink,NERDTreePart,NERDTreeRO,NERDTreePartFile,NERDTreeBookmark,NERDTreeExecFile
 | 
				
			||||||
 | 
					syn match NERDTreeFile  #`-.*# contains=NERDTreeLink,NERDTreePart,NERDTreeRO,NERDTreePartFile,NERDTreeBookmark,NERDTreeExecFile
 | 
				
			||||||
 | 
					syn match NERDTreeCWD #^[</].*$#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"highlighting for bookmarks
 | 
				
			||||||
 | 
					syn match NERDTreeBookmark # {.*}#hs=s+1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"highlighting for the bookmarks table
 | 
				
			||||||
 | 
					syn match NERDTreeBookmarksLeader #^>#
 | 
				
			||||||
 | 
					syn match NERDTreeBookmarksHeader #^>-\+Bookmarks-\+$# contains=NERDTreeBookmarksLeader
 | 
				
			||||||
 | 
					syn match NERDTreeBookmarkName #^>.\{-} #he=e-1 contains=NERDTreeBookmarksLeader
 | 
				
			||||||
 | 
					syn match NERDTreeBookmark #^>.*$# contains=NERDTreeBookmarksLeader,NERDTreeBookmarkName,NERDTreeBookmarksHeader
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if exists("g:NERDChristmasTree") && g:NERDChristmasTree
 | 
				
			||||||
 | 
					    hi def link NERDTreePart Special
 | 
				
			||||||
 | 
					    hi def link NERDTreePartFile Type
 | 
				
			||||||
 | 
					    hi def link NERDTreeFile Normal
 | 
				
			||||||
 | 
					    hi def link NERDTreeExecFile Title
 | 
				
			||||||
 | 
					    hi def link NERDTreeDirSlash Identifier
 | 
				
			||||||
 | 
					    hi def link NERDTreeClosable Type
 | 
				
			||||||
 | 
					else
 | 
				
			||||||
 | 
					    hi def link NERDTreePart Normal
 | 
				
			||||||
 | 
					    hi def link NERDTreePartFile Normal
 | 
				
			||||||
 | 
					    hi def link NERDTreeFile Normal
 | 
				
			||||||
 | 
					    hi def link NERDTreeClosable Title
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					hi def link NERDTreeBookmarksHeader statement
 | 
				
			||||||
 | 
					hi def link NERDTreeBookmarksLeader ignore
 | 
				
			||||||
 | 
					hi def link NERDTreeBookmarkName Identifier
 | 
				
			||||||
 | 
					hi def link NERDTreeBookmark normal
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					hi def link NERDTreeHelp String
 | 
				
			||||||
 | 
					hi def link NERDTreeHelpKey Identifier
 | 
				
			||||||
 | 
					hi def link NERDTreeHelpCommand Identifier
 | 
				
			||||||
 | 
					hi def link NERDTreeHelpTitle Macro
 | 
				
			||||||
 | 
					hi def link NERDTreeToggleOn Question
 | 
				
			||||||
 | 
					hi def link NERDTreeToggleOff WarningMsg
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					hi def link NERDTreeDir Directory
 | 
				
			||||||
 | 
					hi def link NERDTreeUp Directory
 | 
				
			||||||
 | 
					hi def link NERDTreeCWD Statement
 | 
				
			||||||
 | 
					hi def link NERDTreeLink Macro
 | 
				
			||||||
 | 
					hi def link NERDTreeOpenable Title
 | 
				
			||||||
 | 
					hi def link NERDTreeFlag ignore
 | 
				
			||||||
 | 
					hi def link NERDTreeRO WarningMsg
 | 
				
			||||||
 | 
					hi def link NERDTreeBookmark Statement
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					hi def link NERDTreeCurrentNode Search
 | 
				
			||||||
							
								
								
									
										4
									
								
								vimrc
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								vimrc
									
									
									
									
									
								
							| 
						 | 
					@ -24,6 +24,10 @@ map <leader>fa :CtrlP app/assets<cr>
 | 
				
			||||||
map <leader>fj :CtrlP app/assets/javascripts<cr>
 | 
					map <leader>fj :CtrlP app/assets/javascripts<cr>
 | 
				
			||||||
nnoremap <silent> <leader>fr :ClearCtrlPCache<cr>\|:CtrlP<cr>
 | 
					nnoremap <silent> <leader>fr :ClearCtrlPCache<cr>\|:CtrlP<cr>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					" # NERDtree
 | 
				
			||||||
 | 
					nmap <leader>d :NERDTreeToggle<CR>
 | 
				
			||||||
 | 
					nmap <leader>f :NERDTreeFind<CR>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
" # gist-vim
 | 
					" # gist-vim
 | 
				
			||||||
let g:gist_detect_filetype = 1
 | 
					let g:gist_detect_filetype = 1
 | 
				
			||||||
let g:gist_open_browser_after_post = 1
 | 
					let g:gist_open_browser_after_post = 1
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user