Function vim中的子功能

Function vim中的子功能,function,vim,Function,Vim,我在menu.vim中创建了很多函数 我注意到在许多函数中使用相同的代码,这就是为什么我决定使用 子功能 p、 这是我的函数中经常返回的代码: let zoek = @/ if a:type == "'<,'>" let r = substitute(zoek, '\\%V', '', 'g') elseif a:type == "%" let r = zoek endif let a = substitute(r, '\', '

我在menu.vim中创建了很多函数

我注意到在许多函数中使用相同的代码,这就是为什么我决定使用 子功能

p、 这是我的函数中经常返回的代码:

let zoek = @/    
if a:type == "'<,'>"    
 let r = substitute(zoek, '\\%V', '', 'g')    
elseif a:type == "%"    
 let r = zoek    
endif    

let a = substitute(r, '\', '', 'g')      

if matchstr(d, '>') == '>' || matchstr(d, '<') == '<'     
 let e = substitute(d, '\zs>\(\d\+\)%<\ze', '\1-', 'g')     
endif
let zoek=@/

如果a:type=“''='>”| | matchstr(d,在Vimscript中只有一种类型的函数,但我不确定这是否是您在menu.vim中已经使用的函数。用户定义的函数是这样定义的:

    function! MyNewFunction()
        " your code here
    endfunction
然后,您可以使用

或者使用

    let my_variable = MyNewFunction()
当然,这是一个极其简单的概述,因为您说您已经在使用函数。更多信息,包括变量的使用,请参见:

    help user-functions

如果我没有回答您的问题,很抱歉。

Vimscript中只有一种类型的函数,但我不确定这是否是您在menu.vim中已经使用的函数。用户定义的函数定义如下:

    function! MyNewFunction()
        " your code here
    endfunction
然后,您可以使用

或者使用

    let my_variable = MyNewFunction()
当然,这是一个极其简单的概述,因为您说您已经在使用函数。更多信息,包括变量的使用,请参见:

    help user-functions

如果我没有回答您的问题,很抱歉。

您可以通过在字典中定义«local»函数来实现它们:在以下代码中

function MyFunc()
    let d={}
    function d.function()
        echo "Foo"
    endfunction
    call d.function()
endfunction
函数
d.function
只能在s:MyFunc内部访问,并在s:MyFunc退出后被销毁。我将«local»放在引号中,因为
d.function
实际上是名为
42
的全局函数(或者其他数字,这无关紧要)。没有对它的引用就不能调用它,创建引用的唯一方法是使用
函数dict.key()
(创建后可以复制引用,但不能使用调用
函数()
,尽管
MyFunc
函数(“MyFunc”)
)创建引用。请注意(在本例中为42)在每次创建函数时递增,我既不知道最大值是多少,也不知道达到最大值时会发生什么。我个人使用字典函数,因为它们还有两个其他优点:

  • 如果没有调试器或显式地将函数引用(可能作为其容器的一部分)传递到某处,则无法访问脚本本地字典中定义的字典函数
  • 如果在一个字典中定义了多个函数来清除它们,那么您只需要取消设置这个字典。对于重新加载插件很有用

  • 您可以通过在字典中定义«local»函数:在以下代码中

    function MyFunc()
        let d={}
        function d.function()
            echo "Foo"
        endfunction
        call d.function()
    endfunction
    
    函数
    d.function
    只能在s:MyFunc内部访问,并在s:MyFunc退出后被销毁。我将«local»放在引号中,因为
    d.function
    实际上是名为
    42
    的全局函数(或者其他数字,这无关紧要)。没有对它的引用就不能调用它,创建引用的唯一方法是使用
    函数dict.key()
    (创建后可以复制引用,但不能使用调用
    函数()
    ,尽管
    MyFunc
    函数(“MyFunc”)
    )创建引用。请注意(在本例中为42)在每次创建函数时递增,我既不知道最大值是多少,也不知道达到最大值时会发生什么。我个人使用字典函数,因为它们还有两个其他优点:

  • 如果没有调试器或显式地将函数引用(可能作为其容器的一部分)传递到某处,则无法访问脚本本地字典中定义的字典函数
  • 如果在一个字典中定义了多个函数来清除它们,那么您只需要取消设置这个字典。对于重新加载插件很有用

  • 谢谢,是否也可以使用g:变量从子函数导入值并在函数末尾将其取消设置,或者是否可以取消g:变量的设置?@remann。这两个问题都是肯定的,但为什么不能只返回需要导入的值?//即使不能,也尽量不要污染全局范围,使用
    s:variable
    。///还有一个提示:在函数内部有一个包含所有函数局部变量的
    l:
    字典。您可以将其传递给子函数,并以某种方式对其进行修改。您能否举例说明如何将列表作为l:list传递给子函数(实际函数外部)以及如何在函数中再次导入它?我在许多函数中使用列表“listlines”,但在它不起作用之前没有g:。@remann您可以使用
    函数d.subf(list)\n<在此处使用a:list做些什么>\n endfunction\n调用d.subf(g:listlines)
    。您可以使用
    函数d.subf(l)\n\n enfunction\n call d.subf(l:)
    将变量添加到函数的局部(
    l:
    )范围,在调用变量的地方不能将变量添加到函数的局部(
    l:
    )范围,您只能将变量定义为函数参数(
    a:
    )。如果没有
    g:
    ,它将无法工作,因为脚本内部的默认范围是
    g:
    ,但函数内部的默认范围是
    l:
    。谢谢,是否也可以使用g:变量从子函数导入值并在函数末尾将其取消设置,或者是否可以取消设置g:变量?@remann。在这两个问题上都是,但为什么不能只返回需要导入的值?//即使不能,也不要污染全局范围,使用
    s:variable
    ////还有一个提示:在函数内部有一个
    l:
    字典,其中包含所有函数局部变量。您可以将其传递给subfunct