Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何理解这些vim脚本_Vim - Fatal编程技术网

如何理解这些vim脚本

如何理解这些vim脚本,vim,Vim,关于理解这些vim脚本,我有两个问题。请给我一些帮助 问题1: 我下载了a.vim插件,我试着阅读这个插件,如何理解下面的变量定义?第一行我能理解,但第二行,我不知道“g:alternateExtensions{'aspx.cs'}”的确切意思 问题2: 如何理解函数名前的“SID”,请使用下面的函数定义和函数调用 function! <SID>AddAlternateExtensionMapping(extension, alternates) //omit define body

关于理解这些vim脚本,我有两个问题。请给我一些帮助

问题1: 我下载了a.vim插件,我试着阅读这个插件,如何理解下面的变量定义?第一行我能理解,但第二行,我不知道“g:alternateExtensions{'aspx.cs'}”的确切意思

问题2: 如何理解函数名前的“SID”,请使用下面的函数定义和函数调用

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")