Function vim中的子功能
我在menu.vim中创建了很多函数 我注意到在许多函数中使用相同的代码,这就是为什么我决定使用 子功能 p、 这是我的函数中经常返回的代码: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, '\', '
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