From mboxrd@z Thu Jan 1 00:00:00 1970 From: Martin Alsinet Subject: Re: ob-python newline & indentation behavior Date: Sun, 19 Nov 2017 03:34:29 +0000 Message-ID: References: <87h8trtyoa.fsf@kyleam.com> Mime-Version: 1.0 Content-Type: multipart/alternative; boundary="001a113d178e5b6195055e4da654" Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:42578) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eGGNY-0005E0-Am for emacs-orgmode@gnu.org; Sat, 18 Nov 2017 22:34:46 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eGGNV-0004JU-53 for emacs-orgmode@gnu.org; Sat, 18 Nov 2017 22:34:44 -0500 Received: from mail-ot0-f175.google.com ([74.125.82.175]:42667) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1eGGNU-0004Ij-Tz for emacs-orgmode@gnu.org; Sat, 18 Nov 2017 22:34:41 -0500 Received: by mail-ot0-f175.google.com with SMTP id 18so5116380oty.9 for ; Sat, 18 Nov 2017 19:34:40 -0800 (PST) In-Reply-To: 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" To: Jack Kamm Cc: emacs-orgmode@gnu.org --001a113d178e5b6195055e4da654 Content-Type: text/plain; charset="UTF-8" Sorry Jack, I overlooked the :session bit. Disregard my email please On Sat, Nov 18, 2017 at 10:27 PM Martin Alsinet wrote: > Hello Jack: > > What versions of emacs and org-mode are you using? > > I tried your example on Emacs 25.3.1 and org-mode 9.1.2-22 and I got "20" > as result > It has happened to me in the past that some bug I was seeing goes away > just by updating org-mode. > > Regards, > > > Martin > > On Sat, Nov 18, 2017 at 5:16 PM Jack Kamm wrote: > >> Thanks Kyle, and sorry for missing that recent related thread. >> >> I adapted your old patch to the current master branch. I also extended it >> to work for ":results value" (the original patch only worked for ":results >> output"). I did this by not writing the last line of the code block to the >> tmpfile, unless it is indented. >> >> I've never contributed before so would appreciate any comments on this >> patch, and how to get it accepted. Cheers, Jack. >> >> From a5d553ece9f6ee35cd1e273e554a21a19e80ec3c Mon Sep 17 00:00:00 2001 >> >> From: Jack Kamm >> Date: Sat, 18 Nov 2017 21:47:09 +0000 >> Subject: [PATCH] fix newline/indentation issues in ob-python :session >> >> --- >> lisp/ob-python.el | 33 +++++++++++++++++++++++++++++++++ >> 1 file changed, 33 insertions(+) >> >> diff --git a/lisp/ob-python.el b/lisp/ob-python.el >> index 60ec5fa47..6623ef5fc 100644 >> --- a/lisp/ob-python.el >> +++ b/lisp/ob-python.el >> @@ -303,6 +303,10 @@ last statement in BODY, as elisp." >> (mapc (lambda (line) (insert line) (funcall >> send-wait)) >> (split-string body "[\r\n]")) >> (funcall send-wait))) >> + (indented-p (org-babel-python--indented-p body)) >> + (body (if indented-p >> + (org-babel-python--replace-body-tmpfile body) >> + body)) >> (results >> (pcase result-type >> (`output >> @@ -340,6 +344,35 @@ last statement in BODY, as elisp." >> (substring string 1 -1) >> string)) >> >> + >> +(defun org-babel-python--indented-p (input) >> + "Non-nil if any line in INPUT is indented." >> + (string-match-p "^[ \t]" input)) >> + >> +(defun org-babel-python--replace-body-tmpfile (body) >> + "Place body in tmpfile, and return string to exec the tmpfile. >> +If last line of body is not indented, place it at end of exec string >> +instead of tmpfile, so shell can see the result" >> + (let* ((tmp-file (org-babel-temp-file "python-")) >> + (lines (split-string body "\n" t)) >> + (lastline (car (last lines))) >> + (newbody (concat >> + (format "__pyfilename = '%s'; " tmp-file) >> + "__pyfile = open(__pyfilename); " >> + "exec(compile(" >> + "__pyfile.read(), __pyfilename, 'exec'" >> + ")); " >> + "__pyfile.close()"))) >> + (if (string-match-p "^[ \t]" lastline) >> + (progn >> + (with-temp-file tmp-file (insert body)) >> + newbody) >> + (with-temp-file tmp-file >> + (insert (mapconcat 'identity >> + (butlast lines) "\n"))) >> + (concat newbody "\n" lastline))) >> + ) >> + >> (provide 'ob-python) >> >> >> -- >> 2.15.0 >> >> >> On Sat, Nov 18, 2017 at 3:05 PM, Kyle Meyer wrote: >> >>> Hello, >>> >>> Jack Kamm writes: >>> >>> > ob-python newline & indentation behavior in :session is very ugly and >>> > possibly broken. For example, consider the following code block: >>> >>> [...] >>> >>> > There is a 2 year old patch that fixes this behavior but has not yet >>> > been incorporated: >>> > https://lists.gnu.org/archive/html/emacs-orgmode/2015-03/msg00505.html >>> >>> [...] >>> >>> > The patch follows the python.el behavior of using a temporary file and >>> > executing that from the shell. >>> > >>> > Could this patch, or something similar, be incorporated into org-mode, >>> > to fix this behavior? >>> >>> Here's what I said in a recent post about ob-python sessions: >>> >>> >>> https://lists.gnu.org/archive/html/emacs-orgmode/2017-10/msg00198.html >>> >>> I dropped my attempt to fix it because 1) I was still having trouble >>> getting a complete understanding of what the issue was and 2) I >>> didn't >>> have the motivation to spend time digging deeper because I don't use >>> ob-python (and in general am not a heavy Org-Babel user). Perhaps >>> you >>> or some other ob-python user could help make ob-python sessions more >>> robust? >>> >>> Perhaps you are the "you"? >>> >>> -- >>> Kyle >>> >> >> --001a113d178e5b6195055e4da654 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Sorry Jack, I overlooked the :session bit.
Disregard m= y email please


On Sat, Nov 18, 2017 at 10:27 PM Martin Alsinet <martin@alsinet.com.ar> wrote:
<= /div>
Hello Jack:

What versions of emacs and org-mode are you using?

<= /div>
I tried your example on Emacs 25.3.1 and org-mode 9.1.2-22 and I = got "20" as result
It has happened to me in the past th= at some bug I was seeing goes away just by updating org-mode.
Regards,


Martin

On Sat, Nov 18, 2017 at= 5:16 PM Jack Kamm <jackkamm@gmail.com> wrote:
Thanks Kyle, and sorry for missing that recent related = thread.

I adapted your old patch to the current mas= ter branch. I also extended it to work for ":results value" (the = original patch only worked for ":results output"). I did this by = not writing the last line of the code block to the tmpfile, unless it is in= dented.

I've never contributed before so would appre= ciate any comments on this patch, and how to get it accepted. Cheers, Jack.=

From a5d553ece9f6ee35cd1e273e554a21a19e80ec3= c Mon Sep 17 00:00:00 2001=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0=C2=A0
From: Jack Kamm <jackkamm@gmail.com>
Date: Sat, 18 Nov= 2017 21:47:09 +0000
Subject: [PATCH] fix newline/indentation iss= ues in ob-python :session

---
=C2=A0lisp= /ob-python.el | 33 +++++++++++++++++++++++++++++++++
=C2=A01 file= changed, 33 insertions(+)

diff --git a/lisp/ob-py= thon.el b/lisp/ob-python.el
index 60ec5fa47..6623ef5fc 100644
--- a/lisp/ob-python.el
+++ b/lisp/ob-python.el
= @@ -303,6 +303,10 @@ last statement in BODY, as elisp."
=C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0(mapc (lambda (line) (insert line) (funcall send-wait))
=C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0(split-string body "[\r\n]"))
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0(funcall send-wait)))
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 (ind= ented-p (org-babel-python--indented-p body))
+=C2=A0 =C2=A0 =C2= =A0 =C2=A0 (body (if indented-p
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (org-babel-python--replace-body-tmpfile bod= y)
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 body)= )
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (results
=C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(pcase result-type
=C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(`output
@@ -340,6 +344,35 = @@ last statement in BODY, as elisp."
=C2=A0 =C2=A0 =C2=A0 = =C2=A0(substring string 1 -1)
=C2=A0 =C2=A0 =C2=A0string))
<= div>
+
+(defun org-babel-python--indented-p (input)=
+=C2=A0 =C2=A0 =C2=A0"Non-nil if any line in INPUT is inden= ted."
+=C2=A0 =C2=A0 =C2=A0(string-match-p "^[ \t]"= ; input))
+
+(defun org-babel-python--replace-body-tmpf= ile (body)
+=C2=A0 "Place body in tmpfile, and return string= to exec the tmpfile.
+If last line of body is not indented, plac= e it at end of exec string
+instead of tmpfile, so shell can see = the result"
+=C2=A0 (let* ((tmp-file (org-babel-temp-file &q= uot;python-"))
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 (lines (split-st= ring body "\n" t))
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 (lastli= ne (car (last lines)))
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 (newbody (con= cat
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 (format "__pyfilename =3D '%s'; " tmp-file)
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 "__py= file =3D open(__pyfilename); "
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 "exec(compile("
+=C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 "__pyfile.= read(), __pyfilename, 'exec'"
+=C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ")); "
+=C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 "__pyfile.= close()")))
+=C2=A0 =C2=A0 (if (string-match-p "^[ \t]&= quot; lastline)
+=C2=A0 =C2=A0 =C2=A0 =C2=A0(progn
+=C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(with-temp-file tmp-file (insert body))
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0newbody)
+=C2=A0 =C2=A0 = =C2=A0 (with-temp-file tmp-file
+=C2=A0 =C2=A0 =C2=A0 =C2=A0(inse= rt (mapconcat 'identity
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (butlast lines) &qu= ot;\n")))
+=C2=A0 =C2=A0 =C2=A0 (concat newbody "\n&quo= t; lastline)))
+=C2=A0 )
+
=C2=A0(provide = 9;ob-python)


--
2.15.0


On Sat, Nov 18, 2017 at 3:05 PM, Kyle Meyer <kyle@k= yleam.com> wrote:
Hello,
Jack Kamm <jackk= amm@gmail.com> writes:

> ob-python newline & indentation behavior in :session is very ugly = and
> possibly broken. For example, consider the following code block:

[...]

> There is a 2 year old patch that fixes this behavior but has not yet > been incorporated:
> https://lists.gnu.org/arc= hive/html/emacs-orgmode/2015-03/msg00505.html

[...]

> The patch follows the python.el behavior of using a temporary file and=
> executing that from the shell.
>
> Could this patch, or something similar, be incorporated into org-mode,=
> to fix this behavior?

Here's what I said in a recent post about ob-python sessions:

=C2=A0 =C2=A0 https://lists.gn= u.org/archive/html/emacs-orgmode/2017-10/msg00198.html

=C2=A0 =C2=A0 I dropped my attempt to fix it because 1) I was still having = trouble
=C2=A0 =C2=A0 getting a complete understanding of what the issue was and 2)= I didn't
=C2=A0 =C2=A0 have the motivation to spend time digging deeper because I do= n't use
=C2=A0 =C2=A0 ob-python (and in general am not a heavy Org-Babel user).=C2= =A0 Perhaps you
=C2=A0 =C2=A0 or some other ob-python user could help make ob-python sessio= ns more
=C2=A0 =C2=A0 robust?

Perhaps you are the "you"?

--
Kyle

--001a113d178e5b6195055e4da654--