如何退出一系列功能?

时间:2015-12-04 18:15:28

标签: function vim return

我有一些我通过这个命令调用的函数:

Function DoThisOrThat()
 let mysubs="function1,function3"
 exe 'call SUB_Dispatch("'.mysubs.'")'
 do this or that
Endfunction    

 function! SUB_Dispatch(list_subs)   
     let mysubs = split(a:list_subs, ',') 

     if index(mysubs, "function1") != "-1"   
       exe 'call Sub_Function1()'
     endif
     if index(mysubs, "function2") != "-1"   
       exe 'call Sub_Function2()'
     endif
     if index(mysubs, "function3") != "-1"   
       exe 'call Sub_Function3()'
     endif
etc..
 endfunction

在Function1,2和3中有if / else语句,如:

If ....
  do this
else
  return
endif

如果调用Sub_Function1中的return命令,它仍然会继续执行其他功能。

如果有return

,是否有命令停止执行vim所有命令?

2 个答案:

答案 0 :(得分:3)

您可以为子功能指定返回值,如下所示:

if ...
    do this
    return 1
else
    return 0
endif

然后,在SUB_Dispatch()函数中,您可以对返回码进行测试,例如,替换以下内容:

if index(mysubs, "function1") != "-1"   
    exe 'call Sub_Function1()'
endif

由:

if index(mysubs, "function1") != -1
    if Sub_Function1() == 0
        return
    endif
endif

或者,以更快的方式:

if index(mysubs, "function1") != -1 && !Sub_Function1()
    return
endif

顺便说一下,在你的情况下添加exe命令没用。您可以使用:

call SUB_Dispatch(mysubs)

而不是:

exe 'call SUB_Dispatch("'.mysubs.'")'

实际上,你也可以用更清洁的方式执行这类工作,例如:

function! DoThisOrThat()
    let mysubs = ['Sub_Function1', 'Sub_Function2']
    call SUB_Dispatch(mysubs)
endf


function! SUB_Dispatch(list_subs)
    for f in a:list_subs
        if !eval(f.'()')
            return
        endif
    endfor
endf

答案 1 :(得分:2)

我应该在else中抛出异常并将try catch放在第一个函数中。我不熟悉你所说的语言,但我希望它会给你一些线索。