(py-electric-colon): turn off electric behavior inside strings and
comments.
diff --git a/Misc/python-mode.el b/Misc/python-mode.el
index c84ede4..d5fb956 100644
--- a/Misc/python-mode.el
+++ b/Misc/python-mode.el
@@ -471,31 +471,39 @@
(defun py-electric-colon (arg)
"Insert a colon.
In certain cases the line is outdented appropriately. If a numeric
-argument is provided, that many colons are inserted non-electrically."
+argument is provided, that many colons are inserted non-electrically.
+Electric behavior is inhibited inside a string or comment."
(interactive "P")
(self-insert-command (prefix-numeric-value arg))
- (save-excursion
- (let ((here (point))
- (outdent 0)
- (indent (py-compute-indentation)))
- (if (and (not arg)
- (py-outdent-p)
- (= indent (save-excursion
- (forward-line -1)
- (py-compute-indentation)))
- )
- (setq outdent py-indent-offset))
- ;; Don't indent, only outdent. This assumes that any lines that
- ;; are already outdented relative to py-compute-indentation were
- ;; put there on purpose. Its highly annoying to have `:' indent
- ;; for you. Use TAB, C-c C-l or C-c C-r to adjust. TBD: Is
- ;; there a better way to determine this???
- (if (< (current-indentation) indent) nil
- (goto-char here)
- (beginning-of-line)
- (delete-horizontal-space)
- (indent-to (- indent outdent))
- ))))
+ ;; are we in a string or comment?
+ (if (save-excursion
+ (let ((pps (parse-partial-sexp (save-excursion
+ (beginning-of-python-def-or-class)
+ (point))
+ (point))))
+ (not (or (nth 3 pps) (nth 4 pps)))))
+ (save-excursion
+ (let ((here (point))
+ (outdent 0)
+ (indent (py-compute-indentation)))
+ (if (and (not arg)
+ (py-outdent-p)
+ (= indent (save-excursion
+ (forward-line -1)
+ (py-compute-indentation)))
+ )
+ (setq outdent py-indent-offset))
+ ;; Don't indent, only outdent. This assumes that any lines that
+ ;; are already outdented relative to py-compute-indentation were
+ ;; put there on purpose. Its highly annoying to have `:' indent
+ ;; for you. Use TAB, C-c C-l or C-c C-r to adjust. TBD: Is
+ ;; there a better way to determine this???
+ (if (< (current-indentation) indent) nil
+ (goto-char here)
+ (beginning-of-line)
+ (delete-horizontal-space)
+ (indent-to (- indent outdent))
+ )))))
(defun py-indent-right (arg)
"Indent the line by one `py-indent-offset' level.