From 207cb73c182d432a00fef797428d3b79ab519287 Mon Sep 17 00:00:00 2001 From: Fabián Ezequiel Gallina Date: Mon, 26 Nov 2012 18:45:58 -0300 Subject: Fix Imenu regression. * progmodes/python.el: (python-nav-beginning-of-defun): Fix forward movement when statement(s) separates point from defun. (python-imenu-prev-index-position): New function. --- lisp/progmodes/python.el | 36 +++++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-) (limited to 'lisp/progmodes/python.el') diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el index 949b0252bf1..cfd3a73e1b0 100644 --- a/lisp/progmodes/python.el +++ b/lisp/progmodes/python.el @@ -33,7 +33,7 @@ ;; Implements Syntax highlighting, Indentation, Movement, Shell ;; interaction, Shell completion, Shell virtualenv support, Pdb ;; tracking, Symbol completion, Skeletons, FFAP, Code Check, Eldoc, -;; imenu. +;; Imenu. ;; Syntax highlighting: Fontification of code is provided and supports ;; python's triple quoted strings properly. @@ -169,10 +169,12 @@ ;; might guessed you should run `python-shell-send-buffer' from time ;; to time to get better results too. -;; imenu: This mode supports imenu in its most basic form, letting it +;; Imenu: This mode supports Imenu in its most basic form, letting it ;; build the necessary alist via `imenu-default-create-index-function' ;; by having set `imenu-extract-index-name-function' to -;; `python-info-current-defun'. +;; `python-info-current-defun' and +;; `imenu-prev-index-position-function' to +;; `python-imenu-prev-index-position'. ;; If you used python-mode.el you probably will miss auto-indentation ;; when inserting newlines. To achieve the same behavior you have @@ -1087,12 +1089,12 @@ With positive ARG search backwards, else search forwards." (beg-indentation (and (> arg 0) (save-excursion - (and (python-info-current-line-empty-p) - (python-util-forward-comment -1)) - (python-nav-beginning-of-statement) - (if (python-info-looking-at-beginning-of-defun) - (+ (current-indentation) python-indent-offset) - (current-indentation))))) + (while (and + (not (python-info-looking-at-beginning-of-defun)) + (python-nav-backward-block))) + (or (and (python-info-looking-at-beginning-of-defun) + (+ (current-indentation) python-indent-offset)) + 0)))) (found (progn (when (and (< arg 0) @@ -2870,6 +2872,19 @@ Interactively, prompt for symbol." "^Eldoc needs an inferior Python process running.") +;;; Imenu + +(defun python-imenu-prev-index-position () + "Python mode's `imenu-prev-index-position-function'." + (let ((found)) + (while (and (setq found + (re-search-backward python-nav-beginning-of-defun-regexp nil t)) + (not (python-info-looking-at-beginning-of-defun)))) + (and found + (python-info-looking-at-beginning-of-defun) + (python-info-current-defun)))) + + ;;; Misc helpers (defun python-info-current-defun (&optional include-type) @@ -3214,6 +3229,9 @@ if that value is non-nil." (set (make-local-variable 'imenu-extract-index-name-function) #'python-info-current-defun) + (set (make-local-variable 'imenu-prev-index-position-function) + #'python-imenu-prev-index-position) + (set (make-local-variable 'add-log-current-defun-function) #'python-info-current-defun) -- cgit v1.2.1 From 98f99594f7de9e6c1fd120059ed009ccf1223b50 Mon Sep 17 00:00:00 2001 From: Fabián Ezequiel Gallina Date: Mon, 26 Nov 2012 20:31:06 -0300 Subject: * progmodes/python.el: (python-indent-guess-indent-offset): If indentation is guessed make python-indent-offset variable buffer local. --- lisp/progmodes/python.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lisp/progmodes/python.el') diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el index cfd3a73e1b0..7cd59c0c1b4 100644 --- a/lisp/progmodes/python.el +++ b/lisp/progmodes/python.el @@ -647,7 +647,7 @@ These make `python-indent-calculate-indentation' subtract the value of (python-util-forward-comment) (current-indentation)))) (if indentation - (setq python-indent-offset indentation) + (set (make-local-variable 'python-indent-offset) indentation) (message "Can't guess python-indent-offset, using defaults: %s" python-indent-offset))))))) -- cgit v1.2.1 From 2c43a9adb2ba4904ac95e0d7be452536d003c37c Mon Sep 17 00:00:00 2001 From: Fabián Ezequiel Gallina Date: Tue, 11 Dec 2012 04:22:55 -0300 Subject: * progmodes/python.el (python-skeleton-class) (python-skeleton-def): Do not add space after defun name. --- lisp/progmodes/python.el | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'lisp/progmodes/python.el') diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el index 7cd59c0c1b4..98ba437d4ef 100644 --- a/lisp/progmodes/python.el +++ b/lisp/progmodes/python.el @@ -2681,17 +2681,17 @@ The skeleton will be bound to python-skeleton-NAME." (python-skeleton-define def nil "Function name: " - "def " str " (" ("Parameter, %s: " - (unless (equal ?\( (char-before)) ", ") - str) "):" \n - "\"\"\"" - "\"\"\"" \n - > _ \n) + "def " str "(" ("Parameter, %s: " + (unless (equal ?\( (char-before)) ", ") + str) "):" \n + "\"\"\"" - "\"\"\"" \n + > _ \n) (python-skeleton-define class nil "Class name: " - "class " str " (" ("Inheritance, %s: " - (unless (equal ?\( (char-before)) ", ") - str) + "class " str "(" ("Inheritance, %s: " + (unless (equal ?\( (char-before)) ", ") + str) & ")" | -2 ":" \n "\"\"\"" - "\"\"\"" \n -- cgit v1.2.1 From 66164d2f176b3f86ee5551b78f705d0fe776c611 Mon Sep 17 00:00:00 2001 From: Fabián Ezequiel Gallina Date: Sat, 29 Dec 2012 08:04:55 -0300 Subject: * progmodes/python.el: Remove cl dependency. (python-syntax-count-quotes): Replace incf call. (python-fill-string): Replace setf call. --- lisp/progmodes/python.el | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) (limited to 'lisp/progmodes/python.el') diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el index 67388c0339b..56a971f0c67 100644 --- a/lisp/progmodes/python.el +++ b/lisp/progmodes/python.el @@ -204,7 +204,6 @@ (require 'ansi-color) (require 'comint) -(eval-when-compile (require 'cl-lib)) ;; Avoid compiler warnings (defvar view-return-to-alist) @@ -529,7 +528,7 @@ is used to limit the scan." (while (and (< i 3) (or (not limit) (< (+ point i) limit)) (eq (char-after (+ point i)) quote-char)) - (cl-incf i)) + (setq i (1+ i))) i)) (defun python-syntax-stringify () @@ -2487,12 +2486,12 @@ JUSTIFY should be used (if applicable) as in `fill-paragraph'." JUSTIFY should be used (if applicable) as in `fill-paragraph'." (let* ((marker (point-marker)) (str-start-pos - (let ((m (make-marker))) - (setf (marker-position m) - (or (python-syntax-context 'string) - (and (equal (string-to-syntax "|") - (syntax-after (point))) - (point)))) m)) + (set-marker + (make-marker) + (or (python-syntax-context 'string) + (and (equal (string-to-syntax "|") + (syntax-after (point))) + (point))))) (num-quotes (python-syntax-count-quotes (char-after str-start-pos) str-start-pos)) (str-end-pos -- cgit v1.2.1 From 16768034b209fe12a6408866ac31688604b97375 Mon Sep 17 00:00:00 2001 From: Fabián Ezequiel Gallina Date: Sat, 29 Dec 2012 09:33:33 -0300 Subject: * progmodes/python.el (python-shell-send-region): Add blank lines for non sent code so backtraces remain correct. --- lisp/progmodes/python.el | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'lisp/progmodes/python.el') diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el index 56a971f0c67..a427e95c037 100644 --- a/lisp/progmodes/python.el +++ b/lisp/progmodes/python.el @@ -2008,7 +2008,14 @@ Returns the output. See `python-shell-send-string-no-output'." (defun python-shell-send-region (start end) "Send the region delimited by START and END to inferior Python process." (interactive "r") - (python-shell-send-string (buffer-substring start end) nil t)) + (python-shell-send-string + (concat + (let ((line-num (line-number-at-pos start))) + ;; When sending a region, add blank lines for non sent code so + ;; backtraces remain correct. + (make-string (1- line-num) ?\n)) + (buffer-substring start end)) + nil t)) (defun python-shell-send-buffer (&optional arg) "Send the entire buffer to inferior Python process. -- cgit v1.2.1 From ccb1c17e8bf1aa0d21bddd9fa37154a120657f52 Mon Sep 17 00:00:00 2001 From: Fabián Ezequiel Gallina Date: Sat, 29 Dec 2012 09:57:49 -0300 Subject: * progmodes/python.el: Support other commands triggering python-indent-line so indentation cycling continues to work. (python-indent-trigger-commands): New defcustom. (python-indent-line): Use it. --- lisp/progmodes/python.el | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) (limited to 'lisp/progmodes/python.el') diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el index a427e95c037..54a657a2593 100644 --- a/lisp/progmodes/python.el +++ b/lisp/progmodes/python.el @@ -607,6 +607,12 @@ It makes underscores and dots word constituent chars.") :group 'python :safe 'booleanp) +(defcustom python-indent-trigger-commands + '(indent-for-tab-command yas-expand yas/expand) + "Commands that might trigger a `python-indent-line' call." + :type '(repeat symbol) + :group 'python) + (define-obsolete-variable-alias 'python-indent 'python-indent-offset "24.3") @@ -905,20 +911,21 @@ Uses the offset calculated in indicated by the variable `python-indent-levels' to set the current indentation. -When the variable `last-command' is equal to -`indent-for-tab-command' or FORCE-TOGGLE is non-nil it cycles -levels indicated in the variable `python-indent-levels' by -setting the current level in the variable -`python-indent-current-level'. - -When the variable `last-command' is not equal to -`indent-for-tab-command' and FORCE-TOGGLE is nil it calculates -possible indentation levels and saves it in the variable -`python-indent-levels'. Afterwards it sets the variable -`python-indent-current-level' correctly so offset is equal -to (`nth' `python-indent-current-level' `python-indent-levels')" +When the variable `last-command' is equal to one of the symbols +inside `python-indent-trigger-commands' or FORCE-TOGGLE is +non-nil it cycles levels indicated in the variable +`python-indent-levels' by setting the current level in the +variable `python-indent-current-level'. + +When the variable `last-command' is not equal to one of the +symbols inside `python-indent-trigger-commands' and FORCE-TOGGLE +is nil it calculates possible indentation levels and saves it in +the variable `python-indent-levels'. Afterwards it sets the +variable `python-indent-current-level' correctly so offset is +equal to (`nth' `python-indent-current-level' +`python-indent-levels')" (or - (and (or (and (eq this-command 'indent-for-tab-command) + (and (or (and (memq this-command python-indent-trigger-commands) (eq last-command this-command)) force-toggle) (not (equal python-indent-levels '(0))) -- cgit v1.2.1 From df4758b82ea93b13bb659fb0084a951b3bd19190 Mon Sep 17 00:00:00 2001 From: Fabián Ezequiel Gallina Date: Mon, 31 Dec 2012 16:27:20 -0300 Subject: Backported revisions 2012-12-29T12:33:33Z!fgallina@gnu.org and 2012-12-29T12:57:49Z!fgallina@gnu.org from trunk. --- lisp/progmodes/python.el | 42 ++++++++++++++++++++++++++++-------------- 1 file changed, 28 insertions(+), 14 deletions(-) (limited to 'lisp/progmodes/python.el') diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el index 98ba437d4ef..89b85e10351 100644 --- a/lisp/progmodes/python.el +++ b/lisp/progmodes/python.el @@ -597,6 +597,12 @@ It makes underscores and dots word constituent chars.") :group 'python :safe 'booleanp) +(defcustom python-indent-trigger-commands + '(indent-for-tab-command yas-expand yas/expand) + "Commands that might trigger a `python-indent-line' call." + :type '(repeat symbol) + :group 'python) + (define-obsolete-variable-alias 'python-indent 'python-indent-offset "24.3") @@ -895,20 +901,21 @@ Uses the offset calculated in indicated by the variable `python-indent-levels' to set the current indentation. -When the variable `last-command' is equal to -`indent-for-tab-command' or FORCE-TOGGLE is non-nil it cycles -levels indicated in the variable `python-indent-levels' by -setting the current level in the variable -`python-indent-current-level'. - -When the variable `last-command' is not equal to -`indent-for-tab-command' and FORCE-TOGGLE is nil it calculates -possible indentation levels and saves it in the variable -`python-indent-levels'. Afterwards it sets the variable -`python-indent-current-level' correctly so offset is equal -to (`nth' `python-indent-current-level' `python-indent-levels')" +When the variable `last-command' is equal to one of the symbols +inside `python-indent-trigger-commands' or FORCE-TOGGLE is +non-nil it cycles levels indicated in the variable +`python-indent-levels' by setting the current level in the +variable `python-indent-current-level'. + +When the variable `last-command' is not equal to one of the +symbols inside `python-indent-trigger-commands' and FORCE-TOGGLE +is nil it calculates possible indentation levels and saves it in +the variable `python-indent-levels'. Afterwards it sets the +variable `python-indent-current-level' correctly so offset is +equal to (`nth' `python-indent-current-level' +`python-indent-levels')" (or - (and (or (and (eq this-command 'indent-for-tab-command) + (and (or (and (memq this-command python-indent-trigger-commands) (eq last-command this-command)) force-toggle) (not (equal python-indent-levels '(0))) @@ -1998,7 +2005,14 @@ Returns the output. See `python-shell-send-string-no-output'." (defun python-shell-send-region (start end) "Send the region delimited by START and END to inferior Python process." (interactive "r") - (python-shell-send-string (buffer-substring start end) nil t)) + (python-shell-send-string + (concat + (let ((line-num (line-number-at-pos start))) + ;; When sending a region, add blank lines for non sent code so + ;; backtraces remain correct. + (make-string (1- line-num) ?\n)) + (buffer-substring start end)) + nil t)) (defun python-shell-send-buffer (&optional arg) "Send the entire buffer to inferior Python process. -- cgit v1.2.1 From 5b63c74a1781125074c4a0e83a7cc9e655c08874 Mon Sep 17 00:00:00 2001 From: Fabián Ezequiel Gallina Date: Mon, 31 Dec 2012 16:35:57 -0300 Subject: * progmodes/python.el: Bump defgroup :version to 24.3. --- lisp/progmodes/python.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lisp/progmodes/python.el') diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el index 89b85e10351..90e0d604217 100644 --- a/lisp/progmodes/python.el +++ b/lisp/progmodes/python.el @@ -222,7 +222,7 @@ (defgroup python nil "Python Language's flying circus support for Emacs." :group 'languages - :version "23.2" + :version "24.3" :link '(emacs-commentary-link "python")) -- cgit v1.2.1 From 6861432ebdc503bbf0f8886679d169c16060626b Mon Sep 17 00:00:00 2001 From: Fabián Ezequiel Gallina Date: Mon, 31 Dec 2012 17:58:57 -0300 Subject: * progmodes/python.el (python-nav-end-of-statement): Rewrite in order to improve efficiency (Based on Daniel Colascione's patch). Fixes: debbugs:13182 --- lisp/progmodes/python.el | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) (limited to 'lisp/progmodes/python.el') diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el index 90e0d604217..c168b3813ff 100644 --- a/lisp/progmodes/python.el +++ b/lisp/progmodes/python.el @@ -1177,16 +1177,27 @@ Returns nil if point is not in a def or class." (forward-line -1)))) (point-marker)) -(defun python-nav-end-of-statement () - "Move to end of current statement." +(defun python-nav-end-of-statement (&optional noend) + "Move to end of current statement. +Optional argument NOEND is internal and makes the logic to not +jump to the end of line when moving forward searching for the end +of the statement." (interactive "^") - (while (and (goto-char (line-end-position)) - (not (eobp)) - (when (or - (python-info-line-ends-backslash-p) - (python-syntax-context 'string) - (python-syntax-context 'paren)) - (forward-line 1)))) + (let (string-start bs-pos) + (while (and (or noend (goto-char (line-end-position))) + (not (eobp)) + (cond ((setq string-start (python-syntax-context 'string)) + (goto-char string-start) + (python-nav-end-of-statement t)) + ((python-syntax-context 'paren) + ;; The statement won't end before we've escaped + ;; at least one level of parenthesis. + (condition-case err + (goto-char (scan-lists (point) 1 -1)) + (scan-error (goto-char (nth 3 err))))) + ((setq bs-pos (python-info-line-ends-backslash-p)) + (goto-char bs-pos) + (forward-line 1)))))) (point-marker)) (defun python-nav-backward-statement (&optional arg) -- cgit v1.2.1 From ab422c4d6899b1442cb6954c1829c1fb656b006c Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Tue, 1 Jan 2013 09:11:05 +0000 Subject: Update copyright notices for 2013. --- lisp/progmodes/python.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lisp/progmodes/python.el') diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el index c168b3813ff..7294984fc4a 100644 --- a/lisp/progmodes/python.el +++ b/lisp/progmodes/python.el @@ -1,6 +1,6 @@ ;;; python.el --- Python's flying circus support for Emacs -;; Copyright (C) 2003-2012 Free Software Foundation, Inc. +;; Copyright (C) 2003-2013 Free Software Foundation, Inc. ;; Author: Fabián E. Gallina ;; URL: https://github.com/fgallina/python.el -- cgit v1.2.1 From 50620051800d14a47558fb4379d7cbae5d81f6a1 Mon Sep 17 00:00:00 2001 From: Fabián Ezequiel Gallina Date: Thu, 10 Jan 2013 00:44:12 -0300 Subject: * progmodes/python.el (python-nav-end-of-statement): Fix cornercase when handling multiline strings. --- lisp/progmodes/python.el | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) (limited to 'lisp/progmodes/python.el') diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el index 7294984fc4a..e58dfa169ef 100644 --- a/lisp/progmodes/python.el +++ b/lisp/progmodes/python.el @@ -1188,7 +1188,16 @@ of the statement." (not (eobp)) (cond ((setq string-start (python-syntax-context 'string)) (goto-char string-start) - (python-nav-end-of-statement t)) + (if (python-syntax-context 'paren) + ;; Ended up inside a paren, roll again. + (python-nav-end-of-statement t) + ;; This is not inside a paren, move to the + ;; end of this string. + (goto-char (+ (point) + (python-syntax-count-quotes + (char-after (point)) (point)))) + (or (re-search-forward (rx (syntax string-delimiter)) nil t) + (goto-char (point-max))))) ((python-syntax-context 'paren) ;; The statement won't end before we've escaped ;; at least one level of parenthesis. @@ -1302,7 +1311,7 @@ backward to previous block." "Safe version of standard `forward-sexp'. When ARG > 0 move forward, else if ARG is < 0." (or arg (setq arg 1)) - (let ((forward-sexp-function nil) + (let ((forward-sexp-function) (paren-regexp (if (> arg 0) (python-rx close-paren) (python-rx open-paren))) (search-fn -- cgit v1.2.1 From 345f866e048bdc11bc38d894a7eaaa47335443e2 Mon Sep 17 00:00:00 2001 From: Fabián Ezequiel Gallina Date: Wed, 23 Jan 2013 22:24:09 -0300 Subject: * lisp/progmodes/python.el: Enhancements to header documentation about skeletons. Fixes: debbugs:5716 --- lisp/progmodes/python.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'lisp/progmodes/python.el') diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el index e58dfa169ef..c321714e2f1 100644 --- a/lisp/progmodes/python.el +++ b/lisp/progmodes/python.el @@ -155,7 +155,10 @@ ;; dabbrev. If you have `dabbrev-mode' activated and ;; `python-skeleton-autoinsert' is set to t, then whenever you type ;; the name of any of those defined and hit SPC, they will be -;; automatically expanded. +;; automatically expanded. As an alternative you can use the defined +;; skeleton commands: `python-skeleton-class', `python-skeleton-def' +;; `python-skeleton-for', `python-skeleton-if', `python-skeleton-try' +;; and `python-skeleton-while'. ;; FFAP: You can find the filename for a given module when using ffap ;; out of the box. This feature needs an inferior python shell -- cgit v1.2.1 From e44970863d763264189e7ab98d6991a38dc95dc9 Mon Sep 17 00:00:00 2001 From: Fabián Ezequiel Gallina Date: Mon, 28 Jan 2013 18:59:42 -0300 Subject: * progmodes/python.el (python-shell-parse-command): Find python-shell-interpreter with modified environment. --- lisp/progmodes/python.el | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'lisp/progmodes/python.el') diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el index c321714e2f1..71c5ba57fa0 100644 --- a/lisp/progmodes/python.el +++ b/lisp/progmodes/python.el @@ -1654,7 +1654,11 @@ uniqueness for different types of configurations." (defun python-shell-parse-command () "Calculate the string used to execute the inferior Python process." - (format "%s %s" python-shell-interpreter python-shell-interpreter-args)) + (let ((process-environment (python-shell-calculate-process-environment)) + (exec-path (python-shell-calculate-exec-path))) + (format "%s %s" + (executable-find python-shell-interpreter) + python-shell-interpreter-args))) (defun python-shell-calculate-process-environment () "Calculate process environment given `python-shell-virtualenv-path'." -- cgit v1.2.1 From 6ff930c3d206417e4cec9429fa5d71bb5c9af541 Mon Sep 17 00:00:00 2001 From: Fabián Ezequiel Gallina Date: Wed, 30 Jan 2013 12:02:58 -0300 Subject: * progmodes/python.el (python-pdbtrack-comint-output-filter-function): Enhancements on stacktrace detection. (thanks @gnovak) --- lisp/progmodes/python.el | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) (limited to 'lisp/progmodes/python.el') diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el index 71c5ba57fa0..2a7a3765ac2 100644 --- a/lisp/progmodes/python.el +++ b/lisp/progmodes/python.el @@ -2317,15 +2317,17 @@ Argument OUTPUT is a string with the output from the comint process." (file-name (with-temp-buffer (insert full-output) - (goto-char (point-min)) - ;; OK, this sucked but now it became a cool hack. The - ;; stacktrace information normally is on the first line - ;; but in some cases (like when doing a step-in) it is - ;; on the second. - (when (or (looking-at python-pdbtrack-stacktrace-info-regexp) - (and - (forward-line) - (looking-at python-pdbtrack-stacktrace-info-regexp))) + ;; When the debugger encounters a pdb.set_trace() + ;; command, it prints a single stack frame. Sometimes + ;; it prints a bit of extra information about the + ;; arguments of the present function. When ipdb + ;; encounters an exception, it prints the _entire_ stack + ;; trace. To handle all of these cases, we want to find + ;; the _last_ stack frame printed in the most recent + ;; batch of output, then jump to the corrsponding + ;; file/line number. + (goto-char (point-max)) + (when (re-search-backward python-pdbtrack-stacktrace-info-regexp nil t) (setq line-number (string-to-number (match-string-no-properties 2))) (match-string-no-properties 1))))) -- cgit v1.2.1 From d9c287e589bdb05c2c818e340946546868d34e04 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Fri, 1 Feb 2013 22:04:06 -0800 Subject: Spelling fixes. --- lisp/progmodes/python.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lisp/progmodes/python.el') diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el index 2cb108cc316..35c5ba19e33 100644 --- a/lisp/progmodes/python.el +++ b/lisp/progmodes/python.el @@ -2334,7 +2334,7 @@ Argument OUTPUT is a string with the output from the comint process." ;; encounters an exception, it prints the _entire_ stack ;; trace. To handle all of these cases, we want to find ;; the _last_ stack frame printed in the most recent - ;; batch of output, then jump to the corrsponding + ;; batch of output, then jump to the corresponding ;; file/line number. (goto-char (point-max)) (when (re-search-backward python-pdbtrack-stacktrace-info-regexp nil t) -- cgit v1.2.1 From dcbec5e2e6799049a0b3535986f4674d452970a3 Mon Sep 17 00:00:00 2001 From: Fabián Ezequiel Gallina Date: Wed, 13 Feb 2013 20:07:59 -0300 Subject: * progmodes/python.el (python-info-current-defun): Fix current defun detection. Fixes: debbugs:13618 --- lisp/progmodes/python.el | 87 ++++++++++++++++++++++++++++++------------------ 1 file changed, 54 insertions(+), 33 deletions(-) (limited to 'lisp/progmodes/python.el') diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el index 2a7a3765ac2..e611864e0c1 100644 --- a/lisp/progmodes/python.el +++ b/lisp/progmodes/python.el @@ -2936,40 +2936,61 @@ Optional argument INCLUDE-TYPE indicates to include the type of the defun. This function is compatible to be used as `add-log-current-defun-function' since it returns nil if point is not inside a defun." - (save-restriction - (widen) - (save-excursion - (end-of-line 1) - (let ((names) - (starting-indentation - (save-excursion - (and - (python-nav-beginning-of-defun 1) - ;; This extra number is just for checking code - ;; against indentation to work well on first run. - (+ (current-indentation) 4)))) - (starting-point (point))) - ;; Check point is inside a defun. - (when (and starting-indentation - (< starting-point + (save-restriction + (widen) + (save-excursion + (end-of-line 1) + (let ((names) + (starting-indentation (current-indentation)) + (starting-pos (point)) + (first-run t) + (last-indent) + (type)) + (catch 'exit + (while (python-nav-beginning-of-defun 1) + (when (and + (or (not last-indent) + (< (current-indentation) last-indent)) + (or + (and first-run (save-excursion - (python-nav-end-of-defun) - (point)))) - (catch 'exit - (while (python-nav-beginning-of-defun 1) - (when (< (current-indentation) starting-indentation) - (setq starting-indentation (current-indentation)) - (setq names - (cons - (if (not include-type) - (match-string-no-properties 1) - (mapconcat 'identity - (split-string - (match-string-no-properties 0)) " ")) - names))) - (and (= (current-indentation) 0) (throw 'exit t))))) - (and names - (mapconcat (lambda (string) string) names ".")))))) + ;; If this is the first run, we may add + ;; the current defun at point. + (setq first-run nil) + (goto-char starting-pos) + (python-nav-beginning-of-statement) + (beginning-of-line 1) + (looking-at-p + python-nav-beginning-of-defun-regexp))) + (< starting-pos + (save-excursion + (let ((min-indent + (+ (current-indentation) + python-indent-offset))) + (if (< starting-indentation min-indent) + ;; If the starting indentation is not + ;; within the min defun indent make the + ;; check fail. + starting-pos + ;; Else go to the end of defun and add + ;; up the current indentation to the + ;; ending position. + (python-nav-end-of-defun) + (+ (point) + (if (>= (current-indentation) min-indent) + (1+ (current-indentation)) + 0)))))))) + (setq last-indent (current-indentation)) + (if (or (not include-type) type) + (setq names (cons (match-string-no-properties 1) names)) + (let ((match (split-string (match-string-no-properties 0)))) + (setq type (car match)) + (setq names (cons (cadr match) names))))) + ;; Stop searching ASAP. + (and (= (current-indentation) 0) (throw 'exit t)))) + (and names + (concat (and type (format "%s " type)) + (mapconcat 'identity names "."))))))) (defun python-info-current-symbol (&optional replace-self) "Return current symbol using dotty syntax. -- cgit v1.2.1 From ea5f4192b9954301c0c65804586ed7daf3a98c16 Mon Sep 17 00:00:00 2001 From: Fabián Ezequiel Gallina Date: Wed, 13 Feb 2013 21:42:11 -0300 Subject: * progmodes/python.el: Explain how to restore "cc-mode"-like forward-sexp movement in header documentation. (python-nav--forward-sexp): Behave like emacs-lisp-mode in comments and strings (GH bug 114). Fixes: debbugs:13642 --- lisp/progmodes/python.el | 42 ++++++++++++++++++++++-------------------- 1 file changed, 22 insertions(+), 20 deletions(-) (limited to 'lisp/progmodes/python.el') diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el index e611864e0c1..92f86ce1231 100644 --- a/lisp/progmodes/python.el +++ b/lisp/progmodes/python.el @@ -54,8 +54,13 @@ ;; `python-nav-beginning-of-statement', `python-nav-end-of-statement', ;; `python-nav-beginning-of-block' and `python-nav-end-of-block' are ;; included but no bound to any key. At last but not least the -;; specialized `python-nav-forward-sexp' allows easy -;; navigation between code blocks. +;; specialized `python-nav-forward-sexp' allows easy navigation +;; between code blocks. If you prefer `cc-mode'-like `forward-sexp' +;; movement, setting `forward-sexp-function' to nil is enough, You can +;; do that using the `python-mode-hook': + +;; (add-hook 'python-mode-hook +;; (lambda () (setq forward-sexp-function nil))) ;; Shell interaction: is provided and allows you to execute easily any ;; block of code of your current buffer in an inferior Python process. @@ -1339,13 +1344,10 @@ backwards." 're-search-backward)) (context-type (python-syntax-context-type))) (cond - ((eq context-type 'string) + ((memq context-type '(string comment)) ;; Inside of a string, get out of it. - (while (and (funcall re-search-fn "[\"']" nil t) - (python-syntax-context 'string)))) - ((eq context-type 'comment) - ;; Inside of a comment, just move forward. - (python-util-forward-comment dir)) + (let ((forward-sexp-function)) + (forward-sexp dir))) ((or (eq context-type 'paren) (and forward-p (looking-at (python-rx open-paren))) (and (not forward-p) @@ -1368,16 +1370,16 @@ backwards." (save-excursion (python-nav-lisp-forward-sexp-safe dir) (point))) - (next-sexp-context - (save-excursion - (goto-char next-sexp-pos) - (cond - ((python-info-beginning-of-block-p) 'block-start) - ((python-info-end-of-block-p) 'block-end) - ((python-info-beginning-of-statement-p) 'statement-start) - ((python-info-end-of-statement-p) 'statement-end) - ((python-info-statement-starts-block-p) 'starts-block) - ((python-info-statement-ends-block-p) 'ends-block))))) + (next-sexp-context + (save-excursion + (goto-char next-sexp-pos) + (cond + ((python-info-beginning-of-block-p) 'block-start) + ((python-info-end-of-block-p) 'block-end) + ((python-info-beginning-of-statement-p) 'statement-start) + ((python-info-end-of-statement-p) 'statement-end) + ((python-info-statement-starts-block-p) 'starts-block) + ((python-info-statement-ends-block-p) 'ends-block))))) (if forward-p (cond ((and (not (eobp)) (python-info-current-line-empty-p)) @@ -1401,8 +1403,8 @@ backwards." (t (goto-char next-sexp-pos))) (cond ((and (not (bobp)) (python-info-current-line-empty-p)) - (python-util-forward-comment dir) - (python-nav--forward-sexp dir)) + (python-util-forward-comment dir) + (python-nav--forward-sexp dir)) ((eq context 'block-end) (python-nav-beginning-of-block)) ((eq context 'statement-end) -- cgit v1.2.1 From 2af3b9c16e340ad034e57e949f09bbafc00bd52c Mon Sep 17 00:00:00 2001 From: Fabián Ezequiel Gallina Date: Tue, 19 Feb 2013 00:18:32 -0300 Subject: * progmodes/python.el (python-indent-context): Fix python-info-line-ends-backslash-p call. (python-info-line-ends-backslash-p) (python-info-beginning-of-backslash): Respect line-number argument. (python-info-current-line-comment-p): Fix behavior when not at beginning-of-line. (python-util-position): Remove function. (python-util-goto-line): New function. --- lisp/progmodes/python.el | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) (limited to 'lisp/progmodes/python.el') diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el index 92f86ce1231..49eaff637a6 100644 --- a/lisp/progmodes/python.el +++ b/lisp/progmodes/python.el @@ -698,10 +698,9 @@ START is the buffer position where the sexp starts." ;; After backslash ((setq start (when (not (or (python-syntax-context 'string ppss) (python-syntax-context 'comment ppss))) - (let ((line-beg-pos (line-beginning-position))) - (when (python-info-line-ends-backslash-p - (1- line-beg-pos)) - (- line-beg-pos 2))))) + (let ((line-beg-pos (line-number-at-pos))) + (python-info-line-ends-backslash-p + (1- line-beg-pos))))) 'after-backslash) ;; After beginning of block ((setq start (save-excursion @@ -3105,7 +3104,7 @@ With optional argument LINE-NUMBER, check that line instead." (save-restriction (widen) (when line-number - (goto-char line-number)) + (python-util-goto-line line-number)) (while (and (not (eobp)) (goto-char (line-end-position)) (python-syntax-context 'paren) @@ -3121,7 +3120,7 @@ Optional argument LINE-NUMBER forces the line number to check against." (save-restriction (widen) (when line-number - (goto-char line-number)) + (python-util-goto-line line-number)) (when (python-info-line-ends-backslash-p) (while (save-excursion (goto-char (line-beginning-position)) @@ -3200,7 +3199,9 @@ operator." (defun python-info-current-line-comment-p () "Check if current line is a comment line." - (char-equal (or (char-after (+ (point) (current-indentation))) ?_) ?#)) + (char-equal + (or (char-after (+ (line-beginning-position) (current-indentation))) ?_) + ?#)) (defun python-info-current-line-empty-p () "Check if current line is empty, ignoring whitespace." @@ -3215,12 +3216,10 @@ operator." ;;; Utility functions -(defun python-util-position (item seq) - "Find the first occurrence of ITEM in SEQ. -Return the index of the matching item, or nil if not found." - (let ((member-result (member item seq))) - (when member-result - (- (length seq) (length member-result))))) +(defun python-util-goto-line (line-number) + "Move point to LINE-NUMBER." + (goto-char (point-min)) + (forward-line (1- line-number))) ;; Stolen from org-mode (defun python-util-clone-local-variables (from-buffer &optional regexp) -- cgit v1.2.1 From 33c0cb2549452f1ba1c1da0a1d0e45559c0be99b Mon Sep 17 00:00:00 2001 From: Fabián Ezequiel Gallina Date: Tue, 19 Feb 2013 15:53:57 -0300 Subject: * progmodes/python.el (python-info-current-defun): Fix failed defun name retrieval because of unwanted match-data cluttering. --- lisp/progmodes/python.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'lisp/progmodes/python.el') diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el index 49eaff637a6..1ee95daa0a9 100644 --- a/lisp/progmodes/python.el +++ b/lisp/progmodes/python.el @@ -2976,7 +2976,10 @@ not inside a defun." ;; Else go to the end of defun and add ;; up the current indentation to the ;; ending position. - (python-nav-end-of-defun) + (save-match-data + ;; FIXME: avoid cluttering match-data + ;; where's not wanted. + (python-nav-end-of-defun)) (+ (point) (if (>= (current-indentation) min-indent) (1+ (current-indentation)) -- cgit v1.2.1 From c132ab7921c9d04e8054a7792b6de92fe6bc687a Mon Sep 17 00:00:00 2001 From: Fabián Ezequiel Gallina Date: Wed, 20 Feb 2013 17:41:46 -0300 Subject: * progmodes/python.el (python-info-current-defun): Enhance match-data cluttering prevention. --- lisp/progmodes/python.el | 68 +++++++++++++++++++++++------------------------- 1 file changed, 33 insertions(+), 35 deletions(-) (limited to 'lisp/progmodes/python.el') diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el index 1ee95daa0a9..c2739ce80a1 100644 --- a/lisp/progmodes/python.el +++ b/lisp/progmodes/python.el @@ -2949,42 +2949,40 @@ not inside a defun." (type)) (catch 'exit (while (python-nav-beginning-of-defun 1) - (when (and - (or (not last-indent) - (< (current-indentation) last-indent)) - (or - (and first-run + (when (save-match-data + (and + (or (not last-indent) + (< (current-indentation) last-indent)) + (or + (and first-run + (save-excursion + ;; If this is the first run, we may add + ;; the current defun at point. + (setq first-run nil) + (goto-char starting-pos) + (python-nav-beginning-of-statement) + (beginning-of-line 1) + (looking-at-p + python-nav-beginning-of-defun-regexp))) + (< starting-pos (save-excursion - ;; If this is the first run, we may add - ;; the current defun at point. - (setq first-run nil) - (goto-char starting-pos) - (python-nav-beginning-of-statement) - (beginning-of-line 1) - (looking-at-p - python-nav-beginning-of-defun-regexp))) - (< starting-pos - (save-excursion - (let ((min-indent - (+ (current-indentation) - python-indent-offset))) - (if (< starting-indentation min-indent) - ;; If the starting indentation is not - ;; within the min defun indent make the - ;; check fail. - starting-pos - ;; Else go to the end of defun and add - ;; up the current indentation to the - ;; ending position. - (save-match-data - ;; FIXME: avoid cluttering match-data - ;; where's not wanted. - (python-nav-end-of-defun)) - (+ (point) - (if (>= (current-indentation) min-indent) - (1+ (current-indentation)) - 0)))))))) - (setq last-indent (current-indentation)) + (let ((min-indent + (+ (current-indentation) + python-indent-offset))) + (if (< starting-indentation min-indent) + ;; If the starting indentation is not + ;; within the min defun indent make the + ;; check fail. + starting-pos + ;; Else go to the end of defun and add + ;; up the current indentation to the + ;; ending position. + (python-nav-end-of-defun) + (+ (point) + (if (>= (current-indentation) min-indent) + (1+ (current-indentation)) + 0))))))))) + (save-match-data (setq last-indent (current-indentation))) (if (or (not include-type) type) (setq names (cons (match-string-no-properties 1) names)) (let ((match (split-string (match-string-no-properties 0)))) -- cgit v1.2.1