Subject: Re: bug#60142: 28.1; python.el Incorrect region when python-shell-send-region from indented code

From: Pierre Mercatoris <[email-masked]>
Date: Fri, 30 Dec 2022 14:14:58 +0100

Hello and sorry for the late reply..

Excuse my ignorance, but how would I need to go about to apply those
changes to test them?

Furthermore, I am not sure the main issue I raised has been diluted.
Basically I was wondering why a region, which does not include any
indentation (as it is a fragment of a line), is sent to the repl results in
indentation error if the life the fragment comes from was indented. In the
case Kobarty described above, he is mentioning sending the whole line to
the repl, in which case it can be debated how to deal with indentation.
However, my issue is that equivalent regions sent to the repl without any
indentation within them results in different behaviours depending on where
those regions (fragments of line) come from.

I hope I could explain myself better.

Thank you all for your interest in the matter.

On Thu, Dec 22, 2022 at 4:01 PM kobarity <[email-masked]> wrote:

> Augusto Stoffel wrote:
> > On Sun, 18 Dec 2022 at 12:39, Eli Zaretskii wrote:
> > >> If I select the `a` or `a = "test"` it will correctly send it to the
> > >> console, however it won't echo the evaluation of the statement.
> >
> > I can at least explain why this happens and is expected.
> >
> > An evaluation result is printed only if you send a bunch of statements,
> > the last of which is an expression.  OTOH, since whitespace is
> > significant in Python, if you evaluate anything that's not a "toplevel
> > form" it gets wrapper in a `if True:` statement, so the actually
> > evaluated code is not a simple expression anymore.
> >
> > It seems hard to work around this limitation.
>
> Sorry for the late reply.
>
> As Augusto explained, `if True:` is added to the indented region.
> This behavior is documented in `python-shell-buffer-substring'. Maybe
> it's better to add a reference to `python-shell-buffer-substring' in
> the docstring of `python-shell-send-region'.
>
> What I'm trying to do is to improve the behavior in some use cases.
> Specifically, there is no need to add `if True:` if the region
> consists of a single statement such as `a` or `a = "test"`.  Removing
> leading spaces should be enough to avoid an indentation error even if
> the single statement spans multiple lines.
>
> The corner case is the following use case.
>
> #+begin_src python
> if True:
>     s = """
>     a = 1
>     b = 2
> """
> #+end_src
>
> Let's assume we want to send the lines "a = 1" and "b = 1" only.
> Although they are part of a single statement (multiline string), `if
> True:` should be added to avoid an indentation error.  In other words,
> they should not be considered as a single statement.  To address such
> situation, the single statement check should be done after calling
> `narrow-to-region'.
>
> Attached is a patch to achieve this.  I appreciate your comments.
>
> Thanks,
>