Pertanyaan bagaimana memahami skrip vim ini


Saya memiliki dua pertanyaan tentang memahami naskah vim tersebut. tolong beri bantuan,

Pertanyaan 1: Saya mengunduh plugin a.vim, dan saya mencoba membaca plugin ini, bagaimana memahami definisi variabel di bawah ini? baris pertama yang dapat saya pahami, tetapi baris kedua, saya tidak tahu persis "g: alternateExtensions _ {'aspx.cs'}" berarti.

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

Pertanyaan 2:    bagaimana memahami "SID" sebelum nama fungsi, menggunakan seperti definisi fungsi dan fungsi panggilan di bawah ini.

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

terima kasih atas bantuan Anda.


5
2018-05-27 07:11


asal


Jawaban:


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

Itu adalah perluasan sebaris dari ekspresi Vimscript ke nama variabel, fitur yang agak tidak jelas yang jarang digunakan sejak Vim versi 7. Lihat :help curly-braces-names untuk detailnya. Biasanya digunakan untuk menginterpolasi variabel, bukan string literal seperti di sini ('aspx.cs'). Selanjutnya, ini di sini menghasilkan kesalahan, karena periode dilarang dalam nama variabel. Plugin baru akan menggunakan variabel Daftar atau Kamus, tetapi jenis data tersebut tidak tersedia saat itu a.vim Sudah ditulis.


Untuk menghindari mencemari namespace fungsi, fungsi plugin-internal harus skrip-lokal, yaitu memiliki awalan s:. Untuk memanggil ini dari pemetaan, yang spesial <SID> awalan harus digunakan sebagai gantinya s:, karena <SID> secara internal diterjemahkan menjadi sesuatu yang membuat ID skrip, sedangkan yang murni s:, ketika dieksekusi sebagai bagian dari pemetaan, telah kehilangan hubungannya dengan skrip yang mendefinisikannya.

Beberapa penulis plugin tidak sepenuhnya memahami kerumitan yang tidak menguntungkan dan tidak disengaja ini dari penerapan cakupan Vim, dan mereka menempatkan <SID> awalan juga di depan nama fungsi (yang berfungsi juga). Meskipun itu sedikit lebih tepat dan disarankan untuk menulisnya seperti ini:

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

17
2018-05-27 07:38



<SID> dijelaskan dalam :help <SID>:

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.

Angka itu adalah angka yang Anda lihat di sebelah kiri saat Anda melakukannya :scriptnames, IIRC.


3
2018-05-27 07:28