[TypeScript][QuickRun] Reference Pathから自動でコンパイルオプション生成 前回の記事で TypeScriptでのQuickRunの設定を書いたが、どうせならreference pathから自動でコンパイルオプションを生成するようにしたら いんじゃね?って思って変更しました。 "" vim-quickrun {{{ " quickrunの最終的なコマンドを出力する {{{ " http://d.hatena.ne.jp/osyo-manga/searchdiary?word=quickrun let s:hook = { \ "name" : "output_command", \ "kind" : "hook", \ "config" : { \ "enable" : 0, \ "log" : 0 \ } \} function! s:hook.on_ready(session, context) HierClear for command in a:session.commands execute self.config.log ? "echom command" : "echo command" endfor endfunction call quickrun#module#register(s:hook, 1) unlet s:hook " }}} " TypeScript コンパイル後にヘッダ等を追加 {{{ let s:hook = { \ "name" : "js2cmd", \ "kind" : "hook", \ "config" : { \ "enable" : 0 \ } \ } function! s:hook.on_module_loaded(session, context) let references = [] for line in readfile(a:session.config.srcfile, '', 15) if line =~ '^///<reference path=' "echom 'reference : ' . line[stridx(line, '"') + 1 : -4] if line[stridx(line, '"') + 1 : -4] !~ 'lib.d.ts' call add(references, line[stridx(line, '"') + 1 : -4]) endif endif endfor "echom 'exec : %c --nolib %s ' . join(references, ' ') . ' --out %s:p:r.js' let a:session.config.exec = '%c --nolib %s ' . join(references, ' ') . ' --out %s:p:r.js' endfunction function! s:hook.on_success(session, context) let list = [] call add(list, "@if(0)==(0) ECHO OFF\r") for line in readfile(a:session.config.srcfile, '', 10) if line =~ '^//' if line[3 : 4] =~ 'OP' echom 'option : ' . line[stridx(line, '"') + 1 : -2] if line[stridx(line, '"') + 1 : -2] =~ '^pushd' call add(list, " pushd \"%~dp0\" > nul\r") call add(list, " CScript.exe //NoLogo //E:JScript \"%~f0\" %*\r") call add(list, " popd > nul\r") else call add(list, " CScript.exe //NoLogo //E:JScript \"%~f0\" %*\r") endif endif endif endfor call add(list, "pause\r") call add(list, "GOTO :EOF\r") call add(list, "@end\r") call add(list, "\r") let inJs = fnamemodify(a:session.config.srcfile, ":p:r") . '.js' let outCmd = fnamemodify(a:session.config.srcfile, ":p:r") . '.cmd' echom inJs echom outCmd let utf8List = list + readfile(inJs, 'b') let cp932List = [] for line in utf8List call add(cp932List, iconv(line, "UTF-8", "CP932")) endfor call writefile(cp932List, outCmd, 'b') if has('win32') || has('win64') call {s:system}('del ' . inJs) else call {s:system}('rm ' . inJs) endif endfunction call quickrun#module#register(s:hook, 1) unlet s:hook " }}} let g:quickrun_config = {} let g:quickrun_config = { \ "_" : { \ "hook/output_command/enable" : 1, \ "hook/close_unite_quickfix/enable_hook_loaded" : 1, \ "hook/unite_quickfix/enable_failure" : 1, \ "hook/close_quickfix/enable_exit" : 1, \ "hook/close_buffer/enable_failure" : 1, \ "hook/close_buffer/enable_empty_data" : 1, \ "hook/echo/enable" : 1, \ "hook/echo/output_success" : "success!!!", \ "hook/echo/output_failure" : "failure...", \ "outputter" : "multi:buffer:quickfix", \ "outputter/buffer/split" : ":botright 8sp", \ "runner" : "vimproc", \ "runner/vimproc/updatetime" : 40, \ }, \ "typescript" : { \ "commad" : "tsc", \ "cmdopt" : "--nolib --out", \ "exec" : "%c %s _lib.ts %o %s:p:r.js", \ "hook/js2cmd/enable" : 1, \ "hook/output_command/log" : 1, \ } \ } "}}} TypeScriptファイルの先頭15行以内にあるreferenceを読み込んで、コンパイルオプションに追加してます。 例) 先頭15行以内に以下が含まれてる場合 1 2 ///<reference path="_lib.ts"/> ///<reference path="_file.ts"/> コンパイルオプションは以下になる 1 '%c --nolib %s _lib.ts _file.ts --out %s:p:r.js' ちなみに’–nolib’ を指定しているのは標準の’lib.d.ts’を拡張しているので、標準のは読み込んで欲しくないからです。 また、最終的にはwsh(JScript)として実行したいため、’OP:’の行指定によりコンパイル後のjsファイルに JScriptとして実行するためのヘッダファイルを付加しています。 例) 1 // OP: "pushd" の場合、下記のヘッダがjsファイルに付加され、拡張子が’cmd’になります。 1 2 3 4 5 6 7 @if(0)==(0) ECHO OFF pushd "%~dp0" > nul CScript.exe //NoLogo //E:JScript "%~f0" %* popd > nul pause GOTO :EOF @end 1 // OP: "nopushd" 上記の場合、下記のヘッダがjsファイルに付加されます。 1 2 3 4 5 @if(0)==(0) ECHO OFF CScript.exe //NoLogo //E:JScript "%~f0" %* pause GOTO :EOF @end