Подтвердить что ты не робот

Сон в emacs lisp

script A

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

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

script B

некоторый код comint (который добавляет hook и начинает процесс)

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

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

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

4b9b3361

Ответ 1

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

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

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

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

(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)))

Ответ 2

Вероятно, он прервал сон, чтобы справиться с подпроцессом IO. Вы действительно должны использовать что-то вроде run-with-idle-timer для таких "задержек для процессов", поскольку Emacs является однопоточным.

Ответ 3

Из официальной документации это может быть реализовано не только в режиме ожидания, но и в режиме ожидания:

(defun smart-translate ()
  "Shows translation of a word at the current point
at the full frame for several seconds and 
returns to the initial buffer"
  (interactive)
  (google-translate-at-point)
  (switch-to-buffer "*Google Translate*")
  (delete-other-windows)
  (sit-for 5)
  (previous-buffer)
  )