function! s:SCaller(...)
try
throw 'abc'
catch /^abc$/
if a:0
let prefunc = a:1
" echo v:throwpoint
return matchstr(v:throwpoint, '^.*\zs<SNR>\d\+_.*\ze\.\.'.prefunc.'.*'.'')
else
return matchstr(v:throwpoint, '^function \zs.\{-}\ze\.\.')
endif
endtry
endfunction
function! g:call_funcname()
return s:SCaller("g:call_funcname")
endfunction
function! g:SID_function_prefix()
return matchstr(s:SCaller("g:SID"), '^\zs<SNR>\d\+_\ze.*$')
endfunction
function! g:SID()
return matchstr(s:SCaller("g:SID"), '^<SNR>\zs\d\+\ze.*$')
endfunction
ZnVuY3Rpb24hIHM6U0NhbGxlciguLi4pCgl0cnkKCQl0aHJvdyAnYWJjJwoJY2F0Y2ggL15hYmMkLwoJCWlmIGE6MAoJCQlsZXQgcHJlZnVuYyA9IGE6MQoiIAkJCWVjaG8gdjp0aHJvd3BvaW50CgkJCXJldHVybiBtYXRjaHN0cih2OnRocm93cG9pbnQsICdeLipcenM8U05SPlxkXCtfLipcemVcLlwuJy5wcmVmdW5jLicuKicuJycpCgkJZWxzZQoJCQlyZXR1cm4gbWF0Y2hzdHIodjp0aHJvd3BvaW50LCAnXmZ1bmN0aW9uIFx6cy5cey19XHplXC5cLicpCgkJZW5kaWYKCWVuZHRyeQplbmRmdW5jdGlvbgoKCmZ1bmN0aW9uISBnOmNhbGxfZnVuY25hbWUoKQoJcmV0dXJuIHM6U0NhbGxlcigiZzpjYWxsX2Z1bmNuYW1lIikKZW5kZnVuY3Rpb24KCmZ1bmN0aW9uISBnOlNJRF9mdW5jdGlvbl9wcmVmaXgoKQoJcmV0dXJuIG1hdGNoc3RyKHM6U0NhbGxlcigiZzpTSUQiKSwgJ15cenM8U05SPlxkXCtfXHplLiokJykKZW5kZnVuY3Rpb24KCmZ1bmN0aW9uISBnOlNJRCgpCglyZXR1cm4gbWF0Y2hzdHIoczpTQ2FsbGVyKCJnOlNJRCIpLCAnXjxTTlI+XHpzXGRcK1x6ZS4qJCcpCmVuZGZ1bmN0aW9uCg==