Захватить вывод интерактивного скрипта в vim

У меня есть интерактивный сценарий Perl, который печатает подсказки в STDERR и читает строки из STDIN. Конечным результатом этого скрипта является IP-адрес, напечатанный в STDOUT. Вот пример такой скриптовой версии.

my @pieces;
for (1..4) {
    print STDERR "please enter piece $_ of the IP:";        chomp(my $in = <>);
    push @pieces, $in;
}  
print join '.', @pieces;
print "\n";

Я использую плагин vim-камин vim. Этот плагин имеет функцию, где я могу сказать:

:Connect nrepl://127.0.0.1:9999

Я хочу знать, как настроить vim так, чтобы при выполнении определенной команды, скажем:

:InteractiveConnect

это сделает следующее:

  1. Запустите скрипт Perl, позволяя мне ввести 4 части IP-адреса.
  2. Захватите IP-адрес, выведенный сценарием Perl.
  3. Интерполируйте IP-адрес в команду:Connect
  4. Запустите команду:Connect.

Немного больше информации на основе некоторых ответов:

Если я вызываю этот скрипт, используя:

:!/path/to/myscript.pl

Затем он выполняется нормально, и я вижу результат, напечатанный в окне vim, после чего

Press ENTER or type command to continue

Если выходные данные сценария сохраняются в некотором буфере после выполнения через!, Возможно ли получить доступ к этому буферу в vimscript и просто захватить нужный мне бит (последняя строка) с помощью регулярного выражения?

2 ответа

Решение

Хорошо, возможно, есть более элегантный способ сделать это, но как насчет этого:

function! <SID>InteractiveConnect()
    let tempfile=tempname()
    exe '!/path/to/your/script.pl >' . shellescape(tempfile)
    try
        exe 'Connect nrepl://' . readfile(tempfile, '', -1)[0]
    finally
        call delete(tempfile)
    endtry
endfunction
command! -nargs=0 InteractiveConnect call <SID>InteractiveConnect()

Это создает временный файл, пишет в него с помощью скрипта (используя system() не работает, потому что не ждет ввода), читает последнюю строку в временном файле Connect команда, а затем, наконец, удаляет временный файл.

Может быть что-то вроде:

exec 'Connect nrepl://' . matchstr(system('your/script.pl'), '^.\+\%$')

(Не проверено.) Это запускает скрипт, используя system() затем сопоставляет вывод с регулярным выражением ^.\+\%$, (где \%$ означает конец файла; если ваш файл заканчивается новой строкой, дополнительный \n может потребоваться до этого) и передает согласованную строку в Connect команда.,

Другие вопросы по тегам