|
From: | Pierre Mercatoris |
Subject: | bug#60142: 28.1; python.el Incorrect region when python-shell-send-region from indented code |
Date: | Fri, 30 Dec 2022 14:14:58 +0100 |
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,
[Prev in Thread] | Current Thread | [Next in Thread] |