From af013e0d4a76f0a2fd4a0e76912e8e49ae86ec2e Mon Sep 17 00:00:00 2001 From: =?utf8?q?Fabi=C3=A1n=20Ezequiel=20Gallina?= Date: Sun, 23 Aug 2015 19:55:54 -0300 Subject: [PATCH] python.el: Fix python-shell-buffer-substring on indented code Fixes: debbugs:21086 * lisp/progmodes/python.el (python-shell-buffer-substring): Respect current line indentation when calculating string. * test/automated/python-tests.el (python-shell-buffer-substring-10) (python-shell-buffer-substring-11) (python-shell-buffer-substring-12): New tests. --- lisp/progmodes/python.el | 23 +++++++------- test/automated/python-tests.el | 55 ++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+), 10 deletions(-) diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el index fbe5b8b0743..abae8aff47b 100644 --- a/lisp/progmodes/python.el +++ b/lisp/progmodes/python.el @@ -2986,29 +2986,32 @@ the python shell: coding cookie is added. 4. Wraps indented regions under an \"if True:\" block so the interpreter evaluates them correctly." - (let* ((substring (buffer-substring-no-properties start end)) + (let* ((start (save-excursion + ;; Normalize start to the line beginning position. + (goto-char start) + (line-beginning-position))) + (substring (buffer-substring-no-properties start end)) (starts-at-point-min-p (save-restriction (widen) (= (point-min) start))) (encoding (python-info-encoding)) + (toplevel-p (zerop (save-excursion + (goto-char start) + (python-util-forward-comment 1) + (current-indentation)))) (fillstr (when (not starts-at-point-min-p) (concat (format "# -*- coding: %s -*-\n" encoding) (make-string ;; Subtract 2 because of the coding cookie. - (- (line-number-at-pos start) 2) ?\n)))) - (toplevel-block-p (save-excursion - (goto-char start) - (or (zerop (line-number-at-pos start)) - (progn - (python-util-forward-comment 1) - (zerop (current-indentation))))))) + (- (line-number-at-pos start) 2) ?\n))))) (with-temp-buffer (python-mode) - (if fillstr (insert fillstr)) + (when fillstr + (insert fillstr)) (insert substring) (goto-char (point-min)) - (when (not toplevel-block-p) + (when (not toplevel-p) (insert "if True:") (delete-region (point) (line-end-position))) (when nomain diff --git a/test/automated/python-tests.el b/test/automated/python-tests.el index e792b0f1a1a..30b1b480a25 100644 --- a/test/automated/python-tests.el +++ b/test/automated/python-tests.el @@ -3276,6 +3276,61 @@ class Foo(models.Model): ")))) +(ert-deftest python-shell-buffer-substring-10 () + "Check substring from partial block." + (python-tests-with-temp-buffer + " +def foo(): + print ('a') +" + (should (string= (python-shell-buffer-substring + (python-tests-look-at "print ('a')") + (point-max)) + "if True: + + print ('a') +")))) + +(ert-deftest python-shell-buffer-substring-11 () + "Check substring from partial block and point within indentation." + (python-tests-with-temp-buffer + " +def foo(): + print ('a') +" + (should (string= (python-shell-buffer-substring + (progn + (python-tests-look-at "print ('a')") + (backward-char 1) + (point)) + (point-max)) + "if True: + + print ('a') +")))) + +(ert-deftest python-shell-buffer-substring-12 () + "Check substring from partial block and point in whitespace." + (python-tests-with-temp-buffer + " +def foo(): + + # Whitespace + + print ('a') +" + (should (string= (python-shell-buffer-substring + (python-tests-look-at "# Whitespace") + (point-max)) + "if True: + + + # Whitespace + + print ('a') +")))) + + ;;; Shell completion -- 2.39.5