{"action":"created","issue":{"url":"https://api.github.com/repos/vim-jp/vital.vim/issues/258","labels_url":"https://api.github.com/repos/vim-jp/vital.vim/issues/258/labels{/name}","comments_url":"https://api.github.com/repos/vim-jp/vital.vim/issues/258/comments","events_url":"https://api.github.com/repos/vim-jp/vital.vim/issues/258/events","html_url":"https://github.com/vim-jp/vital.vim/pull/258","id":57721457,"number":258,"title":"Vim:ScriptLocal: Add ScriptLocal (get script-local things)","user":{"login":"haya14busa","id":3797062,"avatar_url":"https://avatars.githubusercontent.com/u/3797062?v=3","gravatar_id":"","url":"https://api.github.com/users/haya14busa","html_url":"https://github.com/haya14busa","followers_url":"https://api.github.com/users/haya14busa/followers","following_url":"https://api.github.com/users/haya14busa/following{/other_user}","gists_url":"https://api.github.com/users/haya14busa/gists{/gist_id}","starred_url":"https://api.github.com/users/haya14busa/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/haya14busa/subscriptions","organizations_url":"https://api.github.com/users/haya14busa/orgs","repos_url":"https://api.github.com/users/haya14busa/repos","events_url":"https://api.github.com/users/haya14busa/events{/privacy}","received_events_url":"https://api.github.com/users/haya14busa/received_events","type":"User","site_admin":false},"labels":[],"state":"open","locked":false,"assignee":null,"milestone":null,"comments":5,"created_at":"2015-02-15T07:24:21Z","updated_at":"2015-02-15T12:42:39Z","closed_at":null,"pull_request":{"url":"https://api.github.com/repos/vim-jp/vital.vim/pulls/258","html_url":"https://github.com/vim-jp/vital.vim/pull/258","diff_url":"https://github.com/vim-jp/vital.vim/pull/258.diff","patch_url":"https://github.com/vim-jp/vital.vim/pull/258.patch"},"body":"### 概要\r\n\r\npath から `<SID>` を取得したり, script-local な関数を取得したオブジェクト(`sfuncs`) を取得できるモジュールです.\r\n外部モジュールとして実装していた vital-snoop (https://github.com/haya14busa/vital-snoop.vim) が vital 本家にもあると便利という想いによりテストやドキュメントを vital に合わせて移植しました.\r\n\r\n実装した関数は4つで\r\n\r\n1. `sid({path})`: {path}から`<SID>`を返す　\r\n2. `sfuncs({path})`: {path}からそのpathのscript-local関数を持つオブジェクトを返す\r\n3. `sid2sfucs(<SID>)`: `<SID>`からscript-local関数を持つオブジェクトを返す\r\n4. `scriptnames()`: `<SID>`をキー, pathを値とした辞書を返す. (あとで知りましたが `:h scriptnames-dictionary`と同内容です)\r\n\r\n{path}については絶対パスと, `&runtimepath`から見ての相対パスを渡すことができます.\r\n\r\n要するに以下のようなことができます.\r\n\r\n```vim\r\nlet s:V = vital#of('vital')\r\nlet s:S = s:V.import('Vim.ScriptLocal')\r\n\r\n\"\" Get <SID> with relative path to &runtimepath\r\n\" e.g. starts with autoload/, plugin/, etc...\r\n\" (autoload/**/*.vim, plugin/**/*.vim)\r\n:echo s:S.sid('autoload/vital/test/Vim/ScriptLocal/test.vim')\r\n\" => <SID>\r\n\"\" Get the dict which contains script local functions with absolute\r\n\" path\r\n:let bundle = '~/.vim/bundle/'\r\n:let p = 'vital.vim/autoload/vital/test/Vim/ScriptLocal/test.vim'\r\n:let absolute_path = bundle . p\r\n:let sf = s:S.sfuncs(absolute_path)\r\n:echo sf\r\n\" =>\r\n\"  {\r\n\"   'double': function('<SNR>439_double'),\r\n\"   '_power': function('<SNR>439__power')\r\n\"  }\r\n:echo sf.double(3) | \" => 6\r\n:echo sf._power(3) | \" => 9\r\n```\r\n\r\n##### vital.vim/autoload/vital/test/Vim/ScriptLocal/test.vim\r\n\r\n```vim\r\nfunction! s:double(x) abort\r\n    return a:x * 2\r\nendfunction\r\n\r\nfunction! s:_power(x) abort\r\n    return a:x * a:x\r\nendfunction\r\n```\r\n\r\n### 名前について\r\n外部モジュールは`Snoop`という名前にしていましたが, 本PRでは`ScriptLocal`にしました.\r\n少し長い気もするのでより良さげな名前があれば教えて欲しいです!\r\n\r\n\r\n### その他\r\na) テストでautoloadファイル以下や.themisrcを汚してる\r\nautoloadファイルの読み込みなどをテストするため, テスト用のファイルが`autoload/`以下に置かれてます.\r\nまずい気もしますがどうでしょう... `test/` 以下におくとテストとして実行されてしまうので別のディレクトリに置いとくとかはありかなと思いました.\r\n\r\nb) Windows におけるシンボリックリンクのテスト\r\n\r\nちょっとやり方がわからないのでスキップしてます. いい感じのやり方思いつく方教えてください...\r\nシンボリックリンク以外のテストが通ることは確認しました. https://ci.appveyor.com/project/haya14busa/vital-snoop-vim\r\n\r\nc) script-local変数も取得したい?\r\nhttps://gist.github.com/haya14busa/cb78147229dfde98a5e6\r\nscript-local 変数をpathから無理やり取得する闇の関数も実装してみたのですが, 安全じゃないことを\r\n明示した上で, vitalに含めるという選択肢もありますかね?\r\n\r\nテストとかで使いたいという需要が多数あればワンチャン:dog:あるかも? (基本的にはなしかなと思いますが)\r\n"},"comment":{"url":"https://api.github.com/repos/vim-jp/vital.vim/issues/comments/74415921","html_url":"https://github.com/vim-jp/vital.vim/pull/258#issuecomment-74415921","issue_url":"https://api.github.com/repos/vim-jp/vital.vim/issues/258","id":74415921,"user":{"login":"haya14busa","id":3797062,"avatar_url":"https://avatars.githubusercontent.com/u/3797062?v=3","gravatar_id":"","url":"https://api.github.com/users/haya14busa","html_url":"https://github.com/haya14busa","followers_url":"https://api.github.com/users/haya14busa/followers","following_url":"https://api.github.com/users/haya14busa/following{/other_user}","gists_url":"https://api.github.com/users/haya14busa/gists{/gist_id}","starred_url":"https://api.github.com/users/haya14busa/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/haya14busa/subscriptions","organizations_url":"https://api.github.com/users/haya14busa/orgs","repos_url":"https://api.github.com/users/haya14busa/repos","events_url":"https://api.github.com/users/haya14busa/events{/privacy}","received_events_url":"https://api.github.com/users/haya14busa/received_events","type":"User","site_admin":false},"created_at":"2015-02-15T12:42:39Z","updated_at":"2015-02-15T12:42:39Z","body":"> コミットメッセージのプレフィックスは Vim.ScriptLocal: でお願いしますっ！\r\n\r\noh...普通にミスッってました. rebase で直しましたっ"}}