Vim6スクリプトお勉強スレat UNIX
Vim6スクリプトお勉強スレ - 暇つぶし2ch877:KoRoN@Vim%Chalice ◆8XALICEsdk
07/05/03 19:22:50
>>874-875
実験してみました。結論からいうと>>870は誤りで、>>873で示唆したように、s:や
<SID>の評価が参照解決の実行時のコンテキストに依存している、ということになり
ます。まずはこのスクリプトをみてください。

function! s:MyFunc()
  echo "MyFunc is executed"
endfunction
let g:FnRef = function('<SID>MyFunc')

function! s:KickMyFunc()
  call g:FnRef()
endfunction

command! -nargs=0 KickMyFunc :call <sid>KickMyFunc()

このスクリプトを実行するとグローバル変数g:FnRefにs:MyFuncへの関数リファレン
スが格納されます。コマンドKickMyFuncを実行した際には関数s:KickMyFuncを経由し
てg:FnRefが呼出され、正しくs:MyFuncを呼出すことができます。一方、コマンドラ
インで:call g:FnRef()と直接呼出した場合にはE120が発生します。これはつまり、
関数の参照解決はfunction()ではなく実際の関数の呼出し時に行われるので、<SID>
を含むFuncRefは同じスクリプト内からでなければ使えない、ということです。

>>868の例で言えば、imapで実行されるb:Prgは、Vimにとってスクリプト内の出来事
ではありませんから<SID>を含む参照が解決できていないのでしょう。なおmapであれ
ば:help :map-scriptにあるとおり<script>を使うことで解決できそうです。でもス
クリプトローカルな関数のFuncRefを別のスクリプトに渡して実行させる、というこ
とはちょっとできそうにないですね。


次ページ
続きを表示
1を表示
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch