어떻게든 다음 매핑을 수행할 수 없습니다.
function! s:MySurroundingFunctionIWantToKeep()
let s:Foobar={'foo': 'bar'}
map \42 :echo <sid>Foobar.foo<cr>
endfunction
call s:MySurroundingFunctionIWantToKeep()
내 생각엔 스크립트 로컬 함수와 같은 방식으로 작동한다고 생각합니다.
function! s:MySurroundingFunctionIWantToKeep()
function! s:Foobar()
echo 'bar'
endfunction
map \42 :call <sid>Foobar()<cr>
endfunction
call s:MySurroundingFunctionIWantToKeep()
s:Foobar
이를 제거해도 s:MySurroundingFunctionIWantToKeep()
도움이 되지 않습니다. 예를 들면 다음과 같습니다.
let s:Foobar={'foo': 'bar'}
map \42 :echo <sid>Foobar.foo<cr>
s:Foobar
스크립트 로컬 변수를 g:Foobar
전역 변수로 선언하면 됩니다.
답변1
(내가 아는 한) 해당 스크립트의 컨텍스트 외부에서 스크립트 로컬 변수에 직접 액세스할 수 있는 방법은 없습니다 <SID>
.
그러나 다음 기능을 통해 간접적인 액세스를 제공할 수 있습니다.
function! s:FoobarHash()
return s:Foobar
endfunction
function! s:MySurroundingFunctionIWantToKeep()
let s:Foobar={'foo': 'bar'}
map \42 :echo <sid>FoobarHash()['foo']<cr>
endfunction
call s:MySurroundingFunctionIWantToKeep()
변수를 얼마나 격리시키려는지에 따라 "접속자" 기능을 더 제한적으로 만들 수 있습니다(특정 키만 허용, 읽기 액세스만 허용, 특정 키에 대한 쓰기만 허용 등).
let s:Foobar={'foo': 'bar', 'baz': 'quux'}
function! s:FoobarAccess(...)
" Provide limited access to the script-local hash s:Foobar
if a:0 == 1
" allow read access to all keys
return s:Foobar[a:1]
elseif a:0 == 2
" allow write access to only 'foo'
if a:1 !=# 'foo'
throw 'FoobarAccess: not allowed to write to key ' . a:1
endif
let old = s:Foobar[a:1]
let s:Foobar[a:1] = a:2
return old
else
throw 'FoobarAccess must take exactly one or two arguments'
endif
endfunction
map \42 :echo <sid>FoobarAccess('foo')<cr>
map \43 :echo <sid>FoobarAccess('foo','new value')<cr>
map \44 :echo <sid>FoobarAccess('baz')<cr>
map \45 :echo <sid>FoobarAccess('baz',1)<cr>