nerdtree.vim 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407
  1. if exists("g:loaded_nerdtree_autoload")
  2. finish
  3. endif
  4. let g:loaded_nerdtree_autoload = 1
  5. function! nerdtree#version()
  6. return '4.2.0'
  7. endfunction
  8. " SECTION: General Functions {{{1
  9. "============================================================
  10. "FUNCTION: nerdtree#checkForBrowse(dir) {{{2
  11. "inits a secondary nerd tree in the current buffer if appropriate
  12. function! nerdtree#checkForBrowse(dir)
  13. if a:dir != '' && isdirectory(a:dir)
  14. call g:NERDTreeCreator.CreateSecondary(a:dir)
  15. endif
  16. endfunction
  17. " FUNCTION: nerdtree#completeBookmarks(A,L,P) {{{2
  18. " completion function for the bookmark commands
  19. function! nerdtree#completeBookmarks(A,L,P)
  20. return filter(g:NERDTreeBookmark.BookmarkNames(), 'v:val =~# "^' . a:A . '"')
  21. endfunction
  22. "FUNCTION: nerdtree#compareBookmarks(dir) {{{2
  23. function! nerdtree#compareBookmarks(first, second)
  24. return a:first.compareTo(a:second)
  25. endfunction
  26. "FUNCTION: nerdtree#compareNodes(dir) {{{2
  27. function! nerdtree#compareNodes(n1, n2)
  28. return a:n1.path.compareTo(a:n2.path)
  29. endfunction
  30. " FUNCTION: nerdtree#deprecated(func, [msg]) {{{2
  31. " Issue a deprecation warning for a:func. If a second arg is given, use this
  32. " as the deprecation message
  33. function! nerdtree#deprecated(func, ...)
  34. let msg = a:0 ? a:func . ' ' . a:1 : a:func . ' is deprecated'
  35. if !exists('s:deprecationWarnings')
  36. let s:deprecationWarnings = {}
  37. endif
  38. if !has_key(s:deprecationWarnings, a:func)
  39. let s:deprecationWarnings[a:func] = 1
  40. echomsg msg
  41. endif
  42. endfunction
  43. " FUNCTION: nerdtree#exec(cmd) {{{2
  44. " same as :exec cmd but eventignore=all is set for the duration
  45. function! nerdtree#exec(cmd)
  46. let old_ei = &ei
  47. set ei=all
  48. exec a:cmd
  49. let &ei = old_ei
  50. endfunction
  51. " FUNCTION: nerdtree#has_opt(options, name) {{{2
  52. function! nerdtree#has_opt(options, name)
  53. return has_key(a:options, a:name) && a:options[a:name] == 1
  54. endfunction
  55. " FUNCTION: nerdtree#loadClassFiles() {{{2
  56. function! nerdtree#loadClassFiles()
  57. runtime lib/nerdtree/path.vim
  58. runtime lib/nerdtree/menu_controller.vim
  59. runtime lib/nerdtree/menu_item.vim
  60. runtime lib/nerdtree/key_map.vim
  61. runtime lib/nerdtree/bookmark.vim
  62. runtime lib/nerdtree/tree_file_node.vim
  63. runtime lib/nerdtree/tree_dir_node.vim
  64. runtime lib/nerdtree/opener.vim
  65. runtime lib/nerdtree/creator.vim
  66. runtime lib/nerdtree/flag_set.vim
  67. runtime lib/nerdtree/nerdtree.vim
  68. runtime lib/nerdtree/ui.vim
  69. runtime lib/nerdtree/event.vim
  70. runtime lib/nerdtree/notifier.vim
  71. endfunction
  72. " FUNCTION: nerdtree#postSourceActions() {{{2
  73. function! nerdtree#postSourceActions()
  74. call g:NERDTreeBookmark.CacheBookmarks(0)
  75. call nerdtree#ui_glue#createDefaultBindings()
  76. "load all nerdtree plugins
  77. runtime! nerdtree_plugin/**/*.vim
  78. endfunction
  79. "FUNCTION: nerdtree#runningWindows(dir) {{{2
  80. function! nerdtree#runningWindows()
  81. return has("win16") || has("win32") || has("win64")
  82. endfunction
  83. "FUNCTION: nerdtree#treeMarkupReg(dir) {{{2
  84. function! nerdtree#treeMarkupReg()
  85. if g:NERDTreeDirArrows
  86. return '^\([▾▸] \| \+[▾▸] \| \+\)'
  87. endif
  88. return '^[ `|]*[\-+~]'
  89. endfunction
  90. "FUNCTION: nerdtree#treeUpDirLine(dir) {{{2
  91. function! nerdtree#treeUpDirLine()
  92. return '.. (up a dir)'
  93. endfunction
  94. "FUNCTION: nerdtree#treeWid(dir) {{{2
  95. function! nerdtree#treeWid()
  96. return 2
  97. endfunction
  98. " SECTION: View Functions {{{1
  99. "============================================================
  100. "FUNCTION: nerdtree#closeTree() {{{2
  101. "Closes the primary NERD tree window for this tab
  102. function! nerdtree#closeTree()
  103. if !nerdtree#isTreeOpen()
  104. throw "NERDTree.NoTreeFoundError: no NERDTree is open"
  105. endif
  106. if winnr("$") != 1
  107. if winnr() == nerdtree#getTreeWinNum()
  108. call nerdtree#exec("wincmd p")
  109. let bufnr = bufnr("")
  110. call nerdtree#exec("wincmd p")
  111. else
  112. let bufnr = bufnr("")
  113. endif
  114. call nerdtree#exec(nerdtree#getTreeWinNum() . " wincmd w")
  115. close
  116. call nerdtree#exec(bufwinnr(bufnr) . " wincmd w")
  117. else
  118. close
  119. endif
  120. endfunction
  121. "FUNCTION: nerdtree#closeTreeIfOpen() {{{2
  122. "Closes the NERD tree window if it is open
  123. function! nerdtree#closeTreeIfOpen()
  124. if nerdtree#isTreeOpen()
  125. call nerdtree#closeTree()
  126. endif
  127. endfunction
  128. "FUNCTION: nerdtree#closeTreeIfQuitOnOpen() {{{2
  129. "Closes the NERD tree window if the close on open option is set
  130. function! nerdtree#closeTreeIfQuitOnOpen()
  131. if g:NERDTreeQuitOnOpen && nerdtree#isTreeOpen()
  132. call nerdtree#closeTree()
  133. endif
  134. endfunction
  135. "FUNCTION: nerdtree#dumpHelp {{{2
  136. "prints out the quick help
  137. function! nerdtree#dumpHelp()
  138. let old_h = @h
  139. if b:treeShowHelp ==# 1
  140. let @h= "\" NERD tree (" . nerdtree#version() . ") quickhelp~\n"
  141. let @h=@h."\" ============================\n"
  142. let @h=@h."\" File node mappings~\n"
  143. let @h=@h."\" ". (g:NERDTreeMouseMode ==# 3 ? "single" : "double") ."-click,\n"
  144. let @h=@h."\" <CR>,\n"
  145. if b:NERDTreeType ==# "primary"
  146. let @h=@h."\" ". g:NERDTreeMapActivateNode .": open in prev window\n"
  147. else
  148. let @h=@h."\" ". g:NERDTreeMapActivateNode .": open in current window\n"
  149. endif
  150. if b:NERDTreeType ==# "primary"
  151. let @h=@h."\" ". g:NERDTreeMapPreview .": preview\n"
  152. endif
  153. let @h=@h."\" ". g:NERDTreeMapOpenInTab.": open in new tab\n"
  154. let @h=@h."\" ". g:NERDTreeMapOpenInTabSilent .": open in new tab silently\n"
  155. let @h=@h."\" middle-click,\n"
  156. let @h=@h."\" ". g:NERDTreeMapOpenSplit .": open split\n"
  157. let @h=@h."\" ". g:NERDTreeMapPreviewSplit .": preview split\n"
  158. let @h=@h."\" ". g:NERDTreeMapOpenVSplit .": open vsplit\n"
  159. let @h=@h."\" ". g:NERDTreeMapPreviewVSplit .": preview vsplit\n"
  160. let @h=@h."\"\n\" ----------------------------\n"
  161. let @h=@h."\" Directory node mappings~\n"
  162. let @h=@h."\" ". (g:NERDTreeMouseMode ==# 1 ? "double" : "single") ."-click,\n"
  163. let @h=@h."\" ". g:NERDTreeMapActivateNode .": open & close node\n"
  164. let @h=@h."\" ". g:NERDTreeMapOpenRecursively .": recursively open node\n"
  165. let @h=@h."\" ". g:NERDTreeMapCloseDir .": close parent of node\n"
  166. let @h=@h."\" ". g:NERDTreeMapCloseChildren .": close all child nodes of\n"
  167. let @h=@h."\" current node recursively\n"
  168. let @h=@h."\" middle-click,\n"
  169. let @h=@h."\" ". g:NERDTreeMapOpenExpl.": explore selected dir\n"
  170. let @h=@h."\"\n\" ----------------------------\n"
  171. let @h=@h."\" Bookmark table mappings~\n"
  172. let @h=@h."\" double-click,\n"
  173. let @h=@h."\" ". g:NERDTreeMapActivateNode .": open bookmark\n"
  174. let @h=@h."\" ". g:NERDTreeMapOpenInTab.": open in new tab\n"
  175. let @h=@h."\" ". g:NERDTreeMapOpenInTabSilent .": open in new tab silently\n"
  176. let @h=@h."\" ". g:NERDTreeMapDeleteBookmark .": delete bookmark\n"
  177. let @h=@h."\"\n\" ----------------------------\n"
  178. let @h=@h."\" Tree navigation mappings~\n"
  179. let @h=@h."\" ". g:NERDTreeMapJumpRoot .": go to root\n"
  180. let @h=@h."\" ". g:NERDTreeMapJumpParent .": go to parent\n"
  181. let @h=@h."\" ". g:NERDTreeMapJumpFirstChild .": go to first child\n"
  182. let @h=@h."\" ". g:NERDTreeMapJumpLastChild .": go to last child\n"
  183. let @h=@h."\" ". g:NERDTreeMapJumpNextSibling .": go to next sibling\n"
  184. let @h=@h."\" ". g:NERDTreeMapJumpPrevSibling .": go to prev sibling\n"
  185. let @h=@h."\"\n\" ----------------------------\n"
  186. let @h=@h."\" Filesystem mappings~\n"
  187. let @h=@h."\" ". g:NERDTreeMapChangeRoot .": change tree root to the\n"
  188. let @h=@h."\" selected dir\n"
  189. let @h=@h."\" ". g:NERDTreeMapUpdir .": move tree root up a dir\n"
  190. let @h=@h."\" ". g:NERDTreeMapUpdirKeepOpen .": move tree root up a dir\n"
  191. let @h=@h."\" but leave old root open\n"
  192. let @h=@h."\" ". g:NERDTreeMapRefresh .": refresh cursor dir\n"
  193. let @h=@h."\" ". g:NERDTreeMapRefreshRoot .": refresh current root\n"
  194. let @h=@h."\" ". g:NERDTreeMapMenu .": Show menu\n"
  195. let @h=@h."\" ". g:NERDTreeMapChdir .":change the CWD to the\n"
  196. let @h=@h."\" selected dir\n"
  197. let @h=@h."\" ". g:NERDTreeMapCWD .":change tree root to CWD\n"
  198. let @h=@h."\"\n\" ----------------------------\n"
  199. let @h=@h."\" Tree filtering mappings~\n"
  200. let @h=@h."\" ". g:NERDTreeMapToggleHidden .": hidden files (" . (b:NERDTreeShowHidden ? "on" : "off") . ")\n"
  201. let @h=@h."\" ". g:NERDTreeMapToggleFilters .": file filters (" . (b:NERDTreeIgnoreEnabled ? "on" : "off") . ")\n"
  202. let @h=@h."\" ". g:NERDTreeMapToggleFiles .": files (" . (b:NERDTreeShowFiles ? "on" : "off") . ")\n"
  203. let @h=@h."\" ". g:NERDTreeMapToggleBookmarks .": bookmarks (" . (b:NERDTreeShowBookmarks ? "on" : "off") . ")\n"
  204. "add quickhelp entries for each custom key map
  205. let @h=@h."\"\n\" ----------------------------\n"
  206. let @h=@h."\" Custom mappings~\n"
  207. for i in g:NERDTreeKeyMap.All()
  208. if !empty(i.quickhelpText)
  209. let @h=@h."\" ". i.key .": ". i.quickhelpText ."\n"
  210. endif
  211. endfor
  212. let @h=@h."\"\n\" ----------------------------\n"
  213. let @h=@h."\" Other mappings~\n"
  214. let @h=@h."\" ". g:NERDTreeMapQuit .": Close the NERDTree window\n"
  215. let @h=@h."\" ". g:NERDTreeMapToggleZoom .": Zoom (maximize-minimize)\n"
  216. let @h=@h."\" the NERDTree window\n"
  217. let @h=@h."\" ". g:NERDTreeMapHelp .": toggle help\n"
  218. let @h=@h."\"\n\" ----------------------------\n"
  219. let @h=@h."\" Bookmark commands~\n"
  220. let @h=@h."\" :Bookmark [<name>]\n"
  221. let @h=@h."\" :BookmarkToRoot <name>\n"
  222. let @h=@h."\" :RevealBookmark <name>\n"
  223. let @h=@h."\" :OpenBookmark <name>\n"
  224. let @h=@h."\" :ClearBookmarks [<names>]\n"
  225. let @h=@h."\" :ClearAllBookmarks\n"
  226. silent! put h
  227. elseif g:NERDTreeMinimalUI == 0
  228. let @h="\" Press ". g:NERDTreeMapHelp ." for help\n"
  229. silent! put h
  230. endif
  231. let @h = old_h
  232. endfunction
  233. "FUNCTION: nerdtree#echo {{{2
  234. "A wrapper for :echo. Appends 'NERDTree:' on the front of all messages
  235. "
  236. "Args:
  237. "msg: the message to echo
  238. function! nerdtree#echo(msg)
  239. redraw
  240. echomsg "NERDTree: " . a:msg
  241. endfunction
  242. "FUNCTION: nerdtree#echoError {{{2
  243. "Wrapper for nerdtree#echo, sets the message type to errormsg for this message
  244. "Args:
  245. "msg: the message to echo
  246. function! nerdtree#echoError(msg)
  247. echohl errormsg
  248. call nerdtree#echo(a:msg)
  249. echohl normal
  250. endfunction
  251. "FUNCTION: nerdtree#echoWarning {{{2
  252. "Wrapper for nerdtree#echo, sets the message type to warningmsg for this message
  253. "Args:
  254. "msg: the message to echo
  255. function! nerdtree#echoWarning(msg)
  256. echohl warningmsg
  257. call nerdtree#echo(a:msg)
  258. echohl normal
  259. endfunction
  260. "FUNCTION: nerdtree#getTreeWinNum() {{{2
  261. "gets the nerd tree window number for this tab
  262. function! nerdtree#getTreeWinNum()
  263. if exists("t:NERDTreeBufName")
  264. return bufwinnr(t:NERDTreeBufName)
  265. else
  266. return -1
  267. endif
  268. endfunction
  269. "FUNCTION: nerdtree#isTreeOpen() {{{2
  270. function! nerdtree#isTreeOpen()
  271. return nerdtree#getTreeWinNum() != -1
  272. endfunction
  273. "FUNCTION: nerdtree#putCursorOnBookmarkTable(){{{2
  274. "Places the cursor at the top of the bookmarks table
  275. function! nerdtree#putCursorOnBookmarkTable()
  276. if !b:NERDTreeShowBookmarks
  277. throw "NERDTree.IllegalOperationError: cant find bookmark table, bookmarks arent active"
  278. endif
  279. if g:NERDTreeMinimalUI
  280. return cursor(1, 2)
  281. endif
  282. let rootNodeLine = b:NERDTree.ui.getRootLineNum()
  283. let line = 1
  284. while getline(line) !~# '^>-\+Bookmarks-\+$'
  285. let line = line + 1
  286. if line >= rootNodeLine
  287. throw "NERDTree.BookmarkTableNotFoundError: didnt find the bookmarks table"
  288. endif
  289. endwhile
  290. call cursor(line, 2)
  291. endfunction
  292. "FUNCTION: nerdtree#putCursorInTreeWin(){{{2
  293. "Places the cursor in the nerd tree window
  294. function! nerdtree#putCursorInTreeWin()
  295. if !nerdtree#isTreeOpen()
  296. throw "NERDTree.InvalidOperationError: cant put cursor in NERD tree window, no window exists"
  297. endif
  298. call nerdtree#exec(nerdtree#getTreeWinNum() . "wincmd w")
  299. endfunction
  300. "FUNCTION: nerdtree#renderBookmarks {{{2
  301. function! nerdtree#renderBookmarks()
  302. if g:NERDTreeMinimalUI == 0
  303. call setline(line(".")+1, ">----------Bookmarks----------")
  304. call cursor(line(".")+1, col("."))
  305. endif
  306. for i in g:NERDTreeBookmark.Bookmarks()
  307. call setline(line(".")+1, i.str())
  308. call cursor(line(".")+1, col("."))
  309. endfor
  310. call setline(line(".")+1, '')
  311. call cursor(line(".")+1, col("."))
  312. endfunction
  313. "FUNCTION: nerdtree#renderView {{{2
  314. function! nerdtree#renderView()
  315. call b:NERDTree.render()
  316. endfunction
  317. "
  318. "FUNCTION: nerdtree#stripMarkupFromLine(line, removeLeadingSpaces){{{2
  319. "returns the given line with all the tree parts stripped off
  320. "
  321. "Args:
  322. "line: the subject line
  323. "removeLeadingSpaces: 1 if leading spaces are to be removed (leading spaces =
  324. "any spaces before the actual text of the node)
  325. function! nerdtree#stripMarkupFromLine(line, removeLeadingSpaces)
  326. let line = a:line
  327. "remove the tree parts and the leading space
  328. let line = substitute (line, nerdtree#treeMarkupReg(),"","")
  329. "strip off any read only flag
  330. let line = substitute (line, ' \[RO\]', "","")
  331. "strip off any bookmark flags
  332. let line = substitute (line, ' {[^}]*}', "","")
  333. "strip off any executable flags
  334. let line = substitute (line, '*\ze\($\| \)', "","")
  335. "strip off any generic flags
  336. let line = substitute (line, '\[[^]]*\]', "","")
  337. let wasdir = 0
  338. if line =~# '/$'
  339. let wasdir = 1
  340. endif
  341. let line = substitute (line,' -> .*',"","") " remove link to
  342. if wasdir ==# 1
  343. let line = substitute (line, '/\?$', '/', "")
  344. endif
  345. if a:removeLeadingSpaces
  346. let line = substitute (line, '^ *', '', '')
  347. endif
  348. return line
  349. endfunction
  350. " vim: set sw=4 sts=4 et fdm=marker: