quickrun.vim で動的に各バージョンの Visual Studio のコンパイラを指定する

[追記]

中断した時に正しく終了していなかったので修正。


quickrun.vim 等で Visual Studio の cl.exe を使用してソースファイルをコンパイルをする場合、cl.exe のパスなどを環境変数に設定しておく必要があります
これを quickrun-hook で動的に設定する事によって、使用する Visual Studio を指定出来るようにしてみました。
これで動的に使用する Visual Studio を変更する事が出来ます。
とりあえず、Visual Studio 2005〜2010 は動作することを確認しました。

[vimrc]

" cl.exe を使用する場合、予め設定しておく必要がある
" Windows SDK(or Platform SDK?)
let s:hook = {
\   "name" : "msvc_compiler",
\   "kind" : "hook",
\   "config" : {
\       "enable" : 0,
\       "target" : "",
\   },
\   "path" : "",
\   "lib" : "",
\   "libpath" : "",
\   "include" : "",
\}

function! s:hook.init(...)
    if !self.config.enable
        return
    endif
    let self.path = $PATH
    let self.lib  = $LIB
    let self.libpath = $LIBPATH
    let self.include = $INCLUDE

    let $VSINSTALLDIR=self.config.target
"     let $VSINSTALLDIR="C:/Program Files/Microsoft Visual Studio 10.0"
    let $VCINSTALLDIR=$VSINSTALLDIR."/VC"

    let $DevEnvDir=$VSINSTALLDIR."/Common7/IDE;"
    "let $PATH=$FrameworkDir.$Framework35Version.";".$PATH
    "let $PATH=$FrameworkDir.$FrameworkVersion.";".$PATH
    let $PATH=$VSINSTALLDIR."Common7/Tools;".$PATH
    let $PATH=$VCINSTALLDIR."/bin;".$PATH
    let $PATH=$DevEnvDir.";".$PATH

    let $INCLUDE=$VCINSTALLDIR."/include;".$INCLUDE
    let $LIB=$VCINSTALLDIR."/LIB;".$LIB
    let $LIBPATH=$VCINSTALLDIR."/LIB;".$LIBPATH
endfunction

function! s:hook.sweep(...)
    if !self.config.enable
        return
    endif
    let $PATH = self.path
    let $LIB  = self.lib
    let $LIBPATH = self.libpath
    let $INCLUDE = self.include
endfunction

call quickrun#module#register(s:hook, 1)
unlet s:hook
" }}}


let g:quickrun_config = {
\
\   "cpp" : {
\       "type" : "cpp/msvc2010-debug",
\   },
\
\   "cpp/msvc2010-debug" : {
\       "command" : "cl",
\       "exec": ["%c %o %s /nologo /Fo%s:p:r.obj /Fe%s:p:r.exe > nul",
\            "%s:p:r.exe %a"],
\       "cmdopt" : "/EHsc",
\       "hook/msvc_compiler/enable" : 1,
\       "hook/msvc_compiler/target" : "C:/Program Files/Microsoft Visual Studio 10.0",
\   },
\
\   "cpp/msvc2008-debug" : {
\       "command" : "cl",
\       "exec": ["%c %o %s /nologo /Fo%s:p:r.obj /Fe%s:p:r.exe > nul",
\            "%s:p:r.exe %a"],
\       "cmdopt" : "/EHsc",
\       "hook/msvc_compiler/enable" : 1,
\       "hook/msvc_compiler/target" : "C:/Program Files/Microsoft Visual Studio 9.0",
\   },
\
\   "cpp/msvc2005-debug" : {
\       "command" : "cl",
\       "exec": ["%c %o %s /nologo /Fo%s:p:r.obj /Fe%s:p:r.exe > nul",
\            "%s:p:r.exe %a"],
\       "cmdopt" : "/EHsc",
\       "hook/msvc_compiler/enable" : 1,
\       "hook/msvc_compiler/target" : "C:/Program Files/Microsoft Visual Studio 8",
\   },
\
\}

" 使い方
" QuickRun cpp/msvc2005-debug
" QuickRun cpp/msvc2008-debug
" QuickRun cpp/msvc2010-debug


quickrun-hook で各 Visual Studio のパスを設定、 quickrun 終了時に元に戻しています。
ただ、これだと quickrun 以外で cl.exe を使うことが出来ないのと、quickrun 中に $PATH 等を変更すると爆発するので要注意。