Re: [O] [babel, ess] How can I make S-RET to be multi-session friendly?

2012-08-23 Thread Mikhail Titov
Another issue I've noticed is that if I save a buffer, that was
previously associated with R session, under different name in different
folder, then that association is not getting reset and/or overridden by
session property of Org buffer. Namely, I had dot R file that I saved in
different folder as dot org one while wrapping code in babel blocks and
adding session property. I did C-c C-c.

I believe there is somewhere a check whether a buffer is associated or
not but no check if it is associated with a proper buffer/session.

Eric Schulte writes on Fri Aug 17 2012 at 09:29 :


 The `org-src-in-org-buffer' macro may be used from an edit buffer to run
 elisp inside the code block, in the org-mode buffer of the edit buffer.
 e.g., the following 

 ;; -*- emacs-lisp -*-
 (org-src-in-org-buffer (message --%S (org-babel-get-src-block-info)))

 Where is org-src-in-org-buffer macro defined. Searching all dot el files
 in org folder does not show anything neither does C-h f show anything
 similar.

 (describe-function 'org-src-in-org-buffer) shows that
 org-src-in-org-buffer can be found in org-src.el (line 679 in my
 version).

I guess it did not propagate to bzr yet :( I've checked with rev
109760. For some reason I had problems building git version on Windows a
while ago and I didn't try since then.

-- 
Mikhail



Re: [O] [babel, ess] How can I make S-RET to be multi-session friendly?

2012-08-17 Thread Eric Schulte

 The `org-src-in-org-buffer' macro may be used from an edit buffer to run
 elisp inside the code block, in the org-mode buffer of the edit buffer.
 e.g., the following 

 ;; -*- emacs-lisp -*-
 (org-src-in-org-buffer (message --%S (org-babel-get-src-block-info)))

 Where is org-src-in-org-buffer macro defined. Searching all dot el files
 in org folder does not show anything neither does C-h f show anything
 similar.

