Tim Peters' version of the indentation changes (and more).

This commit is contained in:
Guido van Rossum 1994-04-16 08:29:27 +00:00
parent cc54417d1a
commit e531e4b042
1 changed files with 42 additions and 40 deletions

View File

@ -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 <tim@ksr.com>
;; 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.