NERD_tree.vim 11 KB

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