Захватить вывод интерактивного скрипта в 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
это сделает следующее:
- Запустите скрипт Perl, позволяя мне ввести 4 части IP-адреса.
- Захватите IP-адрес, выведенный сценарием Perl.
- Интерполируйте IP-адрес в команду:Connect
- Запустите команду: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
команда.,