PageRenderTime 46ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 1ms

/etc/vim/bundle/vim-devicons/nerdtree_plugin/webdevicons.vim

https://github.com/pope/personal
Vim Script | 389 lines | 266 code | 52 blank | 71 comment | 57 complexity | 216abef109ddf31a3c5cd18ab81744fd MD5 | raw file
Possible License(s): LGPL-2.1, GPL-3.0, AGPL-3.0, GPL-2.0, MIT, BSD-3-Clause, WTFPL, Unlicense
  1. " Version: 0.11.0
  2. " Webpage: https://github.com/ryanoasis/vim-devicons
  3. " Maintainer: Ryan McIntyre <ryanoasis@gmail.com>
  4. " License: see LICENSE
  5. " @todo fix duplicate global variable initialize here:
  6. if !exists('g:webdevicons_enable')
  7. let g:webdevicons_enable = 1
  8. endif
  9. if !exists('g:webdevicons_enable_nerdtree')
  10. let g:webdevicons_enable_nerdtree = 1
  11. endif
  12. if !exists('g:DevIconsEnableFoldersOpenClose')
  13. let g:DevIconsEnableFoldersOpenClose = 0
  14. endif
  15. if !exists('g:DevIconsEnableFolderPatternMatching')
  16. let g:DevIconsEnableFolderPatternMatching = 1
  17. endif
  18. if !exists('g:DevIconsEnableFolderExtensionPatternMatching')
  19. let g:DevIconsEnableFolderExtensionPatternMatching = 0
  20. endif
  21. " end @todo duplicate global variables
  22. " Temporary (hopefully) fix for glyph issues in gvim (proper fix is with the
  23. " actual font patcher)
  24. if !exists('g:webdevicons_gui_glyph_fix')
  25. if has('gui_running')
  26. let g:webdevicons_gui_glyph_fix = 1
  27. else
  28. let g:webdevicons_gui_glyph_fix = 0
  29. endif
  30. endif
  31. if !exists('g:DevIconsEnableNERDTreeRedraw')
  32. if has('gui_running')
  33. let g:DevIconsEnableNERDTreeRedraw = 1
  34. else
  35. let g:DevIconsEnableNERDTreeRedraw = 0
  36. endif
  37. endif
  38. if g:webdevicons_enable_nerdtree == 1
  39. if !exists('g:loaded_nerd_tree')
  40. echohl WarningMsg |
  41. \ echomsg 'vim-webdevicons requires NERDTree to be loaded before vim-webdevicons.'
  42. endif
  43. if exists('g:loaded_nerd_tree') && g:loaded_nerd_tree == 1 && !exists('g:NERDTreePathNotifier')
  44. let g:webdevicons_enable_nerdtree = 0
  45. echohl WarningMsg |
  46. \ echomsg 'vim-webdevicons requires a newer version of NERDTree to show glyphs in NERDTree - consider updating NERDTree.'
  47. endif
  48. " @todo I don't even want this to execute UNLESS the user has the
  49. " 'nerdtree-git-plugin' INSTALLED (not LOADED)
  50. " As it currently functions this warning will display even if the user does
  51. " not have nerdtree-git-plugin not just if it isn't loaded yet
  52. " (not what we want)
  53. "if !exists('g:loaded_nerdtree_git_status')
  54. " echohl WarningMsg |
  55. " \ echomsg 'vim-webdevicons works better when 'nerdtree-git-plugin' is loaded before vim-webdevicons (small refresh issues otherwise).'
  56. "endif
  57. endif
  58. if !exists('g:webdevicons_enable_airline_tabline')
  59. let g:webdevicons_enable_airline_tabline = 1
  60. endif
  61. if !exists('g:webdevicons_enable_airline_statusline')
  62. let g:webdevicons_enable_airline_statusline = 1
  63. endif
  64. function! s:SetupListeners()
  65. call g:NERDTreePathNotifier.AddListener('init', 'NERDTreeWebDevIconsRefreshListener')
  66. call g:NERDTreePathNotifier.AddListener('refresh', 'NERDTreeWebDevIconsRefreshListener')
  67. call g:NERDTreePathNotifier.AddListener('refreshFlags', 'NERDTreeWebDevIconsRefreshListener')
  68. endfunction
  69. " util like helpers
  70. " scope: local
  71. function! s:Refresh()
  72. call b:NERDTree.root.refreshFlags()
  73. call NERDTreeRender()
  74. endfunction
  75. " Temporary (hopefully) fix for glyph issues in gvim (proper fix is with the
  76. " actual font patcher)
  77. " NERDTree-C
  78. " scope: global
  79. function! WebDevIconsNERDTreeChangeRootHandler(node)
  80. call b:NERDTree.changeRoot(a:node)
  81. call NERDTreeRender()
  82. call a:node.putCursorHere(0, 0)
  83. if g:DevIconsEnableNERDTreeRedraw ==# 1
  84. redraw!
  85. endif
  86. endfunction
  87. " NERDTree-u
  88. " scope: global
  89. function! WebDevIconsNERDTreeUpDirCurrentRootClosedHandler()
  90. call nerdtree#ui_glue#upDir(0)
  91. if g:DevIconsEnableNERDTreeRedraw ==# 1
  92. redraw!
  93. endif
  94. endfunction
  95. function! WebDevIconsNERDTreeDirUpdateFlags(node, glyph)
  96. let path = a:node.path
  97. let isOpen = a:node.isOpen
  98. let postPadding = g:WebDevIconsNerdTreeAfterGlyphPadding
  99. let prePadding = g:WebDevIconsNerdTreeBeforeGlyphPadding
  100. let hasGitFlags = (len(path.flagSet._flagsForScope('git')) > 0)
  101. let hasGitNerdTreePlugin = (exists('g:loaded_nerdtree_git_status') == 1)
  102. let collapsesToSameLine = (exists('g:NERDTreeCascadeSingleChildDir') == 1)
  103. let dirHasOnlyOneChildDir = 0
  104. if collapsesToSameLine
  105. " need to call to determin children:
  106. call a:node._initChildren(1)
  107. let dirHasOnlyOneChildDir = (a:node.getChildCount() ==# 1 && a:node.children[0].path.isDirectory)
  108. endif
  109. " properly set collapsed/combined directory display to opened glyph
  110. if collapsesToSameLine && dirHasOnlyOneChildDir
  111. call WebDevIconsNERDTreeDirOpen(a:node.children[0])
  112. endif
  113. " align vertically at the same level: non git-flag nodes with git-flag nodes
  114. if g:WebDevIconsNerdTreeGitPluginForceVAlign && !hasGitFlags && hasGitNerdTreePlugin
  115. let prePadding .= ' '
  116. endif
  117. let flag = prePadding . a:glyph . postPadding
  118. call a:node.path.flagSet.clearFlags('webdevicons')
  119. if flag !=? ''
  120. call a:node.path.flagSet.addFlag('webdevicons', flag)
  121. "echom "added flag of " . flag
  122. call a:node.path.refreshFlags(b:NERDTree)
  123. "echom "flagset is now " . string(a:node.path.flagSet)
  124. endif
  125. endfunction
  126. function! WebDevIconsNERDTreeDirClose(node)
  127. let a:node.path.isOpen = 0
  128. let glyph = g:WebDevIconsUnicodeDecorateFolderNodesDefaultSymbol
  129. call WebDevIconsNERDTreeDirUpdateFlags(a:node, glyph)
  130. endfunction
  131. function! WebDevIconsNERDTreeDirOpen(node)
  132. let a:node.path.isOpen = 1
  133. let glyph = g:DevIconsDefaultFolderOpenSymbol
  134. call WebDevIconsNERDTreeDirUpdateFlags(a:node, glyph)
  135. endfunction
  136. function! WebDevIconsNERDTreeDirOpenRecursively(node)
  137. call WebDevIconsNERDTreeDirOpen(a:node)
  138. for i in a:node.children
  139. if i.path.isDirectory ==# 1
  140. call WebDevIconsNERDTreeDirOpenRecursively(i)
  141. endif
  142. endfor
  143. endfunction
  144. function! WebDevIconsNERDTreeDirCloseRecursively(node)
  145. call WebDevIconsNERDTreeDirClose(a:node)
  146. for i in a:node.children
  147. if i.path.isDirectory ==# 1
  148. call WebDevIconsNERDTreeDirCloseRecursively(i)
  149. endif
  150. endfor
  151. endfunction
  152. function! WebDevIconsNERDTreeDirCloseChildren(node)
  153. for i in a:node.children
  154. if i.path.isDirectory ==# 1
  155. call WebDevIconsNERDTreeDirClose(i)
  156. endif
  157. endfor
  158. endfunction
  159. " NERDTreeMapActivateNode and <2-LeftMouse>
  160. " handle the user activating a tree node
  161. " scope: global
  162. function! WebDevIconsNERDTreeMapActivateNode(node)
  163. let isOpen = a:node.isOpen
  164. if isOpen
  165. let glyph = g:WebDevIconsUnicodeDecorateFolderNodesDefaultSymbol
  166. else
  167. let glyph = g:DevIconsDefaultFolderOpenSymbol
  168. endif
  169. let a:node.path.isOpen = !isOpen
  170. call WebDevIconsNERDTreeDirUpdateFlags(a:node, glyph)
  171. " continue with normal activate logic
  172. call a:node.activate()
  173. " glyph change possible artifact clean-up
  174. if g:DevIconsEnableNERDTreeRedraw ==# 1
  175. redraw!
  176. endif
  177. endfunction
  178. " NERDTreeMapActivateNodeSingleMode
  179. " handle the user activating a tree node if NERDTreeMouseMode is setted to 3
  180. " scope: global
  181. function! WebDevIconsNERDTreeMapActivateNodeSingleMode(node)
  182. if g:NERDTreeMouseMode == 3
  183. let isOpen = a:node.isOpen
  184. if isOpen
  185. let glyph = g:WebDevIconsUnicodeDecorateFolderNodesDefaultSymbol
  186. else
  187. let glyph = g:DevIconsDefaultFolderOpenSymbol
  188. endif
  189. let a:node.path.isOpen = !isOpen
  190. call WebDevIconsNERDTreeDirUpdateFlags(a:node, glyph)
  191. " continue with normal activate logic
  192. call a:node.activate()
  193. " glyph change possible artifact clean-up
  194. if g:DevIconsEnableNERDTreeRedraw ==# 1
  195. redraw!
  196. endif
  197. endif
  198. endfunction
  199. function! WebDevIconsNERDTreeMapOpenRecursively(node)
  200. " normal original logic:
  201. call nerdtree#echo('Recursively opening node. Please wait...')
  202. call WebDevIconsNERDTreeDirOpenRecursively(a:node)
  203. call a:node.openRecursively()
  204. " continue with normal original logic:
  205. call b:NERDTree.render()
  206. " glyph change possible artifact clean-up
  207. if g:DevIconsEnableNERDTreeRedraw ==# 1
  208. redraw!
  209. endif
  210. call nerdtree#echo('Recursively opening node. Please wait... DONE')
  211. endfunction
  212. function! WebDevIconsNERDTreeMapCloseChildren(node)
  213. " close children but not current node:
  214. call WebDevIconsNERDTreeDirCloseChildren(a:node)
  215. " continue with normal original logic:
  216. call a:node.closeChildren()
  217. call b:NERDTree.render()
  218. call a:node.putCursorHere(0, 0)
  219. " glyph change possible artifact clean-up
  220. if g:DevIconsEnableNERDTreeRedraw ==# 1
  221. redraw!
  222. endif
  223. endfunction
  224. function! WebDevIconsNERDTreeMapCloseDir(node)
  225. " continue with normal original logic:
  226. let parent = a:node.parent
  227. while g:NERDTreeCascadeOpenSingleChildDir && !parent.isRoot()
  228. let childNodes = parent.getVisibleChildren()
  229. if len(childNodes) == 1 && childNodes[0].path.isDirectory
  230. let parent = parent.parent
  231. else
  232. break
  233. endif
  234. endwhile
  235. if parent ==# {} || parent.isRoot()
  236. call nerdtree#echo('cannot close tree root')
  237. else
  238. call parent.close()
  239. " update the glyph
  240. call WebDevIconsNERDTreeDirClose(parent)
  241. call b:NERDTree.render()
  242. call parent.putCursorHere(0, 0)
  243. " glyph change possible artifact clean-up
  244. if g:DevIconsEnableNERDTreeRedraw ==# 1
  245. redraw!
  246. endif
  247. endif
  248. endfunction
  249. function! WebDevIconsNERDTreeMapUpdirKeepOpen()
  250. call WebDevIconsNERDTreeDirOpen(b:NERDTree.root)
  251. " continue with normal logic:
  252. call nerdtree#ui_glue#upDir(1)
  253. call s:Refresh()
  254. " glyph change possible artifact clean-up
  255. if g:DevIconsEnableNERDTreeRedraw ==# 1
  256. redraw!
  257. endif
  258. endfunction
  259. if g:webdevicons_enable == 1 && g:webdevicons_enable_nerdtree == 1
  260. call s:SetupListeners()
  261. if g:DevIconsEnableFoldersOpenClose
  262. " These overrides are needed because we cannot
  263. " simply use AddListener for reliably updating
  264. " the folder open/close glyphs because the event
  265. " path has no access to the 'isOpen' property
  266. " some of these are a little more brittle/fragile
  267. " than others
  268. " TODO FIXME better way to reliably update
  269. " open/close glyphs in NERDTreeWebDevIconsRefreshListener
  270. " NERDTreeMapActivateNode
  271. call NERDTreeAddKeyMap({
  272. \ 'key': g:NERDTreeMapActivateNode,
  273. \ 'callback': 'WebDevIconsNERDTreeMapActivateNode',
  274. \ 'override': 1,
  275. \ 'scope': 'DirNode' })
  276. " NERDTreeMapCustomOpen
  277. call NERDTreeAddKeyMap({
  278. \ 'key': g:NERDTreeMapCustomOpen,
  279. \ 'callback': 'WebDevIconsNERDTreeMapActivateNode',
  280. \ 'override': 1,
  281. \ 'scope': 'DirNode' })
  282. " NERDTreeMapOpenRecursively
  283. call NERDTreeAddKeyMap({
  284. \ 'key': g:NERDTreeMapOpenRecursively,
  285. \ 'callback': 'WebDevIconsNERDTreeMapOpenRecursively',
  286. \ 'override': 1,
  287. \ 'scope': 'DirNode' })
  288. " NERDTreeMapCloseChildren
  289. call NERDTreeAddKeyMap({
  290. \ 'key': g:NERDTreeMapCloseChildren,
  291. \ 'callback': 'WebDevIconsNERDTreeMapCloseChildren',
  292. \ 'override': 1,
  293. \ 'scope': 'DirNode' })
  294. " NERDTreeMapCloseChildren
  295. call NERDTreeAddKeyMap({
  296. \ 'key': g:NERDTreeMapCloseDir,
  297. \ 'callback': 'WebDevIconsNERDTreeMapCloseDir',
  298. \ 'override': 1,
  299. \ 'scope': 'Node' })
  300. " <2-LeftMouse>
  301. call NERDTreeAddKeyMap({
  302. \ 'key': '<2-LeftMouse>',
  303. \ 'callback': 'WebDevIconsNERDTreeMapActivateNode',
  304. \ 'override': 1,
  305. \ 'scope': 'DirNode' })
  306. " <LeftRelease>
  307. call NERDTreeAddKeyMap({
  308. \ 'key': '<LeftRelease>',
  309. \ 'callback': 'WebDevIconsNERDTreeMapActivateNodeSingleMode',
  310. \ 'override': 1,
  311. \ 'scope': 'DirNode' })
  312. " NERDTreeMapUpdirKeepOpen
  313. call NERDTreeAddKeyMap({
  314. \ 'key': g:NERDTreeMapUpdirKeepOpen,
  315. \ 'callback': 'WebDevIconsNERDTreeMapUpdirKeepOpen',
  316. \ 'override': 1,
  317. \ 'scope': 'all' })
  318. endif
  319. " Temporary (hopefully) fix for glyph issues in gvim (proper fix is with the
  320. " actual font patcher)
  321. if g:webdevicons_gui_glyph_fix ==# 1
  322. call NERDTreeAddKeyMap({
  323. \ 'key': g:NERDTreeMapChangeRoot,
  324. \ 'callback': 'WebDevIconsNERDTreeChangeRootHandler',
  325. \ 'override': 1,
  326. \ 'quickhelpText': "change tree root to the\n\" selected dir\n\" plus devicons redraw\n\" hack fix",
  327. \ 'scope': 'Node' })
  328. call NERDTreeAddKeyMap({
  329. \ 'key': g:NERDTreeMapUpdir,
  330. \ 'callback': 'WebDevIconsNERDTreeUpDirCurrentRootClosedHandler',
  331. \ 'override': 1,
  332. \ 'quickhelpText': "move tree root up a dir\n\" plus devicons redraw\n\" hack fix",
  333. \ 'scope': 'all' })
  334. endif
  335. endif
  336. " modeline syntax:
  337. " vim: fdm=marker tabstop=2 softtabstop=2 shiftwidth=2 expandtab: