1 " ============================================================================ 2 " File: NERD_tree.vim 3 " Maintainer: Martin Grenfell <martin.grenfell at gmail dot com> 4 " License: This program is free software. It comes without any warranty, 5 " to the extent permitted by applicable law. You can redistribute 6 " it and/or modify it under the terms of the Do What The Fuck You 7 " Want To Public License, Version 2, as published by Sam Hocevar. 8 " See http://sam.zoy.org/wtfpl/COPYING for more details. 9 " 10 " ============================================================================ 11 " 12 " SECTION: Script init stuff {{{1 13 "============================================================ 14 scriptencoding utf-8 15 16 if exists('loaded_nerd_tree') 17 finish 18 endif 19 if v:version < 703 20 echoerr "NERDTree: this plugin requires vim >= 7.3. DOWNLOAD IT! You'll thank me later!" 21 finish 22 endif 23 let loaded_nerd_tree = 1 24 25 "for line continuation - i.e dont want C in &cpoptions 26 let s:old_cpo = &cpoptions 27 set cpoptions&vim 28 29 "SECTION: Initialize variable calls and other random constants {{{2 30 let g:NERDTreeAutoCenter = get(g:, 'NERDTreeAutoCenter', 1) 31 let g:NERDTreeAutoCenterThreshold = get(g:, 'NERDTreeAutoCenterThreshold', 3) 32 let g:NERDTreeCaseSensitiveSort = get(g:, 'NERDTreeCaseSensitiveSort', 0) 33 let g:NERDTreeNaturalSort = get(g:, 'NERDTreeNaturalSort', 0) 34 let g:NERDTreeSortHiddenFirst = get(g:, 'NERDTreeSortHiddenFirst', 1) 35 let g:NERDTreeUseTCD = get(g:, 'NERDTreeUseTCD', 0) 36 let g:NERDTreeChDirMode = get(g:, 'NERDTreeChDirMode', 0) 37 let g:NERDTreeCreatePrefix = get(g:, 'NERDTreeCreatePrefix', 'silent') 38 let g:NERDTreeMinimalUI = get(g:, 'NERDTreeMinimalUI', 0) 39 let g:NERDTreeMinimalMenu = get(g:, 'NERDTreeMinimalMenu', 0) 40 let g:NERDTreeIgnore = get(g:, 'NERDTreeIgnore', ['\~$']) 41 let g:NERDTreeBookmarksFile = get(g:, 'NERDTreeBookmarksFile', expand('$HOME') . '/.NERDTreeBookmarks') 42 let g:NERDTreeBookmarksSort = get(g:, 'NERDTreeBookmarksSort', 1) 43 let g:NERDTreeHighlightCursorline = get(g:, 'NERDTreeHighlightCursorline', 1) 44 let g:NERDTreeHijackNetrw = get(g:, 'NERDTreeHijackNetrw', 1) 45 let g:NERDTreeMarkBookmarks = get(g:, 'NERDTreeMarkBookmarks', 1) 46 let g:NERDTreeMouseMode = get(g:, 'NERDTreeMouseMode', 1) 47 let g:NERDTreeNotificationThreshold = get(g:, 'NERDTreeNotificationThreshold', 100) 48 let g:NERDTreeQuitOnOpen = get(g:, 'NERDTreeQuitOnOpen', 0) 49 let g:NERDTreeRespectWildIgnore = get(g:, 'NERDTreeRespectWildIgnore', 0) 50 let g:NERDTreeShowBookmarks = get(g:, 'NERDTreeShowBookmarks', 0) 51 let g:NERDTreeShowFiles = get(g:, 'NERDTreeShowFiles', 1) 52 let g:NERDTreeShowHidden = get(g:, 'NERDTreeShowHidden', 0) 53 let g:NERDTreeShowLineNumbers = get(g:, 'NERDTreeShowLineNumbers', 0) 54 let g:NERDTreeSortDirs = get(g:, 'NERDTreeSortDirs', 1) 55 56 if !nerdtree#runningWindows() && !nerdtree#runningCygwin() 57 let g:NERDTreeDirArrowExpandable = get(g:, 'NERDTreeDirArrowExpandable', '▸') 58 let g:NERDTreeDirArrowCollapsible = get(g:, 'NERDTreeDirArrowCollapsible', '▾') 59 else 60 let g:NERDTreeDirArrowExpandable = get(g:, 'NERDTreeDirArrowExpandable', '+') 61 let g:NERDTreeDirArrowCollapsible = get(g:, 'NERDTreeDirArrowCollapsible', '~') 62 endif 63 64 let g:NERDTreeCascadeOpenSingleChildDir = get(g:, 'NERDTreeCascadeOpenSingleChildDir', 1) 65 let g:NERDTreeCascadeSingleChildDir = get(g:, 'NERDTreeCascadeSingleChildDir', 1) 66 67 let g:NERDTreeSortOrder = get(g:, 'NERDTreeSortOrder', ['\/$', '*', '\.swp$', '\.bak$', '\~$']) 68 let g:NERDTreeOldSortOrder = [] 69 70 let g:NERDTreeGlyphReadOnly = get(g:, 'NERDTreeGlyphReadOnly', 'RO') 71 72 if has('conceal') 73 let g:NERDTreeNodeDelimiter = get(g:, 'NERDTreeNodeDelimiter', "\x07") 74 elseif (g:NERDTreeDirArrowExpandable ==# "\u00a0" || g:NERDTreeDirArrowCollapsible ==# "\u00a0") 75 let g:NERDTreeNodeDelimiter = get(g:, 'NERDTreeNodeDelimiter', "\u00b7") 76 else 77 let g:NERDTreeNodeDelimiter = get(g:, 'NERDTreeNodeDelimiter', "\u00a0") 78 endif 79 80 "the exists() crap here is a hack to stop vim spazzing out when 81 "loading a session that was created with an open nerd tree. It spazzes 82 "because it doesnt store b:NERDTree(its a b: var, and its a hash) 83 let g:NERDTreeStatusline = get(g:, 'NERDTreeStatusline', "%{exists('b:NERDTree')?b:NERDTree.root.path.str():''}") 84 85 let g:NERDTreeWinPos = get(g:, 'NERDTreeWinPos', 'left') 86 let g:NERDTreeWinSize = get(g:, 'NERDTreeWinSize', 31) 87 88 "init the shell commands that will be used to copy nodes, and remove dir trees 89 "Note: the space after the command is important 90 if nerdtree#runningWindows() 91 let g:NERDTreeRemoveDirCmd = get(g:, 'NERDTreeRemoveDirCmd', 'rmdir /s /q ') 92 let g:NERDTreeCopyDirCmd = get(g:, 'NERDTreeCopyDirCmd', 'xcopy /s /e /i /y /q ') 93 let g:NERDTreeCopyFileCmd = get(g:, 'NERDTreeCopyFileCmd', 'copy /y ') 94 else 95 let g:NERDTreeRemoveDirCmd = get(g:, 'NERDTreeRemoveDirCmd', 'rm -rf ') 96 let g:NERDTreeCopyCmd = get(g:, 'NERDTreeCopyCmd', 'cp -r ') 97 endif 98 99 "SECTION: Init variable calls for key mappings {{{2 100 let g:NERDTreeMapCustomOpen = get(g:, 'NERDTreeMapCustomOpen', '<CR>') 101 let g:NERDTreeMapActivateNode = get(g:, 'NERDTreeMapActivateNode', 'o') 102 let g:NERDTreeMapChangeRoot = get(g:, 'NERDTreeMapChangeRoot', 'C') 103 let g:NERDTreeMapChdir = get(g:, 'NERDTreeMapChdir', 'cd') 104 let g:NERDTreeMapCloseChildren = get(g:, 'NERDTreeMapCloseChildren', 'X') 105 let g:NERDTreeMapCloseDir = get(g:, 'NERDTreeMapCloseDir', 'x') 106 let g:NERDTreeMapDeleteBookmark = get(g:, 'NERDTreeMapDeleteBookmark', 'D') 107 let g:NERDTreeMapMenu = get(g:, 'NERDTreeMapMenu', 'm') 108 let g:NERDTreeMapHelp = get(g:, 'NERDTreeMapHelp', '?') 109 let g:NERDTreeMapJumpFirstChild = get(g:, 'NERDTreeMapJumpFirstChild', 'K') 110 let g:NERDTreeMapJumpLastChild = get(g:, 'NERDTreeMapJumpLastChild', 'J') 111 let g:NERDTreeMapJumpNextSibling = get(g:, 'NERDTreeMapJumpNextSibling', '<C-j>') 112 let g:NERDTreeMapJumpParent = get(g:, 'NERDTreeMapJumpParent', 'p') 113 let g:NERDTreeMapJumpPrevSibling = get(g:, 'NERDTreeMapJumpPrevSibling', '<C-k>') 114 let g:NERDTreeMapJumpRoot = get(g:, 'NERDTreeMapJumpRoot', 'P') 115 let g:NERDTreeMapOpenExpl = get(g:, 'NERDTreeMapOpenExpl', 'e') 116 let g:NERDTreeMapOpenInTab = get(g:, 'NERDTreeMapOpenInTab', 't') 117 let g:NERDTreeMapOpenInTabSilent = get(g:, 'NERDTreeMapOpenInTabSilent', 'T') 118 let g:NERDTreeMapOpenRecursively = get(g:, 'NERDTreeMapOpenRecursively', 'O') 119 let g:NERDTreeMapOpenSplit = get(g:, 'NERDTreeMapOpenSplit', 'i') 120 let g:NERDTreeMapOpenVSplit = get(g:, 'NERDTreeMapOpenVSplit', 's') 121 let g:NERDTreeMapPreview = get(g:, 'NERDTreeMapPreview', 'g'.NERDTreeMapActivateNode) 122 let g:NERDTreeMapPreviewSplit = get(g:, 'NERDTreeMapPreviewSplit', 'g'.NERDTreeMapOpenSplit) 123 let g:NERDTreeMapPreviewVSplit = get(g:, 'NERDTreeMapPreviewVSplit', 'g'.NERDTreeMapOpenVSplit) 124 let g:NERDTreeMapQuit = get(g:, 'NERDTreeMapQuit', 'q') 125 let g:NERDTreeMapRefresh = get(g:, 'NERDTreeMapRefresh', 'r') 126 let g:NERDTreeMapRefreshRoot = get(g:, 'NERDTreeMapRefreshRoot', 'R') 127 let g:NERDTreeMapToggleBookmarks = get(g:, 'NERDTreeMapToggleBookmarks', 'B') 128 let g:NERDTreeMapToggleFiles = get(g:, 'NERDTreeMapToggleFiles', 'F') 129 let g:NERDTreeMapToggleFilters = get(g:, 'NERDTreeMapToggleFilters', 'f') 130 let g:NERDTreeMapToggleHidden = get(g:, 'NERDTreeMapToggleHidden', 'I') 131 let g:NERDTreeMapToggleZoom = get(g:, 'NERDTreeMapToggleZoom', 'A') 132 let g:NERDTreeMapUpdir = get(g:, 'NERDTreeMapUpdir', 'u') 133 let g:NERDTreeMapUpdirKeepOpen = get(g:, 'NERDTreeMapUpdirKeepOpen', 'U') 134 let g:NERDTreeMapCWD = get(g:, 'NERDTreeMapCWD', 'CD') 135 let g:NERDTreeMenuDown = get(g:, 'NERDTreeMenuDown', 'j') 136 let g:NERDTreeMenuUp = get(g:, 'NERDTreeMenuUp', 'k') 137 138 "SECTION: Load class files{{{2 139 call nerdtree#loadClassFiles() 140 141 " SECTION: Commands {{{1 142 "============================================================ 143 call nerdtree#ui_glue#setupCommands() 144 145 " SECTION: Auto commands {{{1 146 "============================================================ 147 augroup NERDTree 148 "Save the cursor position whenever we close the nerd tree 149 exec 'autocmd BufLeave,WinLeave '. g:NERDTreeCreator.BufNamePrefix() .'* if g:NERDTree.IsOpen() | call b:NERDTree.ui.saveScreenState() | endif' 150 151 "disallow insert mode in the NERDTree 152 exec 'autocmd BufEnter,WinEnter '. g:NERDTreeCreator.BufNamePrefix() .'* stopinsert' 153 augroup END 154 155 if g:NERDTreeHijackNetrw 156 augroup NERDTreeHijackNetrw 157 autocmd VimEnter * silent! autocmd! FileExplorer 158 au BufEnter,VimEnter * call nerdtree#checkForBrowse(expand('<amatch>')) 159 augroup END 160 endif 161 162 if g:NERDTreeChDirMode ==# 3 163 augroup NERDTreeChDirOnTabSwitch 164 autocmd TabEnter * if g:NERDTree.ExistsForTab()|call g:NERDTree.ForCurrentTab().getRoot().path.changeToDir()|endif 165 augroup END 166 endif 167 168 " SECTION: Public API {{{1 169 "============================================================ 170 function! NERDTreeAddMenuItem(options) 171 call g:NERDTreeMenuItem.Create(a:options) 172 endfunction 173 174 function! NERDTreeAddMenuSeparator(...) 175 let opts = a:0 ? a:1 : {} 176 call g:NERDTreeMenuItem.CreateSeparator(opts) 177 endfunction 178 179 function! NERDTreeAddSubmenu(options) 180 return g:NERDTreeMenuItem.Create(a:options) 181 endfunction 182 183 function! NERDTreeAddKeyMap(options) 184 call g:NERDTreeKeyMap.Create(a:options) 185 endfunction 186 187 function! NERDTreeRender() 188 call nerdtree#renderView() 189 endfunction 190 191 function! NERDTreeFocus() 192 if g:NERDTree.IsOpen() 193 call g:NERDTree.CursorToTreeWin(0) 194 else 195 call g:NERDTreeCreator.ToggleTabTree('') 196 endif 197 endfunction 198 199 function! NERDTreeCWD() 200 201 if empty(getcwd()) 202 call nerdtree#echoWarning('current directory does not exist') 203 return 204 endif 205 206 try 207 let l:cwdPath = g:NERDTreePath.New(getcwd()) 208 catch /^NERDTree.InvalidArgumentsError/ 209 call nerdtree#echoWarning('current directory does not exist') 210 return 211 endtry 212 213 call NERDTreeFocus() 214 215 if b:NERDTree.root.path.equals(l:cwdPath) 216 return 217 endif 218 219 let l:newRoot = g:NERDTreeFileNode.New(l:cwdPath, b:NERDTree) 220 call b:NERDTree.changeRoot(l:newRoot) 221 normal! ^ 222 endfunction 223 224 function! NERDTreeAddPathFilter(callback) 225 call g:NERDTree.AddPathFilter(a:callback) 226 endfunction 227 228 " SECTION: Post Source Actions {{{1 229 call nerdtree#postSourceActions() 230 231 "reset &cpoptions back to users setting 232 let &cpoptions = s:old_cpo 233 234 " vim: set sw=4 sts=4 et fdm=marker:
