emacs-orgmode
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [O] progress indicator for code blocks?


From: Nick Dokos
Subject: Re: [O] progress indicator for code blocks?
Date: Wed, 03 Sep 2014 00:55:31 -0400
User-agent: Gnus/5.130012 (Ma Gnus v0.12) Emacs/24.4.50 (gnu/linux)

John Kitchin <address@hidden> writes:

> No, it does not seem to work for me. C-g kills the current evaluation
> for me.
>
> Rainer M Krug <address@hidden> writes:
>
>> Thanks for this snippet - I think something along these lines should be
>> included into org out-of-the-box. 
>>
>> There are many cases where I simply use C-g to go back to emacs while
>> the evaluation is still running - would your snippet still work?
>>
>> Rainer
>>
>>
>> John Kitchin <address@hidden> writes:
>>
>>> John Kitchin <address@hidden> writes:
>>>
>>> I am currently using this bit of advice to change the color of code
>>> blocks while they are being executed so there is a visual hint something
>>> is happening.
>>>
>>> ;; give us some hint we are running
>>> (defadvice org-babel-execute-src-block (around progress nil activate)
>>>   (set-face-attribute
>>>    'org-block-background nil :background "LightSteelBlue")
>>>   (message "Running your code block")
>>>   ad-do-it
>>>   (set-face-attribute 'org-block-background nil :background "gray")
>>>   (message "Done with code block"))
>>>
>>>
>>>> Hi all,
>>>> I am using org-mode in a class, and some students wondered if it was
>>>> possible for there to be a progress bar of some kind while a code block
>>>> is running. Right now Emacs just appears to lock up and there is no
>>>> indication anything is happening, especially the first time we run a
>>>> python block.
>>>>
>>>> I found make-progress-reporter and tried something like this::
>>>>
>>>> #+BEGIN_SRC emacs-lisp
>>>> (defadvice org-babel-execute-src-block (around progress nil activate)
>>>>   (let ((pr (make-progress-reporter "Running")))
>>>>     ad-do-it
>>>>     (progress-reporter-done pr)))
>>>> #+END_SRC
>>>>
>>>> but there is no way to update it, so it doesn't quite do anything
>>>> useful.
>>>>
>>>> What I would really like is an hourglass or some spinning thing. Does
>>>> anyone know how to get that (in a cross-platform way)?

Until emacs becomes multi-threaded, this will be a difficult thing
to do. You can create two asynchronous processes, one to do the
computation and the other to do the spinning: you wait on the first one
and when it finishes, you kill the second, e.g.

#+BEGIN_SRC emacs-lisp
(defvar gq nil)
(defun foo ()
  (let* ((p (start-process "computation" "foo" "sleep" "10"))
         (sentinel (lambda (p event) (delete-process gq))))
    (setq gq (start-process "spinner" "bar" "spin-the-bottle"))
    (set-process-sentinel p sentinel))
  )

(foo)
#+END_SRC

where spin-the-bottle is a program that pops up a spinner[fn:1].

Or you can use coroutines: the computation "thread" yields every second
(or half-second or whatever) to the spinner "thread" which advances the
spinner (e.g. with progress-reporter-update) and yields control
back to the computation "thread". There is even a coroutine.el but
I have no idea how to use it or how well it works.

The first one works better if the computation is done externally (if
it's done by a lisp function, then you'll have to write a script that
starts another emacs instance to call the function). The second one
might work better if the computation is done by a lisp function.

In any case, things get complicated very quickly, so most people don't
bother.

Footnotes:

[fn:1] Here's my poor-man's "spinner":

--8<---------------cut here---------------start------------->8---
#!/usr/bin/env python

import gtk
import sys

text = 'Spinning'
dialog = gtk.MessageDialog(None,
                           gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
                           gtk.MESSAGE_INFO, gtk.BUTTONS_NONE,
                           text)
dialog.run()
dialog.destroy()
--8<---------------cut here---------------end--------------->8---

-- 
Nick




reply via email to

[Prev in Thread] Current Thread [Next in Thread]