nerdtree

A tree explorer plugin for vim.
Index Commits Files Refs
commit a7886fb6c468afbfabb8b8daf300022f1cee2401
parent 82b1649f2e1c79ff17730fe0a3750bbec203dd29
Author: Alejandro Sanchez <asflin@gmx.de>
Date:   Sun, 15 Dec 2019 02:25:17 +0100

Allow use of function references as callbacks (#1067)


Diffstat:
MCHANGELOG.md | 2++
Mdoc/NERDTree.txt | 4++++
Mlib/nerdtree/key_map.vim | 2+-
Mlib/nerdtree/menu_item.vim | 8++++++--
Mlib/nerdtree/notifier.vim | 5+++--
Mlib/nerdtree/path.vim | 5+++--
6 files changed, 19 insertions(+), 7 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
@@ -7,6 +7,8 @@
     in an unordered list.  The format is:
         - **.PATCH**: Pull Request Title (PR Author) [PR Number](Link to PR)
 -->
+#### 6.4
+- **.0**: Allow use of function references as callbacks (HiPhish) [#1067](https://github.com/scrooloose/nerdtree/pull/1067)
 #### 6.3
 - **.0**: Add new command that behaves like NERDTreeToggle but defaults to the root of a VCS repository. (willfindlay) [#1060](https://github.com/scrooloose/nerdtree/pull/1060)
 #### 6.2
diff --git a/doc/NERDTree.txt b/doc/NERDTree.txt
@@ -1315,6 +1315,10 @@ following code conventions are used:
 See this blog post for more details:
  http://got-ravings.blogspot.com/2008/09/vim-pr0n-prototype-based-objects.html
 
+A number of API functions take a callback argument to call. The callback can
+be either a string with the name of a function to call, or a |Funcref| object
+which will be called directly.
+
 ------------------------------------------------------------------------------
 4.1. Key map API                                             *NERDTreeKeymapAPI*
 
diff --git a/lib/nerdtree/key_map.vim b/lib/nerdtree/key_map.vim
@@ -66,7 +66,7 @@ endfunction
 "FUNCTION: KeyMap.invoke() {{{1
 "Call the KeyMaps callback function
 function! s:KeyMap.invoke(...)
-    let Callback = function(self.callback)
+    let Callback = type(self.callback) == v:t_func ? self.callback : function(self.callback)
     if a:0
         call Callback(a:1)
     else
diff --git a/lib/nerdtree/menu_item.vim b/lib/nerdtree/menu_item.vim
@@ -79,7 +79,7 @@ endfunction
 "specified
 function! s:MenuItem.enabled()
     if self.isActiveCallback != -1
-        return {self.isActiveCallback}()
+        return type(self.isActiveCallback) == v:t_func ? self.isActiveCallback() : {self.isActiveCallback}()
     endif
     return 1
 endfunction
@@ -94,7 +94,11 @@ function! s:MenuItem.execute()
         call mc.showMenu()
     else
         if self.callback != -1
-            call {self.callback}()
+            if type(self.callback) == v:t_func
+                call self.callback()
+            else
+                call {self.callback}()
+            endif
         endif
     endif
 endfunction
diff --git a/lib/nerdtree/notifier.vim b/lib/nerdtree/notifier.vim
@@ -14,8 +14,9 @@ endfunction
 function! s:Notifier.NotifyListeners(event, path, nerdtree, params)
     let event = g:NERDTreeEvent.New(a:nerdtree, a:path, a:event, a:params)
 
-    for listener in s:Notifier.GetListenersForEvent(a:event)
-        call {listener}(event)
+    for Listener in s:Notifier.GetListenersForEvent(a:event)
+        let Callback = type(Listener) == v:t_func ? Listener : function(Listener)
+        call Callback(event)
     endfor
 endfunction
 
diff --git a/lib/nerdtree/path.vim b/lib/nerdtree/path.vim
@@ -500,8 +500,9 @@ function! s:Path.ignore(nerdtree)
             endif
         endfor
 
-        for callback in g:NERDTree.PathFilters()
-            if {callback}({'path': self, 'nerdtree': a:nerdtree})
+        for Callback in g:NERDTree.PathFilters()
+            let Callback = type(Callback) == v:t_func ? Callback : function(Callback)
+            if Callback({'path': self, 'nerdtree': a:nerdtree})
                 return 1
             endif
         endfor