如何在gVim 8.1中异步执行外部命令,而不必每次都启动新的cmd并将输出附加到现有缓冲区

时间:2019-02-12 14:29:07

标签: windows vim

我想执行一个批处理文件,并在一个新的缓冲区上显示输出。我知道我可以为此使用!start,但是我不知道如何使它重用同一命令行,而不是每次都启动一个新命令行。

我设法通过使用:terminal而不是send_keys()来关闭,检查终端缓冲区是否仍然存在,并仅在不存在时才启动一个新缓冲区。问题是我得到的是一个交互式shell,所以我必须切换到Terminal-Normal模式才能浏览缓冲区的内容,否则cmd会夺走vim的焦点,并且无法让我四处走动。提示本身也是输出的一部分,这很烦人。

代码如下:

fun! MatchAnyInList(list, value)
    return index(map(a:list, 'v:val =~# "' . a:value . '"'), 1) >= 0
endfun

" I have no idea what I'm doing    
fun! RunBuildBatchFile()
    if !exists("g:terminal_bufnum") || MatchAnyInList(['finished', ''], term_getstatus(g:terminal_bufnum))
        let g:terminal_bufnum = term_start("cmd", {'hidden': 1})
        call term_sendkeys(g:terminal_bufnum, "vcvarsall x64\<CR>")
    endif

    if bufwinnr(g:terminal_bufnum) < 0
        execute "botright sb " . g:terminal_bufnum
        call term_setsize(g:terminal_bufnum, 4, 0)
    endif

    call term_sendkeys(g:terminal_bufnum, "cls\<CR>")
    call term_sendkeys(g:terminal_bufnum, "C:\\Path\To\Executable\Command.exe")

    if term_getstatus(g:terminal_bufnum)=~# "normal"
        call feedkeys("i")
    endif
endfun

可能有更好的方法。我尝试在网上和文档中查找有关此资料的信息,但是却一无所获。有任何想法吗?

0 个答案:

没有答案