сон в emacs lisp

скрипт A

    (insert (current-time-string))
    (sleep-for 5)
    (insert (current-time-string))

Mx eval-buffer , две строки времени вставляются с интервалом 5 секунд

скрипт B

какой-то код comint (который добавляет ловушку и запускает процесс)

    (sleep-for 60) ;delay a bit for process to finish
    (insert "ZZZ")

Mx eval-buffer , "ZZZ" вставляется сразу, без какой-либо задержки

что могло случиться? Кстати, это Emacs 23.2 в Win XP

17
задан rahmu 17 November 2014 в 18:58
поделиться

1 ответ

Если все, что вы хотите сделать, это ждать завершения процесса, вам, вероятно, не следует использовать sleep-for вообще. Вместо этого вызовите процесс синхронно, а не асинхронно:

http://www.gnu.org/software/emacs/manual/html_node/elisp/Synchronous-Processes.html#Synchronous-Processes

Таким образом, Emacs будет блокировать, пока процесс не завершится.

Если вы должны (или действительно хотите) использовать асинхронный процесс, например, потому что он занимает очень много времени и вы не хотите, чтобы Emacs зависал в течение этого времени (вы говорите о 60 секундах, что довольно долго), тогда правильный способ ожидания завершения процесса - использование стража . Часовой является обратным вызовом, который вызывается всякий раз, когда изменяется состояние процесса, например, когда он завершается.

(defun my-start-process ()
  "Returns a process object of an asynchronous process."
  ...)

(defun my-on-status-change (process status)
  "Callback that receives notice for every change of the `status' of `process'."
  (cond ((string= status "finished\n") (insert "ZZZ"))
        (t (do-something-else))))

;; run process with callback
(let ((process (my-start-process)))
  (when process
    (set-process-sentinel process 'my-on-status-change)))
12
ответ дан 30 November 2019 в 13:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: