From f91baed57ab474fee68522ba3a94e6eb43e83cb0 Mon Sep 17 00:00:00 2001 From: Valentin Boettcher Date: Tue, 21 Jan 2025 12:26:19 -0500 Subject: [PATCH] make the run defun more robust --- py-vterm-interaction.el | 70 ++++++++++++++++++++++++----------------- 1 file changed, 42 insertions(+), 28 deletions(-) diff --git a/py-vterm-interaction.el b/py-vterm-interaction.el index ce583ba..fe03506 100644 --- a/py-vterm-interaction.el +++ b/py-vterm-interaction.el @@ -560,36 +560,50 @@ point, the cell is assumed to end with the buffer." "Send the current function the Python REPL and paste its name, ready to run. If the function has no arguments, the function call is run immediately." (interactive) - (let* ((function-name-regex "def[ \t]+\\([a-zA-Z_][a-zA-Z0-9_]*\\)[ \t]*(\\(.*\\)):")) - (save-mark-and-excursion - (python-mark-defun) - (let ((name-found (save-mark-and-excursion (re-search-forward function-name-regex (mark) t)))) - (if name-found - (let ((name (match-string 1)) - (args (match-string 2)) - (py-vterm-interaction-paste-with-return nil) - (begin (region-beginning)) - (end (region-end))) + (save-mark-and-excursion + ;; (let ((last-mark (mark))) + ;; (python-mark-defun) + ;; (while (not (eq (mark) last-mark)) + ;; (setf last-mark (mark)) + ;; (python-mark-defun 1))) + ;; (mark (region-beginning)) + ;; (next-line) + ;; (cl-return) + (let ((begin (save-mark-and-excursion + (python-nav-beginning-of-defun 1) + (point))) + (end (save-mark-and-excursion + (python-nav-end-of-defun) + (point)))) + (python-nav-beginning-of-defun 1) + (next-line) + (let ((function-name-regex "def[ \t]+\\([a-zA-Z_][a-zA-Z0-9_]*\\)[ \t]*(\\(.*\\))\\([ \t]*->[ \t]*.*?\\)?:")) + (save-match-data + (let ((name-found (re-search-backward function-name-regex nil nil))) + (if name-found + (progn + (let ((name (match-string 1)) + (args (match-string 2)) + (py-vterm-interaction-paste-with-return nil)) - ;; capture decorators too - (save-excursion - (while - (progn (forward-line -1) - (beginning-of-line) - (if (looking-at "@") - (setq begin (point)) - nil)))) + ;; capture decorators too + (save-excursion + (while + (progn (forward-line -1) + (beginning-of-line) + (if (looking-at "@") + (setq begin (point)) + nil)))) - (let ((func (buffer-substring-no-properties begin end))) - (py-vterm-interaction--send-maybe-silent func name) - (py-vterm-interaction-send-return-key)) - - (if (string-empty-p args) - (progn - (py-vterm-interaction-paste-string (format "%s()" name)) - (py-vterm-interaction-send-return-key)) - (py-vterm-interaction-paste-string (format "%s(" name)))) - (message "No function found")))))) + (let ((func (buffer-substring-no-properties begin end))) + (py-vterm-interaction--send-maybe-silent func name) + (py-vterm-interaction-send-return-key)) + (if (= 0 (length args)) + (progn + (py-vterm-interaction-paste-string (format "%s() " name)) + (py-vterm-interaction-send-return-key)) + (py-vterm-interaction-paste-string (format "%s(" name))))) + (message "No function found")))))))) (defun py-vterm-interaction-send-buffer () "Send the whole content of the script buffer to the Python REPL line by line."