(describe-function 'org-src-in-org-buffer) shows that
org-src-in-org-buffer can be found in org-src.el (line 679 in my
version).

-- 
Eric Schulte
http://cs.unm.edu/~eschulte



Re: [O] [babel, ess] How can I make S-RET to be multi-session friendly?

2012-08-16 Thread Mikhail Titov
Bastien b...@gnu.org writes:

 I would say that after applying changes to my-ess-eval and to
 org-babel-edit-prep:R as suggested by Andrew, it looks like everything
 is working right for me.

 I'v been bold and I pushed the change Andrew suggested.

 Thanks for reporting this and for testing around -- and thanks
 to Andrew for the exploration and the fix! 

Though not related to Org, I noticed that ess-make-buffer-current calls
(update-ess-process-name-list) thus making a call for it in my-ess-eval,
probably, somewhat redundant, right?

Another thing that somewhat bugs me is that if R process quits (or
probably dies as well) when editing source code block in a separate
buffer, the subsequent S-RET will silently execute a line in a wrong
buffer/process. If there are no buffers with R process, it will create
the default *R* named buffer. It might be exotic but I think it is an
issue.

Does it mean that there is a bug in ess-make-buffer-current function
somewhere? Something, probably, re-associates a buffer to another
process, does it?

I think it might be relevant that code editing buffer local variable
ess-local-process-name is non-nil when associated process quits. This
results in first ess-make-buffer-current in my-ess-eval silently
launching *R*.

I'm not sure if it is too much to fix. Perhaps hitting C-c ' twice to
re-start editing is a reasonable workaround.

Eric Schulte eric.schu...@gmx.com writes:

 You can find the name of the original org-mode buffer by running the
 following snippet of elisp within the edit buffer.

 ;; -*- emacs-lisp -*-
 (marker-buffer org-edit-src-beg-marker)

 The `org-src-in-org-buffer' macro may be used from an edit buffer to run
 elisp inside the code block, in the org-mode buffer of the edit buffer.
 e.g., the following 

 ;; -*- emacs-lisp -*-
 (org-src-in-org-buffer (message --%S (org-babel-get-src-block-info)))

Where is org-src-in-org-buffer macro defined. Searching all dot el files
in org folder does not show anything neither does C-h f show anything
similar.

-- 
Mikhail



Re: [O] [babel, ess] How can I make S-RET to be multi-session friendly?

2012-08-14 Thread Eric Schulte
Andrew Young younga...@gmail.com writes:

 Hello All,


Hi Andrew,


 Well, despite being relatively new to elisp, I've decided to take a
 crack at one of your problems. I'm not too sure what is causing the
 strange behaviour of the session property, but I have some thoughts on
 getting that one function working.


Thanks for sending this along, unfortunately ob-R.el is currently
without a core maintainer, so I'm not sure who on list would have the
expertise to review your submission.  Although hopefully those
experiencing the problem can at least check if it works for them.


 Bear with me :-)

 It seems that for me, the inferior ess process is not being properly
 associated with the src edit buffer.  It is being set correctly by
 org-babel-R-associate-session, and then being set a second time
 incorrectly by org-babel-edit-prep:R.  Commenting out line 5 in
 org-babel-edit-prep:R seems to fix this issue, although I'm honestly
 not sure if or what it breaks.  Everything seems ok for me, but ymmv.

 Heres the change:
 #+begin_src emacs-lisp
   (defun org-babel-edit-prep:R (info)
 (let ((session (cdr (assoc :session (nth 2 info)
   (when (and session (string-match ^\\*\\(.+?\\)\\*$ session))
 (save-match-data (org-babel-R-initiate-session session nil))
 ;;(setq ess-local-process-name (match-string 1 session)
 )))
 #+end_src


Perhaps replacing the commented setq ess-local-process-name line with
ess-switch-process could solve this problem?  Could the process name be
found programatically, perhaps using the regexp solution above.


 Is there any one having such issues, or who can weigh in on what
 exactly is happening here?

 Without making the above change, it is possible to manually attach an
 ess process to the current src buffer by using the command:

 C-c C-s (ess-switch-process)

 You'll have to specify the process name, rather than the buffer name,
 and the session must have already been started. From here all ESS
 functions should work. For example, calling:

 C-c C-z (ess-switch-to-end-of-ESS)

 will open the session buffer.

 I've implemented a variation of the function you mentioned, which uses
 the inferior process discussed above.  It should do something at least
 remotely like the function you were asking for, and will work with
 babel sessions, as long as the ess process is associated
 properly. I've made one change worth mentioning: the function now
 prompts for a buffer name to set up on if no ess process is associated,
 instead of only and always using *R*.

 Try it out, and let me know what you think.  Of course feel free to
 tweak  share!  This is my real first dive into lisp, so if anyone has
 anything to share please do.

 #+begin_src emacs-lisp
   (defun my-ess-eval ()
 (interactive)
 (update-ess-process-name-list)
 (if (not (ess-make-buffer-current))
 ;; Obtain the target ess session
 (let ((session
(read-string Use session: 
 (let ((proc (get-process 
 ess-current-process-name)))
   (if (processp proc)
   (buffer-name (process-buffer proc)))
   ;; Obtain buffer matching session
   (if (not (get-buffer session))
   ;; If there is no buffer, create a new one
   (save-excursion
 (inferior-ess)
 (rename-buffer session)))
   (setq ess-local-process-name
 (process-name (get-buffer-process session)
 (ess-make-buffer-current)
 (if (and transient-mark-mode mark-active)
 (call-interactively 'ess-eval-region)
   (call-interactively 'ess-eval-line-and-step)))

 (add-hook 'ess-mode-hook
   '(lambda ()
  (local-set-key [(shift return)] 'my-ess-eval)))

 (add-hook 'inferior-ess-mode-hook
   '(lambda ()
  (local-set-key [C-up] 'comint-previous-input)
  (local-set-key [C-down] 'comint-next-input)))

 (add-hook 'Rnw-mode-hook
   '(lambda ()
  (local-set-key [(shift return)] 'my-ess-eval)))

   (require 'ess-site)

 #+end_src


This looks good to me, perhaps it should be added to the Worg page on
using R with Org-mode?

http://orgmode.org/worg/org-contrib/babel/languages/ob-doc-R.html

Thanks,


 Sincerely,
 Andrew Young


-- 
Eric Schulte
http://cs.unm.edu/~eschulte



Re: [O] [babel, ess] How can I make S-RET to be multi-session friendly?

2012-08-14 Thread Mikhail Titov
Eric Schulte eric.schu...@gmx.com writes:

 Thanks for sending this along, unfortunately ob-R.el is currently
 without a core maintainer

Quite a sad situation, many good modules lack maintainers :(

, so I'm not sure who on list would have the expertise to review your
submission.  Although hopefully those experiencing the problem can at
least check if it works for them.

I'm not an expert but I gave it a shot.

 It seems that for me, the inferior ess process is not being properly
 associated with the src edit buffer.  It is being set correctly by
 org-babel-R-associate-session, and then being set a second time
 incorrectly by org-babel-edit-prep:R.  Commenting out line 5 in
 org-babel-edit-prep:R seems to fix this issue, although I'm honestly
 not sure if or what it breaks.  Everything seems ok for me, but ymmv.

 Heres the change:
 #+begin_src emacs-lisp
   (defun org-babel-edit-prep:R (info)
 (let ((session (cdr (assoc :session (nth 2 info)
   (when (and session (string-match ^\\*\\(.+?\\)\\*$ session))
 (save-match-data (org-babel-R-initiate-session session nil))
 ;;(setq ess-local-process-name (match-string 1 session)
 )))
 #+end_src


 Perhaps replacing the commented setq ess-local-process-name line with
 ess-switch-process could solve this problem?  Could the process name be
 found programatically, perhaps using the regexp solution above.


 Is there any one having such issues, or who can weigh in on what
 exactly is happening here?

 Without making the above change, it is possible to manually attach an
 ess process to the current src buffer by using the command:

 C-c C-s (ess-switch-process)

 You'll have to specify the process name, rather than the buffer name,
 and the session must have already been started.

I would say that after applying changes to my-ess-eval and to
org-babel-edit-prep:R as suggested by Andrew, it looks like everything
is working right for me. Once I hit C-c ' I see properly named buffer
appear with new process. Then if I hit S-RET it asks me what session to
use and since I have ido mode, it already highlights proper session
name, so I just hit RET. Perhaps it worth recommending to use ido?

Note that I do not have to enter process name.

If I quite R, while editing code in a separate buffer, and hit S-RET it
is executed in the wrong one without any question being asked :(

I'm running somewhat recent bzr version of Emacs with default Org in it.

-- 
Mikhail



Re: [O] [babel, ess] How can I make S-RET to be multi-session friendly?

2012-08-14 Thread Bastien
Hi Mikhail,

Mikhail Titov m...@gmx.us writes:

 I would say that after applying changes to my-ess-eval and to
 org-babel-edit-prep:R as suggested by Andrew, it looks like everything
 is working right for me.

I'v been bold and I pushed the change Andrew suggested.

Thanks for reporting this and for testing around -- and thanks
to Andrew for the exploration and the fix! 

-- 
 Bastien



Re: [O] [babel, ess] How can I make S-RET to be multi-session friendly?

2012-08-11 Thread Andrew Young
Hello All,

Well, despite being relatively new to elisp, I've decided to take a
crack at one of your problems. I'm not too sure what is causing the
strange behaviour of the session property, but I have some thoughts on
getting that one function working.

Bear with me :-)

It seems that for me, the inferior ess process is not being properly
associated with the src edit buffer.  It is being set correctly by
org-babel-R-associate-session, and then being set a second time
incorrectly by org-babel-edit-prep:R.  Commenting out line 5 in
org-babel-edit-prep:R seems to fix this issue, although I'm honestly
not sure if or what it breaks.  Everything seems ok for me, but ymmv.

Heres the change:
#+begin_src emacs-lisp
  (defun org-babel-edit-prep:R (info)
(let ((session (cdr (assoc :session (nth 2 info)
  (when (and session (string-match ^\\*\\(.+?\\)\\*$ session))
(save-match-data (org-babel-R-initiate-session session nil))
;;(setq ess-local-process-name (match-string 1 session)
)))
#+end_src

Is there any one having such issues, or who can weigh in on what
exactly is happening here?

Without making the above change, it is possible to manually attach an
ess process to the current src buffer by using the command:

C-c C-s (ess-switch-process)

You'll have to specify the process name, rather than the buffer name,
and the session must have already been started. From here all ESS
functions should work. For example, calling:

C-c C-z (ess-switch-to-end-of-ESS)

will open the session buffer.

I've implemented a variation of the function you mentioned, which uses
the inferior process discussed above.  It should do something at least
remotely like the function you were asking for, and will work with
babel sessions, as long as the ess process is associated
properly. I've made one change worth mentioning: the function now
prompts for a buffer name to set up on if no ess process is associated,
instead of only and always using *R*.

Try it out, and let me know what you think.  Of course feel free to
tweak  share!  This is my real first dive into lisp, so if anyone has
anything to share please do.

#+begin_src emacs-lisp
  (defun my-ess-eval ()
(interactive)
(update-ess-process-name-list)
(if (not (ess-make-buffer-current))
;; Obtain the target ess session
(let ((session
   (read-string Use session: 
(let ((proc (get-process ess-current-process-name)))
  (if (processp proc)
  (buffer-name (process-buffer proc)))
  ;; Obtain buffer matching session
  (if (not (get-buffer session))
  ;; If there is no buffer, create a new one
  (save-excursion
(inferior-ess)
(rename-buffer session)))
  (setq ess-local-process-name
(process-name (get-buffer-process session)
(ess-make-buffer-current)
(if (and transient-mark-mode mark-active)
(call-interactively 'ess-eval-region)
  (call-interactively 'ess-eval-line-and-step)))

(add-hook 'ess-mode-hook
  '(lambda ()
 (local-set-key [(shift return)] 'my-ess-eval)))

(add-hook 'inferior-ess-mode-hook
  '(lambda ()
 (local-set-key [C-up] 'comint-previous-input)
 (local-set-key [C-down] 'comint-next-input)))

(add-hook 'Rnw-mode-hook
  '(lambda ()
 (local-set-key [(shift return)] 'my-ess-eval)))

  (require 'ess-site)

#+end_src

Sincerely,
Andrew Young



Re: [O] [babel, ess] How can I make S-RET to be multi-session friendly?

2012-08-10 Thread Eric Schulte
Mikhail Titov m...@gmx.us writes:

 Hello!

 There is a wonderful post[1] on how to make S-RET to do handy things in
 ESS mode. However I often find myself working on several Org documents
 from different folders.

 It is quite inconvenient to change a directory in =*R*= buffer each
 time I work on different document.

 Is there a neat way to somehow reuse Org mode property =session= that I
 set buffer wide?


I'm not sure what you mean by reuse.  All of the information for how
to set header arguments in available at (info (org) Using header arguments)


 Also for some reason

 #+PROPERTY: session *Rsomename*

 does not override session name set in
 =org-babel-default-header-args:R= even after =C-c C-c= on it when I
 re-evaluate babel code block with =C-c C-c= on code block, while
 explicit block header =:session *Rsomename*= makes difference.


Yes, the order of precedence is

system-level  buffer/subtree-level  language-level  code-block-level


 ,[ snippet from dot emacs ]
 | (setq org-babel-default-header-args:R
 |   '((:results . output) (:session . *R*)))
 `


Given that (:session . *R*) will be used by default you could simply
remove it from your custom setting for org-babel-default-header-args.

Best,


 I'm running Org-mode version 7.8.10 (release_7.8.10-658-g451191.dirty)

 Footnotes: 
 [1]
 http://www.kieranhealy.org/blog/archives/2009/10/12/make-shift-enter-do-a-lot-in-ess/

-- 
Eric Schulte
http://cs.unm.edu/~eschulte



Re: [O] [babel, ess] How can I make S-RET to be multi-session friendly?

2012-08-10 Thread Mikhail Titov
Eric Schulte eric.schu...@gmx.com writes:

 There is a wonderful post[1] on how to make S-RET to do handy things in
 ESS mode. However I often find myself working on several Org documents
 from different folders.

 It is quite inconvenient to change a directory in =*R*= buffer each
 time I work on different document.

 Is there a neat way to somehow reuse Org mode property =session= that I
 set buffer wide?


 I'm not sure what you mean by reuse.  All of the information for how
 to set header arguments in available at (info (org) Using header
 arguments)

Here is the outline of what I have and what I'm doing.

As I mentioned I set default :session header for R to *R*. In my file I have
something like

#+PROPERTY: session *Rreport*

Whenever I C-c C-c on code block, I can see that *R* buffer
was created instead of *Rreport* !

Now, if I edit my code block with C-c ' and hit S-RET on any line, it
evaluates in *R* whereas I'd prefer it to be *Rreport* somehow. I
understand that I'm trying to somewhat mix ob with plain
ESS. Nevertheless I wonder if it is somehow possible.

 Also for some reason

 #+PROPERTY: session *Rsomename*

 does not override session name set in
 =org-babel-default-header-args:R= even after =C-c C-c= on it when I
 re-evaluate babel code block with =C-c C-c= on code block, while
 explicit block header =:session *Rsomename*= makes difference.


 Yes, the order of precedence is

 system-level  buffer/subtree-level  language-level 
 code-block-level

Then I'd say buffer level does NOT override system-level for some
reason. I just re-built Emacs from bzr to make sure I'm running somewhat
recent Org.

Another weird thing is that when I tried to use Org from git (and not
the stock one), Emacs freezes deadly on
(org-clock-persistence-insinuate) unless I kill ntvdm.exe with Task
Manager (I'm on Windows). But I guess it is a separate story.

 ,[ snippet from dot emacs ]
 | (setq org-babel-default-header-args:R
 |   '((:results . output) (:session . *R*)))
 `


 Given that (:session . *R*) will be used by default you could simply
 remove it from your custom setting for org-babel-default-header-args.

This made a trick. Now indeed I have *Rreport* after C-c C-c on code
block. However after C-c ' whenever I attempt to S-RET, yet another *R*
is launched every time instead of evaluating a line.

So the question perhaps is:

How to alter [1] such that when I edit code block with C-c ' , S-RET
executes lines in a proper session. I believe all information is in
there, I just have no clue how would I extract it, e.g. to which main
buffer that code editing buffer (I don't know the right name for it)
belongs to, and what session header is set to in that buffer.

If there is a way to fetch those, perhaps I'd be able to alter original
set up in [1].

 Footnotes: 
 [1]
 http://www.kieranhealy.org/blog/archives/2009/10/12/make-shift-enter-do-a-lot-in-ess/

-- 
Mikhail



Re: [O] [babel, ess] How can I make S-RET to be multi-session friendly?

2012-08-10 Thread Eric Schulte

 Yes, the order of precedence is

 system-level  buffer/subtree-level  language-level 
 code-block-level

 Then I'd say buffer level does NOT override system-level for some
 reason.

I believe you mean the buffer-level does not override the
language-level.

 I just re-built Emacs from bzr to make sure I'm running somewhat
 recent Org.

 Another weird thing is that when I tried to use Org from git (and not
 the stock one), Emacs freezes deadly on
 (org-clock-persistence-insinuate) unless I kill ntvdm.exe with Task
 Manager (I'm on Windows). But I guess it is a separate story.


I have no idea what could be causing the above, but it seems unrelated.


 ,[ snippet from dot emacs ]
 | (setq org-babel-default-header-args:R
 |   '((:results . output) (:session . *R*)))
 `


 Given that (:session . *R*) will be used by default you could simply
 remove it from your custom setting for org-babel-default-header-args.

 This made a trick. Now indeed I have *Rreport* after C-c C-c on code
 block. However after C-c ' whenever I attempt to S-RET, yet another *R*
 is launched every time instead of evaluating a line.

 So the question perhaps is:

 How to alter [1] such that when I edit code block with C-c ' , S-RET
 executes lines in a proper session. I believe all information is in
 there, I just have no clue how would I extract it, e.g. to which main
 buffer that code editing buffer (I don't know the right name for it)
 belongs to, and what session header is set to in that buffer.

 If there is a way to fetch those, perhaps I'd be able to alter original
 set up in [1].


You can find the name of the original org-mode buffer by running the
following snippet of elisp within the edit buffer.

;; -*- emacs-lisp -*-
(marker-buffer org-edit-src-beg-marker)

The `org-src-in-org-buffer' macro may be used from an edit buffer to run
elisp inside the code block, in the org-mode buffer of the edit buffer.
e.g., the following 

;; -*- emacs-lisp -*-
(org-src-in-org-buffer (message --%S (org-babel-get-src-block-info)))

Best,


 Footnotes: 
 [1]
 http://www.kieranhealy.org/blog/archives/2009/10/12/make-shift-enter-do-a-lot-in-ess/

-- 
Eric Schulte
http://cs.unm.edu/~eschulte



[O] [babel, ess] How can I make S-RET to be multi-session friendly?

2012-08-09 Thread Mikhail Titov
Hello!

There is a wonderful post[1] on how to make S-RET to do handy things in
ESS mode. However I often find myself working on several Org documents
from different folders.

It is quite inconvenient to change a directory in =*R*= buffer each time
I work on different document.

Is there a neat way to somehow reuse Org mode property =session= that I
set buffer wide?

Also for some reason

#+PROPERTY: session *Rsomename*

does not override session name set in =org-babel-default-header-args:R=
even after =C-c C-c= on it when I re-evaluate babel code block with =C-c
C-c= on code block, while explicit block header =:session *Rsomename*=
makes difference.

,[ snippet from dot emacs ]
| (setq org-babel-default-header-args:R
|   '((:results . output) (:session . *R*)))
`

I'm running Org-mode version 7.8.10 (release_7.8.10-658-g451191.dirty)

Footnotes: 
[1]  
http://www.kieranhealy.org/blog/archives/2009/10/12/make-shift-enter-do-a-lot-in-ess/

-- 
Mikhail



Re: [O] [babel, ess] How can I make S-RET to be multi-session friendly?

2012-08-09 Thread Achim Gratz
Mikhail Titov writes:
 I'm running Org-mode version 7.8.10 (release_7.8.10-658-g451191.dirty)

No you don't... please do

git fetch --tags origin

Can't help with your question, sorry.


Regards,
Achim.
-- 
+[Q+ Matrix-12 WAVE#46+305 Neuron microQkb Andromeda XTk Blofeld]+

Waldorf MIDI Implementation  additional documentation:
http://Synth.Stromeko.net/Downloads.html#WaldorfDocs