(py-no-outdent-re): new constant

(py-indent-line, py-electric-colon): watch for compound statements one
line after another.
This commit is contained in:
Barry Warsaw 1995-03-14 20:53:08 +00:00
parent b5e0ecbd33
commit 4f009fb092
1 changed files with 39 additions and 18 deletions

View File

@ -310,13 +310,25 @@ Currently-active file is at the head of the list.")
(defconst py-outdent-re
(concat "\\(" (mapconcat 'identity
'("else:"
"except\\s +.*:"
"except\\(\\s +.*\\)?:"
"finally:"
"elif\\s +.*:")
"\\|")
"\\)")
"Regexp matching clauses to be outdented one level.")
(defconst py-no-outdent-re
(concat "\\(" (mapconcat 'identity
'("try\\s +.*:"
"except\\(\\s +.*\\)?:"
"while\\s +.*:"
"for\\s +.*:"
"if\\s +.*:"
"elif\\s +.*:")
"\\|")
"\\)")
"Regexp matching lines to not outdent after.")
;;;###autoload
(defun python-mode ()
@ -397,20 +409,27 @@ In certain cases the line is outdented appropriately. If a numeric
argument is provided, that many colons are inserted non-electrically."
(interactive "P")
(self-insert-command (prefix-numeric-value arg))
(let (this-indent)
(if (and (not arg)
(save-excursion
(back-to-indentation)
(looking-at py-outdent-re))
(= (setq this-indent (py-compute-indentation))
(save-excursion
(forward-line -1)
(py-compute-indentation)))
)
(save-excursion
(beginning-of-line)
(delete-horizontal-space)
(indent-to (- this-indent py-indent-offset)))
(save-excursion
(let ((here (point))
(outdent 0)
(indent (py-compute-indentation)))
(if (and (not arg)
(progn
(back-to-indentation)
(looking-at py-outdent-re))
(prog2
(backward-to-indentation 1)
(not (looking-at py-no-outdent-re))
(goto-char here))
(= indent (progn
(forward-line -1)
(py-compute-indentation)))
)
(setq outdent py-indent-offset))
(goto-char here)
(beginning-of-line)
(delete-horizontal-space)
(indent-to (- indent outdent))
)))
@ -630,10 +649,12 @@ needed so that only a single column position is deleted."
(let* ((ci (current-indentation))
(move-to-indentation-p (<= (current-column) ci))
(need (py-compute-indentation)))
;; watch for outdents
;; see if we need to outdent
(if (save-excursion
(back-to-indentation)
(looking-at py-outdent-re))
(and (progn (back-to-indentation)
(looking-at py-outdent-re))
(progn (backward-to-indentation 1)
(not (looking-at py-no-outdent-re)))))
(setq need (- need py-indent-offset)))
(if (/= ci need)
(save-excursion