summaryrefslogtreecommitdiff
path: root/lisp
diff options
context:
space:
mode:
authorLin Sun <sunlin7@hotmail.com>2024-04-27 06:54:27 +0000
committerEli Zaretskii <eliz@gnu.org>2024-05-02 12:56:31 +0300
commitb2e92c746eb7d1135d3d4ccecc774d79555ffb99 (patch)
tree09e6292e053fdf3b3558e98a653e7740d14c6401 /lisp
parentbf00762745c07816e7a9c64e0fce037039852971 (diff)
downloademacs-b2e92c746eb7d1135d3d4ccecc774d79555ffb99.tar.gz
New function 'python-shell-send-block' for python-mode
* lisp/progmodes/python.el (python-shell-send-block): New function. * test/lisp/progmodes/python-tests.el (python-test--shell-send-block): Test case for the new function. * etc/NEWS: Document 'python-shell-send-block'. (Bug#70609)
Diffstat (limited to 'lisp')
-rw-r--r--lisp/progmodes/python.el25
1 files changed, 25 insertions, 0 deletions
diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el
index ecbec18f518..57cdf68fc25 100644
--- a/lisp/progmodes/python.el
+++ b/lisp/progmodes/python.el
@@ -350,6 +350,7 @@ To customize the Python interpreter for interactive use, modify
(define-key map "\C-c\C-e" #'python-shell-send-statement)
(define-key map "\C-c\C-r" #'python-shell-send-region)
(define-key map "\C-\M-x" #'python-shell-send-defun)
+ (define-key map "\C-c\C-b" #'python-shell-send-block)
(define-key map "\C-c\C-c" #'python-shell-send-buffer)
(define-key map "\C-c\C-l" #'python-shell-send-file)
(define-key map "\C-c\C-z" #'python-shell-switch-to-shell)
@@ -390,6 +391,8 @@ To customize the Python interpreter for interactive use, modify
:help "Switch to running inferior Python process"]
["Eval string" python-shell-send-string
:help "Eval string in inferior Python session"]
+ ["Eval block" python-shell-send-block
+ :help "Eval block in inferior Python session"]
["Eval buffer" python-shell-send-buffer
:help "Eval buffer in inferior Python session"]
["Eval statement" python-shell-send-statement
@@ -4141,6 +4144,27 @@ interactively."
(save-excursion (python-nav-end-of-statement))
send-main msg t)))
+(defun python-shell-send-block (&optional arg msg)
+ "Send the block at point to inferior Python process.
+The block is delimited by `python-nav-beginning-of-block' and
+`python-nav-end-of-block'. When optional argument ARG is non-nil, send
+the block body without its header. When optional argument MSG is
+non-nil, forces display of a user-friendly message if there's no process
+running; defaults to t when called interactively."
+ (interactive (list current-prefix-arg t))
+ (let ((beg (save-excursion
+ (when (python-nav-beginning-of-block)
+ (if (null arg)
+ (beginning-of-line)
+ (python-nav-end-of-statement)
+ (beginning-of-line 2)))
+ (point-marker)))
+ (end (save-excursion (python-nav-end-of-block)))
+ (python-indent-guess-indent-offset-verbose nil))
+ (if (and beg end)
+ (python-shell-send-region beg end nil msg t)
+ (user-error "Can't get code block from current position."))))
+
(defun python-shell-send-buffer (&optional send-main msg)
"Send the entire buffer to inferior Python process.
When optional argument SEND-MAIN is non-nil, allow execution of
@@ -7181,6 +7205,7 @@ implementations: `python-mode' and `python-ts-mode'."
python-nav-if-name-main
python-nav-up-list
python-remove-import
+ python-shell-send-block
python-shell-send-buffer
python-shell-send-defun
python-shell-send-statement