TypeScript -> Vim script -> TypeScriptを経由したProcessの呼び出し
具体的にやりたい事はHandlerからProcessの呼び出しの抽象化
TypeScriptで登録した関数をVim scriptを経由して動的に呼び出す と似た問題が起きる
デフォルトのProcesses(TS実装)とユーザが設定したProcesses(Vim script実装)の呼び出しを区別したくない
TypeScriptでは FuncRef を扱うことができないので、ユーザが設定したProcess(valueがFuncRefの辞書)を扱うにはVim scriptを経由しないといけない
TSで用意したデフォルトのProcessと、ユーザが設定したProcessを同じインターフェイスで呼び出すwrapperをVim script側で用意する必要がある
Processes, Processの登録 で registerFunction した関数をfzf実行後に呼び出す、その際に対象の関数名をVim scriptに渡す必要があるので、実行したコマンド名と expectKey から生成する
TypeScript側の関数でfzfから lines を受け取って諸々の処理をしたあとにVim scriptを経由してTypeScriptに戻ってこれるようにする
code:remote/handler_to_process.vim
function! fzf_preview#remote#handler_to_process#call_funcref_or_fallback_default_processor(default_processor_function_name, expect_key, lines, processor_name) abort
if (a:process_name == v:null)
call call(a:default_process_function_name, a:lines)
else
let processes = eval('g:' . a:processor_name)
let Process = processesa:expect_key
if type(Process) == v:t_string
call call(Process, a:lines)
elseif type(Process) == v:t_func
call Process(a:lines)
endif
endif
endfunction
TSからは registerFunction した関数名をstringで引数として渡す
call call(func_name, a:lines) でTSの関数を呼び出す
--processes オプションが指定されていた場合、変数名を eval して展開して、中の関数名(string) or FuncRef を call する
string を許容している理由はユーザがProcessesを設定する際に取得する defaultProcesses 的なやつがTSの関数名が入ったものになる想定のため( FuncRef を取得することができない)
#FuncRef