如何理解这些vim脚本
关于理解这些vim脚本,我有两个问题。请给我一些帮助 问题1: 我下载了a.vim插件,我试着阅读这个插件,如何理解下面的变量定义?第一行我能理解,但第二行,我不知道“g:alternateExtensions{'aspx.cs'}”的确切意思 问题2: 如何理解函数名前的“SID”,请使用下面的函数定义和函数调用如何理解这些vim脚本,vim,Vim,关于理解这些vim脚本,我有两个问题。请给我一些帮助 问题1: 我下载了a.vim插件,我试着阅读这个插件,如何理解下面的变量定义?第一行我能理解,但第二行,我不知道“g:alternateExtensions{'aspx.cs'}”的确切意思 问题2: 如何理解函数名前的“SID”,请使用下面的函数定义和函数调用 function! <SID>AddAlternateExtensionMapping(extension, alternates) //omit define body
function! <SID>AddAlternateExtensionMapping(extension, alternates)
//omit define body
call <SID>AddAlternateExtensionMapping('h',"c,cpp,cxx,cc,CC")
call <SID>AddAlternateExtensionMapping('H',"C,CPP,CXX,CC")
函数!AddAlternateExtensionMapping(扩展,替换)
//省略定义正文
调用AddAlternateExtensionMapping('h','c,cpp,cxx,cc,cc”)
调用AddAlternateExtensionMapping('H','C,CPP,CXX,CC”)
感谢您的帮助。
在:help
中进行了解释:
在脚本中定义函数时,可以将“s:”放在要定义的名称之前
将其设置为脚本的本地。但当从外部执行映射时
脚本,它不知道函数是在哪个脚本中定义的。到
为避免此问题,请使用“”而不是“s:”。同样的翻译也完成了
至于映射。这样就可以在中定义对函数的调用
地图。
当执行一个本地函数时,它会在它所使用的脚本的上下文中运行
定义于。这意味着它定义的新函数和映射也可以
使用“s:”或“”,它将使用与
函数本身被定义。此外,“s:var”本地脚本变量也可以
用过。
这个数字就是您在执行:scriptnames
,IIRC时在左侧看到的数字
let g:alternateExtensions_{'aspx.cs'} = "aspx"
这是Vimscript表达式到变量名的内联扩展,这是自Vim版本7以来很少使用的一个相当模糊的特性。有关详细信息,请参见:帮助大括号名称。它通常用于插入变量,而不是像这里这样的字符串文字('aspx.cs'
)。此外,这会产生一个错误,因为变量名中禁止使用句点。较新的插件将使用列表或字典变量,但在编写a.vim时,这些数据类型不可用
为避免污染函数名称空间,插件内部函数应为脚本本地函数,即具有前缀s:
。要从映射中调用它们,必须使用特殊的
前缀,而不是s:
,因为
在内部会被转换为保留脚本ID的内容,而纯s:
在作为映射的一部分执行时,已失去与定义它的脚本的关联
一些插件作者也没有完全理解Vim作用域实现的这种不幸和偶然的复杂性,他们将
前缀也放在了函数名前面(这也很有效)。虽然它稍微正确一些,建议这样写:
" Define and invoke script-local function.
function! s:AddAlternateExtensionMapping(extension, alternates)
...
call s:AddAlternateExtensionMapping('h',"c,cpp,cxx,cc,CC")
" Only in a mapping, the special <SID> prefix is actually necessary.
nmap <Leader>a :call <SID>AddAlternateExtensionMapping('h',"c,cpp,cxx,cc,CC")
定义并调用脚本本地函数。
函数!s:AddAlternateExtensionMapping(扩展,替换)
...
调用s:AddAlternateExtensionMapping('h','c,cpp,cxx,cc,cc”)
“只有在映射中,特殊前缀才是真正必要的。
nmap a:调用AddAlternateExtensionMapping('h','c,cpp,cxx,cc,cc”)
Hi Ingo,谢谢你的回答,一如既往,信息量很大。您对A.vim插件有什么建议或替代方案吗?回答得很好,谢谢。感谢您对这两个问题给出了信息丰富的答案。我猜
是按字面意思输入的,在vim中没有按键顺序来写吗?@icedwater:是的,您可以将
作为五个单独的字符输入。在Vim内部,这将被转换为另一个(脚本所特有的)字符序列(其中包含一些作为
,但实际上是一个特殊序列写入和响应的内容)。我没有对此进行投票,因为它只回答了一半的问题。这个问题实际上是两个问题。我知道,你说得很对,但是另一个答案尝试了两者。我知道答案已经被回答了,但是我认为如果我们有两个问题来回答这个问题会更好吗?
let g:alternateExtensions_{'aspx.cs'} = "aspx"
" Define and invoke script-local function.
function! s:AddAlternateExtensionMapping(extension, alternates)
...
call s:AddAlternateExtensionMapping('h',"c,cpp,cxx,cc,CC")
" Only in a mapping, the special <SID> prefix is actually necessary.
nmap <Leader>a :call <SID>AddAlternateExtensionMapping('h',"c,cpp,cxx,cc,CC")