emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: Nick Dokos <ndokos@gmail.com>
To: emacs-orgmode@gnu.org
Subject: Re: progress indicator for code blocks?
Date: Wed, 03 Sep 2014 00:55:31 -0400	[thread overview]
Message-ID: <8738c9mhfg.fsf@alphaville.dokosmarshall.org> (raw)
In-Reply-To: m2vbp6jea9.fsf@andrew.cmu.edu

John Kitchin <jkitchin@andrew.cmu.edu> writes:

> No, it does not seem to work for me. C-g kills the current evaluation
> for me.
>
> Rainer M Krug <Rainer@krugs.de> 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 <jkitchin@andrew.cmu.edu> writes:
>>
>>> John Kitchin <jkitchin@andrew.cmu.edu> 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	other threads:[~2014-09-03  4:55 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-08-30 13:02 progress indicator for code blocks? John Kitchin
2014-08-31 12:03 ` John Kitchin
2014-09-02  9:18   ` Rainer M Krug
2014-09-02 14:19     ` John Kitchin
2014-09-03  4:55       ` Nick Dokos [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.orgmode.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=8738c9mhfg.fsf@alphaville.dokosmarshall.org \
    --to=ndokos@gmail.com \
    --cc=emacs-orgmode@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).