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:27:26 +0000 Message-ID: References: <87h8trtyoa.fsf@kyleam.com> Mime-Version: 1.0 Content-Type: multipart/alternative; boundary="001a11c1663e2a34c0055e4d8d2a" Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:40327) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eGGGk-0003M3-3K for emacs-orgmode@gnu.org; Sat, 18 Nov 2017 22:27:44 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eGGGg-00019z-TJ for emacs-orgmode@gnu.org; Sat, 18 Nov 2017 22:27:42 -0500 Received: from mail-oi0-f47.google.com ([209.85.218.47]:36701) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1eGGGg-000192-Ko for emacs-orgmode@gnu.org; Sat, 18 Nov 2017 22:27:38 -0500 Received: by mail-oi0-f47.google.com with SMTP id n16so4181975oig.3 for ; Sat, 18 Nov 2017 19:27:38 -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 --001a11c1663e2a34c0055e4d8d2a Content-Type: text/plain; charset="UTF-8" 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 >> > > --001a11c1663e2a34c0055e4d8d2a Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hello Jack:

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

I tried your example on Em= acs 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 j= ust by updating org-mode.

Regards,

<= /div>

Martin

<= div dir=3D"ltr">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 pat= ch to the current master branch. I also extended it to work for ":resu= lts value" (the original patch only worked for ":results output&q= uot;). I did this by not writing the last line of the code block to the tmp= file, unless it is indented.

I've never contributed = before so would appreciate any comments on this patch, and how to get it ac= cepted. Cheers, Jack.

From a5d553ece9f6ee35cd= 1e273e554a21a19e80ec3c 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>
<= div>Date: Sat, 18 Nov 2017 21:47:09 +0000
Subject: [PATCH] fix ne= wline/indentation issues in ob-python :session

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

di= ff --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.= "
=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 (indented-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--rep= lace-body-tmpfile body)
+=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 (resu= lts
=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))

+
+(defun org-babel-python--= indented-p (input)
+=C2=A0 =C2=A0 =C2=A0"Non-nil if any line= in INPUT is indented."
+=C2=A0 =C2=A0 =C2=A0(string-match-p= "^[ \t]" input))
+
+(defun org-babel-python-= -replace-body-tmpfile (body)
+=C2=A0 "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"
+=C2=A0 (let* ((tmp-file (org-= babel-temp-file "python-"))
+=C2=A0 =C2=A0 =C2=A0 =C2= =A0 (lines (split-string body "\n" t))
+=C2=A0 =C2=A0 = =C2=A0 =C2=A0 (lastline (car (last lines)))
+=C2=A0 =C2=A0 =C2=A0= =C2=A0 (newbody (concat
+=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 "__pyfile =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 ")); &= quot;
+=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]" 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(insert (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) "\n")))
+=C2=A0 =C2=A0 =C2=A0 (c= oncat newbody "\n" lastline)))
+=C2=A0 )
+
=C2=A0(provide 'ob-python)


<= div>--
2.15.0


On Sat, Nov 18, 2017 at = 3:05 PM, Kyle Meyer <kyle@kyleam.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

--001a11c1663e2a34c0055e4d8d2a--