Vim 맵에서 스크립트 로컬 사전을 참조하는 방법은 무엇입니까?

Vim 맵에서 스크립트 로컬 사전을 참조하는 방법은 무엇입니까?

어떻게든 다음 매핑을 수행할 수 없습니다.

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>

관련 정보