Emacs Lisp: Torne o buffer recém-criado visível antes que a função retorne?
-
06-07-2019 - |
Pergunta
Na seguinte função em 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!
Eu gostaria de criar o buffer "Window da vida", E o evento da vida gerado pelo (Live) exibido continuamente enquanto o Live continua.
Infelizmente, o buffer só se torna visível após o retorno (ao vivo) (quando acabou!)
Eu também tentei pop-a-buffer, o comportamento é o mesmo.
Solução
Adicionar uma chamada para 'sit-for
pouco antes da chamada para 'live
, por exemplo
(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!
E, se você quiser ver os resultados de 'live
, deve ligar periodicamente 'sit-for
também.
A string do documento para 'sit-for
é:
Sit-for é uma função LISP compilada em `sub-r.el '. (Sit-for Seconds e Nodisp opcional)
Execute o Redisplay e aguarde segundos segundos ou até que a entrada esteja disponível. segundos podem ser um valor de ponto flutuante. (Em sistemas operacionais que não suportam aguardando frações de segundo, os valores de ponto flutuante são arredondados para o número inteiro mais próximo.)
Se o Arg Nodisp opcional for t, não seja redisplay, apenas aguarde a entrada. O Redisplay não acontece se a entrada estiver disponível antes de iniciar.
O valor é t se esperava em tempo integral sem nenhuma entrada chegando e nil de outra forma.
Outras dicas
Eu descobri a solução. Eu tenho que usar (sit-for <time-to-wait>)
Para fazer com que o buffer mostre a atualização dos eventos da vida.
Portanto, o segmento de código deve ser modificado da seguinte forma:
(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!
Talvez dentro do live
corpo, sit-for
deve ser chamado periodicamente.