aboutsummaryrefslogtreecommitdiff
path: root/vim/bundle/vim-addon-mw-utils/autoload/funcref.vim
diff options
context:
space:
mode:
Diffstat (limited to 'vim/bundle/vim-addon-mw-utils/autoload/funcref.vim')
-rw-r--r--vim/bundle/vim-addon-mw-utils/autoload/funcref.vim95
1 files changed, 95 insertions, 0 deletions
diff --git a/vim/bundle/vim-addon-mw-utils/autoload/funcref.vim b/vim/bundle/vim-addon-mw-utils/autoload/funcref.vim
new file mode 100644
index 0000000..20eec54
--- /dev/null
+++ b/vim/bundle/vim-addon-mw-utils/autoload/funcref.vim
@@ -0,0 +1,95 @@
+" funcref.vim
+" @License: GPL (see http://www.gnu.org/licenses/gpl.txt)
+" @Last Change: 2010-01-03.
+" @Revision: 0.1.0
+
+" documentation see doc/funcref.txt
+
+" usage:
+" funcref#Function("filename#Function")
+" optionally pass arguments:
+" funcref#Function("filename#Function",{'args': [2]})
+" optionally define self:
+" funcref#Function("filename#Function",{'self': object})
+function! funcref#Function(name,...)
+ let d = a:0 > 0 ? a:1 : {}
+ let d['faked_function_reference'] = a:name
+ return d
+endfunction
+
+" args : same as used for call(f,[args], self)
+" f must be either
+" - a string which can be evaled (use "return 'value'" to return a value)
+" - a Vim function reference created by function('..')
+" - a faked function reference created by funcref#Function(..)
+"
+" the last "self" argument can be overriden by the function reference
+" You can pass arguments in a closure like style
+function! funcref#Call(...)
+ let args = copy(a:000)
+
+ " add parameters:
+ if (len(args) < 2)
+ call add(args, [])
+ endif
+
+
+ let isDict = type(args[0]) == type({})
+
+ " prepend parameters which were passed by faked function reference:
+ if isDict && has_key(args[0], 'args')
+ let args[1] = args[0]['args']+args[1]
+ endif
+
+ " always pass self. this way you can call functions from dictionaries not
+ " refering to self
+ if (len(args) < 3)
+ call add(args, {})
+ endif
+
+ " the funcref overrides self:
+ if isDict && has_key(args[0], 'self')
+ let args[2] = args[0]['self']
+ endif
+
+ if type(a:1) == 2
+ " funcref: function must have been laoded
+ return call(function('call'), args)
+ elseif isDict && has_key(args[0], 'faked_function_reference')
+ let Fun = args[0]['faked_function_reference']
+ if type(Fun) == type('')
+ \ && (Fun[:len('return ')-1] == 'return '
+ \ || Fun[:len('call ')-1] == 'call '
+ \ || Fun[:len('if ')-1] == 'if '
+ \ || Fun[:len('let ')-1] == 'let '
+ \ || Fun[:len('echo ')-1] == 'echo '
+ \ || Fun[:len('exec ')-1] == 'exec '
+ \ || Fun[:len('debug ')-1] == 'debug ')
+ " it doesn't make sense to list all vim commands here
+ " So if you want to execute another action consider using
+ " funcref#Function('exec '.string('aw')) or such
+
+ " function is a String, call exec
+ let ARGS = args[1]
+ let SELF = args[2]
+ exec Fun
+ else
+ " pseudo function, let's load it..
+ if type(Fun) == 1
+ if !exists('*'.Fun)
+ " lazily load function
+ let file = substitute(substitute(Fun,'#[^#]*$','',''),'#','/','g')
+ exec 'runtime /autoload/'.file.'.vim'
+ endif
+ let Fun2 = function(Fun)
+ else
+ let Fun2 = Fun
+ endif
+ let args[0] = Fun
+ return call(function('call'), args)
+ endif
+ else
+ " no function, return the value
+ return args[0]
+ endif
+endfunction