ipython.exe (from Miniconda3), I'd like to highlight a portion of code and execute it in the associated inferior python buffer. Example:
#!/usr/bin/python3 myvar = 100+200 ^^^^^^^ (this is my selected region)
If I use
C-c C-c, it correctly sources the file. That's not what I want.
If I highlight the region as depicted above and use
C-c C-r (
python-shell-send-region), the entire line is executed, not just the region. That is,
myvar should not be defined by this step. I'd like to send just the highlight region.
So I created an edited version of
python-shell-buffer-substring, omitting the part that redefines
(let* ((start (save-excursion ;; Normalize start to the line beginning position. (goto-char start) (line-beginning-position)))
I also create
my-python-shell-send-region, where the only difference is it calls
my-python-shell-buffer-substring. This properly creates the substring
# -*- coding: utf-8 -*- 100+200
and sends it correctly to the inferior process. Except ... the output is inhibited (generally a good thing), and I'd like to see the output
300. I see the function
python-shell-send-string-no-output, but I don't see a way to allow output when using
Q: how to allow the output, and/or is there a better mechanism for doing this?
(In the unrelated package
ess, I use
C-u C-c C-r for show-no-output, and
C-c C-r when I want the output shown. I can deal with a reversal of this logic, that's not the issue for this question.)
emacs-25.2.1 (x86_64-w64-mingw32) and
After some more digging (thanks wvxvw), I found that removing the inserted
# -*- coding: utf-8 -*- line from the pasted string allowed the inferior process to print the output, but only on single-line regions. For instance:
#!/usr/bin/python3 myvar = 100+200 200+300
100+200 produced the output
300, good. Highlighting from
300 on the next line, however, produced no output. If the highlighted string is on a single line and contains semicolon-delimited commands (e.g.,
100+200;200+300), then the output from the last command is shown, nothing else (which is, I believe, correct behavior for python.) So the problem remains with multi-line regions.
comint-output-filter-functions, then it will be called with the output that would be sent to the comint buffer, our you could entirely bypass
comintand get hold of the process associated with the buffer, temporarily modify its
filter-output-functionto collect the results, and then restore it to the previous state.