Emacs Lisp: сделать вновь созданный буфер видимым, прежде чем функция вернется? - PullRequest
5 голосов
/ 20 июня 2009

В следующей функции в emacs Lisp,

(defun show-life ()
  (interactive)
  (switch-to-buffer "*Life-Window*") ; show how life goes on while living
  (live)) ; it takes 70 years to finish and return!

Я бы хотел создать буфер " Life-Window ", и чтобы непрерывно отображалось событие жизни, генерируемое (live), пока идет live

К сожалению, буфер становится видимым только после возврата (в реальном времени) (когда он закончился!)

Я также пробовал pop-to-buffer, поведение такое же.

Ответы [ 2 ]

13 голосов
/ 20 июня 2009

Добавить вызов на 'sit-for непосредственно перед вызовом на 'live, например,

(defun show-life ()
  (interactive)
  (switch-to-buffer "*Life-Window*")    ; show how life goes on while living
  (sit-for 0)                           ; perform redisplay
  (live))                               ; it takes 70 years to finish and return!

И, если вы хотите увидеть результаты 'live, он также должен периодически вызывать 'sit-for.

Строка документа для 'sit-for:

sit-for - это скомпилированная функция Lisp в `Subr.el». (сидеть в течение секунд и необязательно nodisp)

Выполните повторное отображение, затем дождитесь секунды, секунды или пока ввод имеется в наличии. секунды могут быть значение с плавающей точкой. (На операционной системы, которые не поддерживают ожидание за доли секунды, значения с плавающей точкой округляются в меньшую сторону до ближайшего целого числа.)

Если необязательным аргументом arg является t, не переотображение, просто дождитесь ввода. Повторное отображение не происходит, если ввод доступно до его запуска.

Значение равно t, если ожидал полный рабочий день без ввода поступающего, и ноль в противном случае.

4 голосов
/ 20 июня 2009

Я нашел решение. Я должен использовать (sit-for <time-to-wait>), чтобы получить буфер для отображения обновлений событий жизни.

Таким образом, сегмент кода должен быть изменен следующим образом:

(defun show-life ()
  (interactive)
  (switch-to-buffer "*Life-Window*") ; show how life goes on while living
  (sit-for 0)
  (live)) ; it takes 70 years to finish and return!

Возможно, внутри live тела, sit-for следует периодически вызывать.

...