Перш за все, відмова від відповідальності. Я досліджував це багато разів, і я майже впевнений, що вже знайшов відповідь так чи інакше, але просто не розумію цього.
Моя проблема полягає в наступному:
- У мене процес, що проходить через comint
- Я хочу надіслати рядок введення, зафіксувати висновок і побачити, коли він закінчився (коли останній рядок виведення відповідає збігу з регулярним виразом для запиту)
- тільки коли процес закінчив надсилати вихід, я хочу надіслати ще один рядок введення (наприклад).
Трохи задумавшись, подумайте про основний режим, що реалізує взаємодію з програмою, яка може повернути довільну кількість результатів у будь-який час. Це не повинно бути незвичною ситуацією, правда? Гаразд, можливо, частина, де мені потрібно почекати між входами, є незвичною, але вона має кілька переваг перед надсиланням введення в цілому:
- вихідний буфер добре відформатований: вхідний вихідний вихідний вихідний ...
- що ще важливіше, коли надсилається багато тексту до процесу, текст розрізається на шматки, а шматки повертаються процесом назад; Точки вирізання є довільними, і це іноді робить недійсним введення (наприклад, мій процес не буде правильно вставити зріз вводу посередині ідентифікатора)
У всякому разі, незвичайний чи ні, то виходить, що це буде складно. Зараз я щось використовую за принципом
(defun mymode--wait-for-output ()
(let ((buffer (mymode-get-buffer)))
(with-current-buffer buffer
(goto-char (point-max))
(forward-line 0)
(while (not (mymode-looking-at-prompt))
(accept-process-output nil 0.001)
(redisplay)
(goto-char (point-max))
(forward-line 0))
(end-of-line))))
і я дзвоню цьому щоразу після надсилання рядка введення та перед надсиланням наступного. Ну ... працює, це вже щось.
Але це також змушує emacs висіти під час очікування виходу. Причина очевидна, і я подумав, що якщо я включу якийсь асинхронний sleep-for
(наприклад, 1s) в цикл, він затримає вихід на 1s, але придушить висіння. За винятком того, що схоже, що такого роду асинхронності
sleep-for
не існує .
Або це? Загалом, чи є ідіоматичний спосіб досягти цього за допомогою emacs? Іншими словами:
Як надіслати вхід в процес, дочекатися виходу, а потім надіслати більше вводу, асинхронно?
Під час пошуку навколо (див. Відповідні запитання) я в основному бачив згадки дозорних (але я не думаю, що це застосовується в моєму випадку, оскільки процес не закінчується) та деяких гачок на коментарях (але що тоді робити? зробіть гачок буфера локальним, перетворіть мою "оцінку решти рядків" у функцію, додайте цю функцію до гака та очистіть гачок згодом? Це звучить дуже брудно, чи не так?).
Мені шкода, якщо я не даю зрозуміти себе, або якщо десь наявна очевидна відповідь, мене дуже бентежать усі тонкощі процесу взаємодії.
Якщо потрібно, я можу зробити все це робочим прикладом, але я боюся, що це просто зробить ще одне "конкретне запитання про процес із конкретною відповіді на процес", як і всі ті, кого я знайшов раніше, і не допомогли мені.
Деякі пов'язані питання щодо SO: