Как выполнить внешнюю команду в gVim 8.1 асинхронно, не запуская каждый раз новый cmd и добавляя вывод в существующий буфер - PullRequest
0 голосов
/ 12 февраля 2019

Я хочу выполнить командный файл и отобразить вывод в новом буфере.Я знаю, что могу использовать !start для этого, но я не могу понять, как заставить его использовать одну и ту же командную строку вместо запуска новой каждый раз.

Мне удалось приблизиться, используя :terminal вместо send_keys(), проверив, существует ли буфер терминала, и запуская новый только тогда, когда его нет.Проблема в том, что я получаю интерактивную оболочку, поэтому мне нужно переключиться в режим 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

Вероятно, есть гораздо лучший способ сделать это.Я пытался найти информацию об этом материале в Интернете и в документах, но я ничего не получил.Есть идеи?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...