VimL/Vimscript:如何从外部函数的内部函数访问外部函数的局部变量?

VimL/Vimscript:如何从外部函数的内部函数访问外部函数的局部变量?,vim,scope,closures,scoping,Vim,Scope,Closures,Scoping,我具有以下形式的功能: function! s:my_function(dict_arg) let darg = copy(a:dict_arg) func! my_inner_func(cond) if a:cond ==# 'a' execute darg.a elseif a:cond ==# 'b' execute darg.b elseif a:cond ==# 'c'

我具有以下形式的功能:

function! s:my_function(dict_arg)
    let darg = copy(a:dict_arg)

    func! my_inner_func(cond)
        if a:cond ==# 'a'
            execute darg.a
        elseif a:cond ==# 'b'
            execute darg.b
        elseif a:cond ==# 'c'
            execute darg.c
        endif
    endfunc

    return function('my_inner_func')
endfunc
其中,传递给dict_arg参数的参数将是一些用a、b和c键控的dict,它们各自的值是表示将根据特定条件执行的Ex命令的字符串

外部函数s:my_函数的目的是生成一个Funcref,该函数将根据cond执行相应的Ex命令darg.a、darg.b或darg.c,cond本身由其他变量确定

所以我的问题是,我不知道如何从我的内部函数中引用在s:my_函数范围内定义的局部变量darg。调用函数时,我得到错误E121:Undefined变量:darg。如果我不定义局部变量darg,而只是尝试执行a:dict_arg.b,它也不会产生相同的错误

我可以通过将darg定义为全局的方法来解决这个问题,比如让g:darg=copya:dict_arg,然后执行g:darg.a。当然,我想避免这种情况

在类似Python的东西中,这种类型的词法范围解析是自动的。但是维姆很好。。维姆。任何帮助或指点都将不胜感激

在类似Python的东西中,这种类型的词法范围解析是自动的

在VimScript中,除了lambdas,它是手动的。您必须显式添加closure关键字:

外部函数s:my_函数的目的是生成一个Funcref,该函数将根据cond执行相应的Ex命令darg.a、darg.b或darg.c,cond本身由其他变量确定

依我看,最好是使用局部搜索

function! InnerFunc(foo, bar, baz)
    ...
endfunction
...
let OuterFunc = function('InnerFunc', ["FOO", "BAR"])
call OuterFunc("BAZ")
在类似Python的东西中,这种类型的词法范围解析是自动的

在VimScript中,除了lambdas,它是手动的。您必须显式添加closure关键字:

外部函数s:my_函数的目的是生成一个Funcref,该函数将根据cond执行相应的Ex命令darg.a、darg.b或darg.c,cond本身由其他变量确定

依我看,最好是使用局部搜索

function! InnerFunc(foo, bar, baz)
    ...
endfunction
...
let OuterFunc = function('InnerFunc', ["FOO", "BAR"])
call OuterFunc("BAZ")