From e531e4b042c12fa2468a1bb0cd7dd0a9c3e10294 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Sat, 16 Apr 1994 08:29:27 +0000 Subject: Tim Peters' version of the indentation changes (and more). --- Misc/python-mode-old.el | 82 +++++++++++++++++++++++++------------------------ 1 file changed, 42 insertions(+), 40 deletions(-) diff --git a/Misc/python-mode-old.el b/Misc/python-mode-old.el index 04fbc07..bbd0e5b 100644 --- a/Misc/python-mode-old.el +++ b/Misc/python-mode-old.el @@ -1,4 +1,4 @@ -;;; Major mode for editing Python programs, version 1.08a+ +;;; Major mode for editing Python programs, version 1.08ax ;; by: Tim Peters ;; after an original idea by: Michael A. Guravage ;; @@ -40,16 +40,6 @@ Note that `\\[py-guess-indent-offset]' can usually guess a good value when you're editing someone else's Python code.") -(defvar py-continuation-offset 2 - "*Indentation (in addition to py-indent-offset) for continued lines. -The additional indentation given to the first continuation line in a -multi-line statement. Each subsequent continuation line in the -statement inherits its indentation from the line that precedes it, so if -you don't like the default indentation given to the first continuation -line, change it to something you do like and Python-mode will -automatically use that for the remaining continuation lines (or, until -you change the indentation again).") - (defvar py-block-comment-prefix "##" "*String used by py-comment-region to comment out a block of code. This should follow the convention for non-indenting comment lines so @@ -204,19 +194,20 @@ Emacs bell is also rung as a warning.") ( ?\# . "<") ; hash starts comment ( ?\n . ">")))) ; newline ends comment -(defvar py-nested-indent t - "*If non-nil, indent nested continuation lines to inside the opening paren") - -(defconst py-stringlit-re "'\\([^'\n\\]\\|\\\\.\\)*'" +(defconst py-stringlit-re + (concat + "'\\([^'\n\\]\\|\\\\.\\)*'" ; single-quoted + "\\|" ; or + "\"\\([^\"\n\\]\\|\\\\.\\)*\"") ; double-quoted "regexp matching a Python string literal") ;; this is tricky because a trailing backslash does not mean ;; continuation if it's in a comment (defconst py-continued-re (concat - "\\(" "[^#'\n\\]" "\\|" py-stringlit-re "\\)*" + "\\(" "[^#'\"\n\\]" "\\|" py-stringlit-re "\\)*" "\\\\$") - "regexp matching Python lines that are continued") + "regexp matching Python lines that are continued via backslash") (defconst py-blank-or-comment-re "[ \t]*\\($\\|#\\)" "regexp matching blank or comment lines") @@ -234,7 +225,6 @@ COMMANDS VARIABLES py-indent-offset\tindentation increment -py-continuation-offset\textra indentation given to continuation lines py-block-comment-prefix\tcomment string used by py-comment-region py-python-command\tshell command to invoke Python interpreter py-scroll-process-buffer\talways scroll Python process buffer @@ -257,6 +247,7 @@ py-beep-if-tab-change\tring the bell if tab-width is changed" (comment-start . "# ") (comment-start-skip . "# *") (comment-column . 40) + (indent-region-function . py-indent-region) (indent-line-function . py-indent-line))) ;; hack to allow overriding the tabsize in the file (see tokenizer.c) @@ -518,17 +509,27 @@ the new line indented." (cond ;; are we on a continuation line? ( (py-continuation-line-p) - (let ((nest (and py-nested-indent (py-nesting-level)))) - (if nest - (save-excursion - (goto-char nest) - (1+ (current-column))) + (let ( (open-bracket-pos (py-nesting-level)) ) + (if open-bracket-pos + ;; line up with first real character (not whitespace or + ;; comment hash) after open bracket; if none, to one + ;; column beyond the open bracket + (progn + (goto-char (1+ open-bracket-pos)) ; just beyond bracket + (and (looking-at "[ \t]*[^ \t\n#]") + (goto-char (1- (match-end 0)))) + (current-column)) + ;; else on backslash continuation line (forward-line -1) - (if (py-continuation-line-p) ; on at least 3rd line in block - (current-indentation) ; so just continue the pattern - ;; else on 2nd line in block, so indent more - (+ (current-indentation) py-indent-offset - py-continuation-offset))))) + (if (py-continuation-line-p) ; on at least 3rd line in block + (current-indentation) ; so just continue the pattern + ;; else started on 2nd line in block, so indent more; + ;; skip first chunk of non-whitespace characters on base + ;; line, + 1 more column + (back-to-indentation) + (skip-chars-forward "^ \t\n") + (1+ (current-column)))))) + ;; not on a continuation line ;; if at start of restriction, or on a non-indenting comment line, @@ -1152,7 +1153,6 @@ variable docs begin with `->'. @VARIABLES py-indent-offset\tindentation increment -py-continuation-offset\textra indentation given to continuation lines py-block-comment-prefix\tcomment string used by py-comment-region py-python-command\tshell command to invoke Python interpreter @@ -1161,7 +1161,6 @@ py-temp-directory\tdirectory used for temp files (if needed) py-beep-if-tab-change\tring the bell if tab-width is changed %v:py-indent-offset -%v:py-continuation-offset %v:py-block-comment-prefix %v:py-python-command %v:py-scroll-process-buffer @@ -1217,16 +1216,6 @@ generally (when it makes sense) automatically move to the start of the statement containing point, even if point happens to be in the middle of some continuation line. -A Bad Idea - -Always put something on the initial line of a multi-line statement -besides the backslash! E.g., don't do this: - -\t\\ -\ta = b # what's the indentation of this stmt? - -While that's legal Python, it's silly & would be very expensive for -Python mode to handle correctly. @INDENTATION @@ -1274,6 +1263,19 @@ statement has `:' as its last significant (non-whitespace and non- comment) character. If the suggested indentation is too much, use \\[py-delete-char] to reduce it. +Continuation lines are given extra indentation. If a line is a +continuation line by virtue of being in an unclosed paren/bracket/ +brace structure, it's indented to line up with the first non-whitespace +and non-comment character following the opening paren/bracket/brace +of the smallest such enclosing structure. If no such character exists, +it's indented to one column beyond the opening paren/bracket/brace. + +If a line is a continuation line because the line preceding it ends with +a backslash, the third and following lines of the continuation block +inherit their indentation from the line preceding them, while the second +line in the block is indented to one column beyond the first chunk of +non-whitespace characters in the block's initial line. + Warning: indent-region should not normally be used! It calls \\[indent-for-tab-command] repeatedly, and as explained above, \\[indent-for-tab-command] can't guess the block structure you intend. -- cgit v0.12