Неовим пример контроля работы с рубином
Пример контроля работы Неовима в :help job-control
хорошо работает для скриптов bash. Однако я не могу заставить его работать на рубине. Рассмотрим следующий пример:
set nocp
set buftype=nowrite
call jobstart('shell', 'bash', ['-c', 'for ((i = 0; i < 5; i++)); do sleep 2 && printf "Hello Bash!\n"; done'])
call jobstart('shell', 'ruby', ['-e', '5.times do sleep 2 and puts "Hello Ruby!" end'])
function JobHandler()
if v:job_data[1] == 'exit'
let str = v:job_data[0] . ' exited'
else
let str = join(v:job_data[2])
endif
call append(line('$'), str)
endfunction
au JobActivity shell* call JobHandler()
Бег nvim -u NONE -S <filename>
производит следующий вывод:
Hello Bash!
Hello Bash!
Hello Bash!
Hello Bash!
Hello Bash!
1 exited
Hello Ruby! Hello Ruby! Hello Ruby! Hello Ruby! Hello Ruby!
2 exited
Как сделать так, чтобы пример ruby работал таким же образом для bash?
1 ответ
Решение
Оказывается, что выход ruby буферизуется. Нужно заставить это быть очищенным, чтобы видеть желаемый результат.
call jobstart('shell', 'ruby', ['-e', '$stdout.sync = true; 5.times do sleep 1 and puts "Hello Ruby!\n" end'])
Моей первоначальной проблемой было выполнение асинхронного теста ruby. Чтобы это работало, мне пришлось написать $stdout.sync = true
в файл и требуют его с помощью -r
:
call jobstart('shell', 'ruby', ['-r', '/tmp/opts.rb', '-I', 'test', 'test/unit/user_test.rb'])