Как понимать эти скрипты vim

У меня есть два вопроса о понимании этих vim script. пожалуйста, помогите,

Вопрос 1: Я загружаю плагин a.vim, и я пытаюсь прочитать этот плагин, как понять определение переменной ниже? первая строка, которую я могу понять, но вторая строка, я точно не знаю. g: alternateExtensions _ {'aspx.cs'} "означает.

" E.g. let g:alternateExtensions_CPP = "inc,h,H,HPP,hpp" 
" let g:alternateExtensions_{'aspx.cs'} = "aspx"

Вопрос 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")
</sid></sid></sid>

благодарим вас за любезную помощь.

2 ответа

let g:alternateExtensions_{'aspx.cs'} = "aspx"

Это встроенное расширение выражения Vimscript в имя переменной, довольно скрытая функция, которая редко используется с Vim версии 7. См. :help curly-braces-names для получения дополнительной информации. Обычно он используется для интерполяции переменной, а не строкового литерала, подобного здесь ('aspx.cs'). Кроме того, это приводит к ошибке, поскольку периоды запрещены в именах переменных. Новые плагины будут использовать переменную List или Dictionary, но эти типы данных были недоступны, когда был написан a.vim.

Чтобы избежать загрязнения пространства имен функций, внутренние функции плагина должны быть script -local, то есть иметь префикс s:. Чтобы вызывать их из сопоставления, вместо s: следует использовать специальный префикс , потому что внутренне преобразуется во что-то, что поддерживает идентификатор script, тогда как чистый s:, когда выполняется как часть отображения, потеряла связь с script, которая определила его.

Некоторые авторы плагинов не полностью понимают эту неудачную и случайную сложность реализации Vim scoping, и они ставят префикс также перед именем функции (что тоже работает). Хотя это немного правильнее и рекомендуется написать его вот так:

" 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")
</sid></leader></sid>


объясняется в :help:

When defining a function in a script, "s:" can be prepended to the name to
make it local to the script. But when a mapping is executed from outside of
the script, it doesn't know in which script the function was defined. To
avoid this problem, use "<sid>" instead of "s:". The same translation is done
as for mappings. This makes it possible to define a call to the function in
a mapping.
When a local function is executed, it runs in the context of the script it was
defined in. This means that new functions and mappings it defines can also
use "s:" or "<sid>" and it will use the same unique number as when the
function itself was defined. Also, the "s:var" local script variables can be
used.
</sid></sid>

Это число, которое вы видите слева, когда вы делаете :scriptnames, IIRC.

licensed under cc by-sa 3.0 with attribution.