From mboxrd@z Thu Jan 1 00:00:00 1970 From: Nick Dokos Subject: Re: progress indicator for code blocks? Date: Wed, 03 Sep 2014 00:55:31 -0400 Message-ID: <8738c9mhfg.fsf@alphaville.dokosmarshall.org> References: Mime-Version: 1.0 Content-Type: text/plain Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:53556) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XP2bo-0007Wt-5I for emacs-orgmode@gnu.org; Wed, 03 Sep 2014 00:55:57 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XP2bi-0007AI-Mp for emacs-orgmode@gnu.org; Wed, 03 Sep 2014 00:55:52 -0400 Received: from plane.gmane.org ([80.91.229.3]:48121) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XP2bi-0007A8-Gd for emacs-orgmode@gnu.org; Wed, 03 Sep 2014 00:55:46 -0400 Received: from list by plane.gmane.org with local (Exim 4.69) (envelope-from ) id 1XP2bh-0001GW-4H for emacs-orgmode@gnu.org; Wed, 03 Sep 2014 06:55:45 +0200 Received: from pool-108-20-41-17.bstnma.fios.verizon.net ([108.20.41.17]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Wed, 03 Sep 2014 06:55:45 +0200 Received: from ndokos by pool-108-20-41-17.bstnma.fios.verizon.net with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Wed, 03 Sep 2014 06:55:45 +0200 List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: emacs-orgmode@gnu.org John Kitchin writes: > No, it does not seem to work for me. C-g kills the current evaluation > for me. > > Rainer M Krug 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 writes: >> >>> John Kitchin 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