annotate lisp/progmodes/python.el @ 63308:51d38cfbe542

Warn about using "cvs up -kb" if one intends to commit changes. Add a pointer to another site with detailed configure and build instructions. Suggest to look at config.log when configure fails. Add MinGW Make 3.80 to the list of successful combinations.
author Eli Zaretskii <eliz@gnu.org>
date Sat, 11 Jun 2005 11:31:29 +0000
parents 7b4e7e55f61b
children 1962e8146bf4 08185296b491
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1 ;;; python.el --- silly walks for Python
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
2
60931
494d942e49fe (python-close-block-statement-p)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 59996
diff changeset
3 ;; Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc.
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
4
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
5 ;; Author: Dave Love <fx@gnu.org>
54943
07e279030b6f (python-compilation-line-number): Fix braindamage.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54938
diff changeset
6 ;; Maintainer: FSF
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
7 ;; Created: Nov 2003
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
8 ;; Keywords: languages
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
9
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
10 ;; This file is part of GNU Emacs.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
11
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
12 ;; This file is free software; you can redistribute it and/or modify
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
13 ;; it under the terms of the GNU General Public License as published by
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
14 ;; the Free Software Foundation; either version 2, or (at your option)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
15 ;; any later version.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
16
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
17 ;; This file is distributed in the hope that it will be useful,
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
18 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
19 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
20 ;; GNU General Public License for more details.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
21
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
22 ;; You should have received a copy of the GNU General Public License
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
23 ;; along with GNU Emacs; see the file COPYING. If not, write to
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
24 ;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
25 ;; Boston, MA 02111-1307, USA.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
26
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
27 ;;; Commentary:
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
28
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
29 ;; Major mode for editing Python, with support for inferior processes.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
30
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
31 ;; There is another Python mode, python-mode.el, used by XEmacs and
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
32 ;; maintained with Python. That isn't covered by an FSF copyright
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
33 ;; assignment, unlike this code, and seems not to be well-maintained
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
34 ;; for Emacs (though I've submitted fixes). This mode is rather
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
35 ;; simpler and is, perhaps, better in other ways. In particular,
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
36 ;; using the syntax functions with text properties maintained by
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
37 ;; font-lock should make it more correct with arbitrary string and
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
38 ;; comment contents.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
39
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
40 ;; This doesn't implement all the facilities of python-mode.el. Some
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
41 ;; just need doing, e.g. catching exceptions in the inferior Python
54840
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
42 ;; buffer (but see M-x pdb for debugging). [Actually, the use of
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
43 ;; `compilation-minor-mode' now is probably enough for that.] Others
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
44 ;; don't seem appropriate. For instance, `forward-into-nomenclature'
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
45 ;; should be done separately, since it's not specific to Python, and
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
46 ;; I've installed a minor mode to do the job properly in Emacs 22.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
47 ;; Other things seem more natural or canonical here, e.g. the
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
48 ;; {beginning,end}-of-defun implementation dealing with nested
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
49 ;; definitions, and the inferior mode following `cmuscheme'. The
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
50 ;; inferior mode can find the source of errors from
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
51 ;; `python-send-region' & al via `compilation-minor-mode'. Successive
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
52 ;; TABs cycle between possible indentations for the line. There is
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
53 ;; symbol completion using lookup in Python.
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
54
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
55 ;; Even where it has similar facilities, this is incompatible with
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
56 ;; python-mode.el in various respects. For instance, various key
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
57 ;; bindings are changed to obey Emacs conventions, and things like
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
58 ;; marking blocks and `beginning-of-defun' behave differently.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
59
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
60 ;; TODO: See various Fixmes below.
54840
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
61
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
62 ;;; Code:
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
63
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
64 ;; It's messy to autoload the relevant comint functions so that comint
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
65 ;; is only required when inferior Python is used.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
66 (require 'comint)
54840
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
67 (eval-when-compile
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
68 (require 'compile)
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
69 (autoload 'info-lookup-maybe-add-help "info-look"))
54938
109b2bf180dd (python-after-info-look): Use with-no-warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54888
diff changeset
70 (autoload 'compilation-start "compile")
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
71
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
72 (defgroup python nil
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
73 "Silly walks in the Python language"
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
74 :group 'languages
59996
aac0a33f5772 Change release version from 21.4 to 22.1 throughout.
Kim F. Storm <storm@cua.dk>
parents: 59250
diff changeset
75 :version "22.1"
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
76 :link '(emacs-commentary-link "python"))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
77
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
78 ;;;###autoload
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
79 (add-to-list 'interpreter-mode-alist '("jython" . jython-mode))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
80 ;;;###autoload
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
81 (add-to-list 'interpreter-mode-alist '("python" . python-mode))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
82 ;;;###autoload
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
83 (add-to-list 'auto-mode-alist '("\\.py\\'" . python-mode))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
84
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
85 ;;;; Font lock
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
86
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
87 (defvar python-font-lock-keywords
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
88 `(,(rx (and word-start
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
89 ;; From v 2.3 reference.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
90 ;; def and class dealt with separately below
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
91 (or "and" "assert" "break" "continue" "del" "elif" "else"
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
92 "except" "exec" "finally" "for" "from" "global" "if"
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
93 "import" "in" "is" "lambda" "not" "or" "pass" "print"
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
94 "raise" "return" "try" "while" "yield"
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
95 ;; Future keywords
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
96 "as" "None")
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
97 word-end))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
98 (,(rx (and word-start (group "class") (1+ space) (group (1+ word))))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
99 (1 font-lock-keyword-face) (2 font-lock-type-face))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
100 (,(rx (and word-start (group "def") (1+ space) (group (1+ word))))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
101 (1 font-lock-keyword-face) (2 font-lock-function-name-face))))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
102
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
103 (defconst python-font-lock-syntactic-keywords
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
104 ;; Make outer chars of matching triple-quote sequences into generic
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
105 ;; string delimiters. Fixme: Is there a better way?
58739
2761697b0e2f (python-font-lock-syntactic-keywords): Fix previous change.
Richard M. Stallman <rms@gnu.org>
parents: 58487
diff changeset
106 `((,(rx (and (or line-start buffer-start (not (syntax escape))) ; avoid escaped
58487
d0581f1eef46 (python-font-lock-syntactic-keywords): Check for escapes in the regexp.
Richard M. Stallman <rms@gnu.org>
parents: 58415
diff changeset
107 ; leading quote
d0581f1eef46 (python-font-lock-syntactic-keywords): Check for escapes in the regexp.
Richard M. Stallman <rms@gnu.org>
parents: 58415
diff changeset
108 (group (optional (any "uUrR"))) ; prefix gets syntax property
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
109 (optional (any "rR")) ; possible second prefix
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
110 (group (syntax string-quote)) ; maybe gets property
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
111 (backref 2) ; per first quote
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
112 (group (backref 2)))) ; maybe gets property
54840
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
113 (1 (python-quote-syntax 1))
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
114 (2 (python-quote-syntax 2))
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
115 (3 (python-quote-syntax 3)))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
116 ;; This doesn't really help.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
117 ;;; (,(rx (and ?\\ (group ?\n))) (1 " "))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
118 ))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
119
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
120 (defun python-quote-syntax (n)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
121 "Put `syntax-table' property correctly on triple quote.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
122 Used for syntactic keywords. N is the match number (1, 2 or 3)."
54840
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
123 ;; Given a triple quote, we have to check the context to know
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
124 ;; whether this is an opening or closing triple or whether it's
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
125 ;; quoted anyhow, and should be ignored. (For that we need to do
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
126 ;; the same job as `syntax-ppss' to be correct and it seems to be OK
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
127 ;; to use it here despite initial worries.) We also have to sort
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
128 ;; out a possible prefix -- well, we don't _have_ to, but I think it
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
129 ;; should be treated as part of the string.
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
130
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
131 ;; Test cases:
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
132 ;; ur"""ar""" x='"' # """
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
133 ;; x = ''' """ ' a
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
134 ;; '''
58487
d0581f1eef46 (python-font-lock-syntactic-keywords): Check for escapes in the regexp.
Richard M. Stallman <rms@gnu.org>
parents: 58415
diff changeset
135 ;; x '"""' x """ \"""" x
54840
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
136 (save-excursion
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
137 (goto-char (match-beginning 0))
58487
d0581f1eef46 (python-font-lock-syntactic-keywords): Check for escapes in the regexp.
Richard M. Stallman <rms@gnu.org>
parents: 58415
diff changeset
138 (cond
d0581f1eef46 (python-font-lock-syntactic-keywords): Check for escapes in the regexp.
Richard M. Stallman <rms@gnu.org>
parents: 58415
diff changeset
139 ;; Consider property for the last char if in a fenced string.
d0581f1eef46 (python-font-lock-syntactic-keywords): Check for escapes in the regexp.
Richard M. Stallman <rms@gnu.org>
parents: 58415
diff changeset
140 ((= n 3)
d0581f1eef46 (python-font-lock-syntactic-keywords): Check for escapes in the regexp.
Richard M. Stallman <rms@gnu.org>
parents: 58415
diff changeset
141 (let ((syntax (syntax-ppss)))
d0581f1eef46 (python-font-lock-syntactic-keywords): Check for escapes in the regexp.
Richard M. Stallman <rms@gnu.org>
parents: 58415
diff changeset
142 (when (eq t (nth 3 syntax)) ; after unclosed fence
d0581f1eef46 (python-font-lock-syntactic-keywords): Check for escapes in the regexp.
Richard M. Stallman <rms@gnu.org>
parents: 58415
diff changeset
143 (goto-char (nth 8 syntax)) ; fence position
d0581f1eef46 (python-font-lock-syntactic-keywords): Check for escapes in the regexp.
Richard M. Stallman <rms@gnu.org>
parents: 58415
diff changeset
144 ;; Skip any prefix.
d0581f1eef46 (python-font-lock-syntactic-keywords): Check for escapes in the regexp.
Richard M. Stallman <rms@gnu.org>
parents: 58415
diff changeset
145 (if (memq (char-after) '(?u ?U ?R ?r))
d0581f1eef46 (python-font-lock-syntactic-keywords): Check for escapes in the regexp.
Richard M. Stallman <rms@gnu.org>
parents: 58415
diff changeset
146 (skip-chars-forward "uUrR"))
d0581f1eef46 (python-font-lock-syntactic-keywords): Check for escapes in the regexp.
Richard M. Stallman <rms@gnu.org>
parents: 58415
diff changeset
147 ;; Is it a matching sequence?
d0581f1eef46 (python-font-lock-syntactic-keywords): Check for escapes in the regexp.
Richard M. Stallman <rms@gnu.org>
parents: 58415
diff changeset
148 (if (eq (char-after) (char-after (match-beginning 2)))
d0581f1eef46 (python-font-lock-syntactic-keywords): Check for escapes in the regexp.
Richard M. Stallman <rms@gnu.org>
parents: 58415
diff changeset
149 (eval-when-compile (string-to-syntax "|"))))))
d0581f1eef46 (python-font-lock-syntactic-keywords): Check for escapes in the regexp.
Richard M. Stallman <rms@gnu.org>
parents: 58415
diff changeset
150 ;; Consider property for initial char, accounting for prefixes.
d0581f1eef46 (python-font-lock-syntactic-keywords): Check for escapes in the regexp.
Richard M. Stallman <rms@gnu.org>
parents: 58415
diff changeset
151 ((or (and (= n 2) ; not prefix
d0581f1eef46 (python-font-lock-syntactic-keywords): Check for escapes in the regexp.
Richard M. Stallman <rms@gnu.org>
parents: 58415
diff changeset
152 (= (match-beginning 1) (match-end 1))) ; prefix is null
d0581f1eef46 (python-font-lock-syntactic-keywords): Check for escapes in the regexp.
Richard M. Stallman <rms@gnu.org>
parents: 58415
diff changeset
153 (and (= n 1) ; prefix
d0581f1eef46 (python-font-lock-syntactic-keywords): Check for escapes in the regexp.
Richard M. Stallman <rms@gnu.org>
parents: 58415
diff changeset
154 (/= (match-beginning 1) (match-end 1)))) ; non-empty
d0581f1eef46 (python-font-lock-syntactic-keywords): Check for escapes in the regexp.
Richard M. Stallman <rms@gnu.org>
parents: 58415
diff changeset
155 (unless (eq 'string (syntax-ppss-context (syntax-ppss)))
d0581f1eef46 (python-font-lock-syntactic-keywords): Check for escapes in the regexp.
Richard M. Stallman <rms@gnu.org>
parents: 58415
diff changeset
156 (eval-when-compile (string-to-syntax "|"))))
d0581f1eef46 (python-font-lock-syntactic-keywords): Check for escapes in the regexp.
Richard M. Stallman <rms@gnu.org>
parents: 58415
diff changeset
157 ;; Otherwise (we're in a non-matching string) the property is
d0581f1eef46 (python-font-lock-syntactic-keywords): Check for escapes in the regexp.
Richard M. Stallman <rms@gnu.org>
parents: 58415
diff changeset
158 ;; nil, which is OK.
d0581f1eef46 (python-font-lock-syntactic-keywords): Check for escapes in the regexp.
Richard M. Stallman <rms@gnu.org>
parents: 58415
diff changeset
159 )))
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
160
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
161 ;; This isn't currently in `font-lock-defaults' as probably not worth
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
162 ;; it -- we basically only mess with a few normally-symbol characters.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
163
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
164 ;; (defun python-font-lock-syntactic-face-function (state)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
165 ;; "`font-lock-syntactic-face-function' for Python mode.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
166 ;; Returns the string or comment face as usual, with side effect of putting
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
167 ;; a `syntax-table' property on the inside of the string or comment which is
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
168 ;; the standard syntax table."
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
169 ;; (if (nth 3 state)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
170 ;; (save-excursion
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
171 ;; (goto-char (nth 8 state))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
172 ;; (condition-case nil
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
173 ;; (forward-sexp)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
174 ;; (error nil))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
175 ;; (put-text-property (1+ (nth 8 state)) (1- (point))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
176 ;; 'syntax-table (standard-syntax-table))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
177 ;; 'font-lock-string-face)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
178 ;; (put-text-property (1+ (nth 8 state)) (line-end-position)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
179 ;; 'syntax-table (standard-syntax-table))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
180 ;; 'font-lock-comment-face))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
181
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
182 ;;;; Keymap and syntax
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
183
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
184 (defvar python-mode-map
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
185 (let ((map (make-sparse-keymap)))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
186 ;; Mostly taken from python-mode.el.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
187 (define-key map ":" 'python-electric-colon)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
188 (define-key map "\177" 'python-backspace)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
189 (define-key map "\C-c<" 'python-shift-left)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
190 (define-key map "\C-c>" 'python-shift-right)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
191 (define-key map "\C-c\C-k" 'python-mark-block)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
192 (define-key map "\C-c\C-n" 'python-next-statement)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
193 (define-key map "\C-c\C-p" 'python-previous-statement)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
194 (define-key map "\C-c\C-u" 'python-beginning-of-block)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
195 (define-key map "\C-c\C-f" 'python-describe-symbol)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
196 (define-key map "\C-c\C-w" 'python-check)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
197 (define-key map "\C-c\C-v" 'python-check) ; a la sgml-mode
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
198 (define-key map "\C-c\C-s" 'python-send-string)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
199 (define-key map [?\C-\M-x] 'python-send-defun)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
200 (define-key map "\C-c\C-r" 'python-send-region)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
201 (define-key map "\C-c\M-r" 'python-send-region-and-go)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
202 (define-key map "\C-c\C-c" 'python-send-buffer)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
203 (define-key map "\C-c\C-z" 'python-switch-to-python)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
204 (define-key map "\C-c\C-m" 'python-load-file)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
205 (define-key map "\C-c\C-l" 'python-load-file) ; a la cmuscheme
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
206 (substitute-key-definition 'complete-symbol 'python-complete-symbol
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
207 map global-map)
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
208 ;; Fixme: Add :help to menu.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
209 (easy-menu-define python-menu map "Python Mode menu"
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
210 '("Python"
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
211 ["Shift region left" python-shift-left :active mark-active]
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
212 ["Shift region right" python-shift-right :active mark-active]
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
213 "-"
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
214 ["Mark block" python-mark-block]
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
215 ["Mark def/class" mark-defun
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
216 :help "Mark innermost definition around point"]
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
217 "-"
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
218 ["Start of block" python-beginning-of-block]
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
219 ["End of block" python-end-of-block]
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
220 ["Start of def/class" beginning-of-defun
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
221 :help "Go to start of innermost definition around point"]
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
222 ["End of def/class" end-of-defun
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
223 :help "Go to end of innermost definition around point"]
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
224 "-"
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
225 ["Start interpreter" run-python
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
226 :help "Run `inferior' Python in separate buffer"]
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
227 ["Import/reload file" python-load-file
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
228 :help "Load into inferior Python session"]
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
229 ["Eval buffer" python-send-buffer
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
230 :help "Evaluate buffer en bloc in inferior Python session"]
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
231 ["Eval region" python-send-region :active mark-active
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
232 :help "Evaluate region en bloc in inferior Python session"]
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
233 ["Eval def/class" python-send-defun
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
234 :help "Evaluate current definition in inferior Python session"]
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
235 ["Switch to interpreter" python-switch-to-python
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
236 :help "Switch to inferior Python buffer"]
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
237 ["Check file" python-check :help "Run pychecker"]
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
238 ["Debugger" pdb :help "Run pdb under GUD"]
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
239 "-"
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
240 ["Help on symbol" python-describe-symbol
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
241 :help "Use pydoc on symbol at point"]))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
242 map))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
243
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
244 (defvar python-mode-syntax-table
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
245 (let ((table (make-syntax-table)))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
246 ;; Give punctuation syntax to ASCII that normally has symbol
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
247 ;; syntax or has word syntax and isn't a letter.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
248 (let ((symbol (string-to-syntax "_"))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
249 (sst (standard-syntax-table)))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
250 (dotimes (i 128)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
251 (unless (= i ?_)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
252 (if (equal symbol (aref sst i))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
253 (modify-syntax-entry i "." table)))))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
254 (modify-syntax-entry ?$ "." table)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
255 (modify-syntax-entry ?% "." table)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
256 ;; exceptions
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
257 (modify-syntax-entry ?# "<" table)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
258 (modify-syntax-entry ?\n ">" table)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
259 (modify-syntax-entry ?' "\"" table)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
260 (modify-syntax-entry ?` "$" table)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
261 table))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
262
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
263 ;;;; Utility stuff
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
264
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
265 (defsubst python-in-string/comment ()
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
266 "Return non-nil if point is in a Python literal (a comment or string)."
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
267 (syntax-ppss-context (syntax-ppss)))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
268
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
269 (defconst python-space-backslash-table
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
270 (let ((table (copy-syntax-table python-mode-syntax-table)))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
271 (modify-syntax-entry ?\\ " " table)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
272 table)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
273 "`python-mode-syntax-table' with backslash given whitespace syntax.")
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
274
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
275 (defun python-skip-comments/blanks (&optional backward)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
276 "Skip comments and blank lines.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
277 BACKWARD non-nil means go backwards, otherwise go forwards. Backslash is
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
278 treated as whitespace so that continued blank lines are skipped.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
279 Doesn't move out of comments -- should be outside or at end of line."
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
280 (with-syntax-table python-space-backslash-table
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
281 (forward-comment (if backward
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
282 most-negative-fixnum
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
283 most-positive-fixnum))))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
284
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
285 (defun python-backslash-continuation-line-p ()
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
286 "Non-nil if preceding line ends with backslash that is not in a comment."
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
287 (and (eq ?\\ (char-before (line-end-position 0)))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
288 (not (syntax-ppss-context (syntax-ppss)))))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
289
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
290 (defun python-continuation-line-p ()
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
291 "Return non-nil if current line continues a previous one.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
292 The criteria are that the previous line ends in a backslash outside
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
293 comments and strings, or that the bracket/paren nesting depth is nonzero."
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
294 (or (and (eq ?\\ (char-before (line-end-position 0)))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
295 (not (syntax-ppss-context (syntax-ppss))))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
296 (/= 0 (syntax-ppss-depth
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
297 (save-excursion ; syntax-ppss with arg changes point
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
298 (syntax-ppss (line-beginning-position)))))))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
299
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
300 (defun python-comment-line-p ()
55495
4e81c5df6c36 (inferior-python-mode-map): Remove erroneous C-c C-z binding.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55447
diff changeset
301 "Return non-nil iff current line has only a comment."
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
302 (save-excursion
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
303 (end-of-line)
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
304 (when (eq 'comment (syntax-ppss-context (syntax-ppss)))
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
305 (back-to-indentation)
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
306 (looking-at (rx (or (syntax comment-start) line-end))))))
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
307
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
308 (defun python-beginning-of-string ()
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
309 "Go to beginning of string around point.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
310 Do nothing if not in string."
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
311 (let ((state (syntax-ppss)))
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
312 (when (eq 'string (syntax-ppss-context state))
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
313 (goto-char (nth 8 state)))))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
314
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
315 (defun python-open-block-statement-p (&optional bos)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
316 "Return non-nil if statement at point opens a block.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
317 BOS non-nil means point is known to be at beginning of statement."
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
318 (save-excursion
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
319 (unless bos (python-beginning-of-statement))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
320 (and (not (python-comment-line-p))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
321 (re-search-forward (rx (and ?: (0+ space)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
322 (optional (and (syntax comment-start)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
323 (0+ not-newline)))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
324 line-end))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
325 (save-excursion (python-end-of-statement))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
326 t)
56051
0cecb3d4d566 (python-open-block-statement-p): Fix
Eli Zaretskii <eliz@gnu.org>
parents: 55511
diff changeset
327 (not (progn (goto-char (match-beginning 0))
0cecb3d4d566 (python-open-block-statement-p): Fix
Eli Zaretskii <eliz@gnu.org>
parents: 55511
diff changeset
328 (python-in-string/comment))))))
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
329
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
330 (defun python-close-block-statement-p (&optional bos)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
331 "Return non-nil if current line is a statement closing a block.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
332 BOS non-nil means point is at beginning of statement.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
333 The criteria are that the line isn't a comment or in string and starts with
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
334 keyword `raise', `break', `continue' or `pass'."
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
335 (save-excursion
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
336 (unless bos (python-beginning-of-statement))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
337 (back-to-indentation)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
338 (looking-at (rx (and (or "return" "raise" "break" "continue" "pass")
60931
494d942e49fe (python-close-block-statement-p)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 59996
diff changeset
339 symbol-end)))))
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
340
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
341 (defun python-outdent-p ()
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
342 "Return non-nil if current line should outdent a level."
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
343 (save-excursion
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
344 (back-to-indentation)
60931
494d942e49fe (python-close-block-statement-p)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 59996
diff changeset
345 (and (looking-at (rx (and (or (and (or "else" "finally") symbol-end)
494d942e49fe (python-close-block-statement-p)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 59996
diff changeset
346 (and (or "except" "elif") symbol-end
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
347 (1+ (not (any ?:)))))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
348 (optional space) ":" (optional space)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
349 (or (syntax comment-start) line-end))))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
350 (progn (end-of-line)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
351 (not (python-in-string/comment)))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
352 ;; Ensure there's a previous statement and move to it.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
353 (zerop (python-previous-statement))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
354 (not (python-close-block-statement-p t))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
355 ;; Fixme: check this
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
356 (not (looking-at (rx (and (or (and (or "if" "elif" "except"
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
357 "for" "while")
60931
494d942e49fe (python-close-block-statement-p)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 59996
diff changeset
358 symbol-end (1+ (not (any ?:))))
494d942e49fe (python-close-block-statement-p)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 59996
diff changeset
359 (and "try" symbol-end))
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
360 (optional space) ":" (optional space)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
361 (or (syntax comment-start) line-end)))))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
362 (progn (end-of-line)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
363 (not (python-in-string/comment))))))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
364
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
365 ;;;; Indentation.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
366
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
367 (defcustom python-indent 4
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
368 "*Number of columns for a unit of indentation in Python mode.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
369 See also `\\[python-guess-indent]'"
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
370 :group 'python
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
371 :type 'integer)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
372
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
373 (defcustom python-guess-indent t
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
374 "*Non-nil means Python mode guesses `python-indent' for the buffer."
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
375 :type 'boolean
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
376 :group 'python)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
377
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
378 (defcustom python-indent-string-contents t
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
379 "*Non-nil means indent contents of multi-line strings together.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
380 This means indent them the same as the preceding non-blank line.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
381 Otherwise indent them to column zero."
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
382 :type '(choice (const :tag "Align with preceding" t)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
383 (const :tag "Indent to column 0" nil))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
384 :group 'python)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
385
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
386 (defcustom python-honour-comment-indentation nil
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
387 "Non-nil means indent relative to preceding comment line.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
388 Only do this for comments where the leading comment character is followed
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
389 by space. This doesn't apply to comment lines, which are always indented
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
390 in lines with preceding comments."
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
391 :type 'boolean
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
392 :group 'python)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
393
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
394 (defcustom python-continuation-offset 4
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
395 "*Number of columns of additional indentation for continuation lines.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
396 Continuation lines follow a backslash-terminated line starting a statement."
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
397 :group 'python
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
398 :type 'integer)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
399
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
400 (defun python-guess-indent ()
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
401 "Guess step for indentation of current buffer.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
402 Set `python-indent' locally to the value guessed."
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
403 (interactive)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
404 (save-excursion
54840
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
405 (save-restriction
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
406 (widen)
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
407 (goto-char (point-min))
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
408 (let (done indent)
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
409 (while (and (not done) (not (eobp)))
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
410 (when (and (re-search-forward (rx (and ?: (0+ space)
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
411 (or (syntax comment-start)
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
412 line-end)))
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
413 nil 'move)
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
414 (python-open-block-statement-p))
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
415 (save-excursion
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
416 (python-beginning-of-statement)
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
417 (let ((initial (current-indentation)))
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
418 (if (zerop (python-next-statement))
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
419 (setq indent (- (current-indentation) initial)))
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
420 (if (and (>= indent 2) (<= indent 8)) ; sanity check
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
421 (setq done t))))))
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
422 (when done
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
423 (when (/= indent (default-value 'python-indent))
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
424 (set (make-local-variable 'python-indent) indent)
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
425 (unless (= tab-width python-indent)
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
426 (setq indent-tabs-mode nil)))
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
427 indent)))))
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
428
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
429 (defun python-calculate-indentation ()
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
430 "Calculate Python indentation for line at point."
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
431 (save-excursion
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
432 (beginning-of-line)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
433 (let ((syntax (syntax-ppss))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
434 start)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
435 (cond
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
436 ((eq 'string (syntax-ppss-context syntax)) ; multi-line string
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
437 (if (not python-indent-string-contents)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
438 0
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
439 (save-excursion
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
440 ;; Find indentation of preceding non-blank line within string.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
441 (setq start (nth 8 syntax))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
442 (forward-line -1)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
443 (while (and (< start (point)) (looking-at "\\s-*$"))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
444 (forward-line -1))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
445 (current-indentation))))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
446 ((python-continuation-line-p)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
447 (let ((point (point))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
448 (open-start (cadr syntax)))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
449 (if open-start
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
450 ;; Inside bracketed expression.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
451 (progn
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
452 (goto-char (1+ open-start))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
453 ;; Look for first item in list (preceding point) and
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
454 ;; align with it, if found.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
455 (if (with-syntax-table python-space-backslash-table
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
456 (let ((parse-sexp-ignore-comments t))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
457 (condition-case ()
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
458 (progn (forward-sexp)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
459 (backward-sexp)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
460 (< (point) point))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
461 (error nil))))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
462 (current-column)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
463 ;; Otherwise indent relative to statement start, one
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
464 ;; level per bracketing level.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
465 (goto-char (1+ open-start))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
466 (python-beginning-of-statement)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
467 (+ (current-indentation) (* (car syntax) python-indent))))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
468 ;; Otherwise backslash-continued.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
469 (forward-line -1)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
470 (if (python-continuation-line-p)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
471 ;; We're past first continuation line. Align with
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
472 ;; previous line.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
473 (current-indentation)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
474 ;; First continuation line. Indent one step, with an
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
475 ;; extra one if statement opens a block.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
476 (save-excursion
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
477 (python-beginning-of-statement)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
478 (+ (current-indentation) python-continuation-offset
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
479 (if (python-open-block-statement-p t)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
480 python-indent
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
481 0)))))))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
482 ((bobp) 0)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
483 ;; Fixme: Like python-mode.el; not convinced by this.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
484 ((looking-at (rx (and (0+ space) (syntax comment-start)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
485 (not (any " \t\n"))))) ; non-indentable comment
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
486 (current-indentation))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
487 (t (let ((point (point)))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
488 (if python-honour-comment-indentation
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
489 ;; Back over whitespace, newlines, non-indentable comments.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
490 (catch 'done
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
491 (while t
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
492 (if (cond ((bobp))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
493 ;; not at comment start
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
494 ((not (forward-comment -1))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
495 (python-beginning-of-statement)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
496 t)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
497 ;; trailing comment
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
498 ((/= (current-column) (current-indentation))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
499 (python-beginning-of-statement)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
500 t)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
501 ;; indentable comment like python-mode.el
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
502 ((and (looking-at (rx (and (syntax comment-start)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
503 (or space line-end))))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
504 (/= 0 (current-column)))))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
505 (throw 'done t))))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
506 ;; Else back over all comments.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
507 (python-skip-comments/blanks t)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
508 (python-beginning-of-statement))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
509 ;; don't lose on bogus outdent
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
510 (max 0 (+ (current-indentation)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
511 (or (cond ((python-open-block-statement-p t)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
512 python-indent)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
513 ((python-close-block-statement-p t)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
514 (- python-indent)))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
515 (progn (goto-char point)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
516 (if (python-outdent-p)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
517 (- python-indent)))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
518 0)))))))))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
519
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
520 (defun python-comment-indent ()
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
521 "`comment-indent-function' for Python."
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
522 ;; If previous non-blank line was a comment, use its indentation.
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
523 ;; FIXME: This seems unnecessary since the default code delegates to
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
524 ;; indent-according-to-mode. --Stef
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
525 (unless (bobp)
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
526 (save-excursion
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
527 (forward-comment -1)
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
528 (if (eq ?# (char-after)) (current-column)))))
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
529
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
530 ;;;; Cycling through the possible indentations with successive TABs.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
531
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
532 ;; These don't need to be buffer-local since they're only relevant
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
533 ;; during a cycle.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
534
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
535 ;; Alist of possible indentations and start of statement they would close.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
536 (defvar python-indent-list nil
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
537 "Internal use.")
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
538 ;; Length of the above
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
539 (defvar python-indent-list-length nil
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
540 "Internal use.")
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
541 ;; Current index into the alist.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
542 (defvar python-indent-index nil
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
543 "Internal use.")
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
544
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
545 (defun python-initial-text ()
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
546 "Text of line following indentation and ignoring any trailing comment."
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
547 (buffer-substring (+ (line-beginning-position) (current-indentation))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
548 (save-excursion
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
549 (end-of-line)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
550 (forward-comment -1)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
551 (point))))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
552
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
553 (defun python-indentation-levels ()
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
554 "Return a list of possible indentations for this line.
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
555 Includes the default indentation and those which would close all
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
556 enclosing blocks. Assumes the line has already been indented per
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
557 `python-indent-line'. Elements of the list are actually pairs:
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
558 \(INDENTATION . TEXT), where TEXT is the initial text of the
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
559 corresponding block opening (or nil)."
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
560 (save-excursion
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
561 (let ((levels (list (cons (current-indentation)
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
562 (save-excursion
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
563 (if (python-beginning-of-block)
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
564 (python-initial-text)))))))
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
565 ;; Only one possibility if we immediately follow a block open or
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
566 ;; are in a continuation line.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
567 (unless (or (python-continuation-line-p)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
568 (save-excursion (and (python-previous-statement)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
569 (python-open-block-statement-p t))))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
570 (while (python-beginning-of-block)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
571 (push (cons (current-indentation) (python-initial-text))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
572 levels)))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
573 levels)))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
574
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
575 ;; This is basically what `python-indent-line' would be if we didn't
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
576 ;; do the cycling.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
577 (defun python-indent-line-1 ()
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
578 "Subroutine of `python-indent-line'."
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
579 (let ((target (python-calculate-indentation))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
580 (pos (- (point-max) (point))))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
581 (if (= target (current-indentation))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
582 (if (< (current-column) (current-indentation))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
583 (back-to-indentation))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
584 (beginning-of-line)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
585 (delete-horizontal-space)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
586 (indent-to target)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
587 (if (> (- (point-max) pos) (point))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
588 (goto-char (- (point-max) pos))))))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
589
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
590 (defun python-indent-line ()
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
591 "Indent current line as Python code.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
592 When invoked via `indent-for-tab-command', cycle through possible
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
593 indentations for current line. The cycle is broken by a command different
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
594 from `indent-for-tab-command', i.e. successive TABs do the cycling."
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
595 (interactive)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
596 ;; Don't do extra work if invoked via `indent-region', for instance.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
597 (if (not (eq this-command 'indent-for-tab-command))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
598 (python-indent-line-1)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
599 (if (eq last-command this-command)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
600 (if (= 1 python-indent-list-length)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
601 (message "Sole indentation")
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
602 (progn (setq python-indent-index (% (1+ python-indent-index)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
603 python-indent-list-length))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
604 (beginning-of-line)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
605 (delete-horizontal-space)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
606 (indent-to (car (nth python-indent-index python-indent-list)))
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
607 (if (python-block-end-p)
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
608 (let ((text (cdr (nth python-indent-index
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
609 python-indent-list))))
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
610 (if text
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
611 (message "Closes: %s" text))))))
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
612 (python-indent-line-1)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
613 (setq python-indent-list (python-indentation-levels)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
614 python-indent-list-length (length python-indent-list)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
615 python-indent-index (1- python-indent-list-length)))))
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
616
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
617 (defun python-block-end-p ()
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
618 "Non-nil if this is a line in a statement closing a block,
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
619 or a blank line indented to where it would close a block."
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
620 (and (not (python-comment-line-p))
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
621 (or (python-close-block-statement-p t)
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
622 (< (current-indentation)
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
623 (save-excursion
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
624 (python-previous-statement)
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
625 (current-indentation))))))
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
626
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
627 ;; Fixme: Define an indent-region-function. It should probably leave
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
628 ;; lines alone if the indentation is already at one of the allowed
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
629 ;; levels. Otherwise, M-C-\ typically keeps indenting more deeply
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
630 ;; down a function.
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
631
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
632 ;;;; Movement.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
633
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
634 (defun python-beginning-of-defun ()
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
635 "`beginning-of-defun-function' for Python.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
636 Finds beginning of innermost nested class or method definition.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
637 Returns the name of the definition found at the end, or nil if reached
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
638 start of buffer."
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
639 (let ((ci (current-indentation))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
640 (def-re (rx (and line-start (0+ space) (or "def" "class")
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
641 (1+ space)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
642 (group (1+ (or word (syntax symbol)))))))
54888
89ed55db7532 (python-orig-start-line, python-orig-file): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54886
diff changeset
643 found lep def-line)
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
644 (if (python-comment-line-p)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
645 (setq ci most-positive-fixnum))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
646 (while (and (not (bobp)) (not found))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
647 ;; Treat bol at beginning of function as outside function so
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
648 ;; that successive C-M-a makes progress backwards.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
649 (setq def-line (looking-at def-re))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
650 (unless (bolp) (end-of-line))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
651 (setq lep (line-end-position))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
652 (if (and (re-search-backward def-re nil 'move)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
653 ;; Must be less indented or matching top level, or
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
654 ;; equally indented if we started on a definition line.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
655 (let ((in (current-indentation)))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
656 (or (and (zerop ci) (zerop in))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
657 (= lep (line-end-position)) ; on initial line
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
658 (and def-line (= in ci))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
659 (< in ci)))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
660 (not (python-in-string/comment)))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
661 (setq found t)))))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
662
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
663 (defun python-end-of-defun ()
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
664 "`end-of-defun-function' for Python.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
665 Finds end of innermost nested class or method definition."
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
666 (let ((orig (point))
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
667 (pattern (rx (and line-start (0+ space) (or "def" "class") space))))
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
668 ;; Go to start of current block and check whether it's at top
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
669 ;; level. If it is, and not a block start, look forward for
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
670 ;; definition statement.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
671 (when (python-comment-line-p)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
672 (end-of-line)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
673 (forward-comment most-positive-fixnum))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
674 (if (not (python-open-block-statement-p))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
675 (python-beginning-of-block))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
676 (if (zerop (current-indentation))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
677 (unless (python-open-block-statement-p)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
678 (while (and (re-search-forward pattern nil 'move)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
679 (python-in-string/comment))) ; just loop
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
680 (unless (eobp)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
681 (beginning-of-line)))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
682 ;; Don't move before top-level statement that would end defun.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
683 (end-of-line)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
684 (python-beginning-of-defun))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
685 ;; If we got to the start of buffer, look forward for
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
686 ;; definition statement.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
687 (if (and (bobp) (not (looking-at "def\\|class")))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
688 (while (and (not (eobp))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
689 (re-search-forward pattern nil 'move)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
690 (python-in-string/comment)))) ; just loop
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
691 ;; We're at a definition statement (or end-of-buffer).
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
692 (unless (eobp)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
693 (python-end-of-block)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
694 ;; Count trailing space in defun (but not trailing comments).
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
695 (skip-syntax-forward " >")
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
696 (beginning-of-line))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
697 ;; Catch pathological case like this, where the beginning-of-defun
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
698 ;; skips to a definition we're not in:
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
699 ;; if ...:
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
700 ;; ...
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
701 ;; else:
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
702 ;; ... # point here
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
703 ;; ...
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
704 ;; def ...
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
705 (if (< (point) orig)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
706 (goto-char (point-max)))))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
707
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
708 (defun python-beginning-of-statement ()
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
709 "Go to start of current statement.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
710 Accounts for continuation lines, multi-line strings, and multi-line bracketed
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
711 expressions."
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
712 (beginning-of-line)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
713 (python-beginning-of-string)
56324
e6bf7376c962 (python-beginning-of-statement): Exit the loop if backward-up-list gets error.
Richard M. Stallman <rms@gnu.org>
parents: 56051
diff changeset
714 (catch 'foo
e6bf7376c962 (python-beginning-of-statement): Exit the loop if backward-up-list gets error.
Richard M. Stallman <rms@gnu.org>
parents: 56051
diff changeset
715 (while (python-continuation-line-p)
e6bf7376c962 (python-beginning-of-statement): Exit the loop if backward-up-list gets error.
Richard M. Stallman <rms@gnu.org>
parents: 56051
diff changeset
716 (beginning-of-line)
e6bf7376c962 (python-beginning-of-statement): Exit the loop if backward-up-list gets error.
Richard M. Stallman <rms@gnu.org>
parents: 56051
diff changeset
717 (if (python-backslash-continuation-line-p)
e6bf7376c962 (python-beginning-of-statement): Exit the loop if backward-up-list gets error.
Richard M. Stallman <rms@gnu.org>
parents: 56051
diff changeset
718 (while (python-backslash-continuation-line-p)
e6bf7376c962 (python-beginning-of-statement): Exit the loop if backward-up-list gets error.
Richard M. Stallman <rms@gnu.org>
parents: 56051
diff changeset
719 (forward-line -1))
e6bf7376c962 (python-beginning-of-statement): Exit the loop if backward-up-list gets error.
Richard M. Stallman <rms@gnu.org>
parents: 56051
diff changeset
720 (python-beginning-of-string)
e6bf7376c962 (python-beginning-of-statement): Exit the loop if backward-up-list gets error.
Richard M. Stallman <rms@gnu.org>
parents: 56051
diff changeset
721 ;; Skip forward out of nested brackets.
e6bf7376c962 (python-beginning-of-statement): Exit the loop if backward-up-list gets error.
Richard M. Stallman <rms@gnu.org>
parents: 56051
diff changeset
722 (condition-case () ; beware invalid syntax
e6bf7376c962 (python-beginning-of-statement): Exit the loop if backward-up-list gets error.
Richard M. Stallman <rms@gnu.org>
parents: 56051
diff changeset
723 (progn (backward-up-list (syntax-ppss-depth (syntax-ppss))) t)
e6bf7376c962 (python-beginning-of-statement): Exit the loop if backward-up-list gets error.
Richard M. Stallman <rms@gnu.org>
parents: 56051
diff changeset
724 (error (throw 'foo nil))))))
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
725 (back-to-indentation))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
726
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
727 (defun python-end-of-statement ()
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
728 "Go to the end of the current statement and return point.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
729 Usually this is the start of the next line, but if this is a
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
730 multi-line statement we need to skip over the continuation lines.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
731 On a comment line, go to end of line."
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
732 (end-of-line)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
733 (while (let (comment)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
734 ;; Move past any enclosing strings and sexps, or stop if
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
735 ;; we're in a comment.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
736 (while (let ((s (syntax-ppss)))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
737 (cond ((eq 'comment (syntax-ppss-context s))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
738 (setq comment t)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
739 nil)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
740 ((eq 'string (syntax-ppss-context s))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
741 ;; Go to start of string and skip it.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
742 (goto-char (nth 8 s))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
743 (condition-case () ; beware invalid syntax
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
744 (progn (forward-sexp) t)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
745 (error (end-of-line))))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
746 ((> (syntax-ppss-depth s) 0)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
747 ;; Skip forward out of nested brackets.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
748 (condition-case () ; beware invalid syntax
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
749 (progn (backward-up-list
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
750 (- (syntax-ppss-depth s)))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
751 t)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
752 (error (end-of-line))))))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
753 (end-of-line))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
754 (unless comment
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
755 (eq ?\\ (char-before)))) ; Line continued?
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
756 (end-of-line 2)) ; Try next line.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
757 (point))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
758
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
759 (defun python-previous-statement (&optional count)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
760 "Go to start of previous statement.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
761 With argument COUNT, do it COUNT times. Stop at beginning of buffer.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
762 Return count of statements left to move."
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
763 (interactive "p")
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
764 (unless count (setq count 1))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
765 (if (< count 0)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
766 (python-next-statement (- count))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
767 (python-beginning-of-statement)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
768 (while (and (> count 0) (not (bobp)))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
769 (python-skip-comments/blanks t)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
770 (python-beginning-of-statement)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
771 (unless (bobp) (setq count (1- count))))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
772 count))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
773
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
774 (defun python-next-statement (&optional count)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
775 "Go to start of next statement.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
776 With argument COUNT, do it COUNT times. Stop at end of buffer.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
777 Return count of statements left to move."
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
778 (interactive "p")
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
779 (unless count (setq count 1))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
780 (if (< count 0)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
781 (python-previous-statement (- count))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
782 (beginning-of-line)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
783 (while (and (> count 0) (not (eobp)))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
784 (python-end-of-statement)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
785 (python-skip-comments/blanks)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
786 (setq count (1- count)))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
787 count))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
788
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
789 (defun python-beginning-of-block (&optional arg)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
790 "Go to start of current block.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
791 With numeric arg, do it that many times. If ARG is negative, call
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
792 `python-end-of-block' instead.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
793 If point is on the first line of a block, use its outer block.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
794 If current statement is in column zero, don't move and return nil.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
795 Otherwise return non-nil."
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
796 (interactive "p")
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
797 (unless arg (setq arg 1))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
798 (cond
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
799 ((zerop arg))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
800 ((< arg 0) (python-end-of-block (- arg)))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
801 (t
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
802 (let ((point (point)))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
803 (if (python-comment-line-p)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
804 (python-skip-comments/blanks t))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
805 (python-beginning-of-statement)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
806 (let ((ci (current-indentation)))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
807 (if (zerop ci)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
808 (not (goto-char point)) ; return nil
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
809 ;; Look upwards for less indented statement.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
810 (if (catch 'done
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
811 ;;; This is slower than the below.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
812 ;;; (while (zerop (python-previous-statement))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
813 ;;; (when (and (< (current-indentation) ci)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
814 ;;; (python-open-block-statement-p t))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
815 ;;; (beginning-of-line)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
816 ;;; (throw 'done t)))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
817 (while (and (zerop (forward-line -1)))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
818 (when (and (< (current-indentation) ci)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
819 (not (python-comment-line-p))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
820 ;; Move to beginning to save effort in case
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
821 ;; this is in string.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
822 (progn (python-beginning-of-statement) t)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
823 (python-open-block-statement-p t))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
824 (beginning-of-line)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
825 (throw 'done t)))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
826 (not (goto-char point))) ; Failed -- return nil
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
827 (python-beginning-of-block (1- arg)))))))))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
828
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
829 (defun python-end-of-block (&optional arg)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
830 "Go to end of current block.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
831 With numeric arg, do it that many times. If ARG is negative, call
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
832 `python-beginning-of-block' instead.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
833 If current statement is in column zero and doesn't open a block, don't
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
834 move and return nil. Otherwise return t."
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
835 (interactive "p")
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
836 (unless arg (setq arg 1))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
837 (if (< arg 0)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
838 (python-beginning-of-block (- arg)))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
839 (while (and (> arg 0)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
840 (let* ((point (point))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
841 (_ (if (python-comment-line-p)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
842 (python-skip-comments/blanks t)))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
843 (ci (current-indentation))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
844 (open (python-open-block-statement-p)))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
845 (if (and (zerop ci) (not open))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
846 (not (goto-char point))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
847 (catch 'done
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
848 (while (zerop (python-next-statement))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
849 (when (or (and open (<= (current-indentation) ci))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
850 (< (current-indentation) ci))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
851 (python-skip-comments/blanks t)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
852 (beginning-of-line 2)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
853 (throw 'done t)))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
854 (not (goto-char point))))))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
855 (setq arg (1- arg)))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
856 (zerop arg))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
857
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
858 ;;;; Imenu.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
859
54888
89ed55db7532 (python-orig-start-line, python-orig-file): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54886
diff changeset
860 (defvar python-recursing)
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
861 (defun python-imenu-create-index ()
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
862 "`imenu-create-index-function' for Python.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
863
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
864 Makes nested Imenu menus from nested `class' and `def' statements.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
865 The nested menus are headed by an item referencing the outer
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
866 definition; it has a space prepended to the name so that it sorts
54938
109b2bf180dd (python-after-info-look): Use with-no-warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54888
diff changeset
867 first with `imenu--sort-by-name' (though, unfortunately, sub-menus
109b2bf180dd (python-after-info-look): Use with-no-warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54888
diff changeset
868 precede it)."
54888
89ed55db7532 (python-orig-start-line, python-orig-file): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54886
diff changeset
869 (unless (boundp 'python-recursing) ; dynamically bound below
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
870 (goto-char (point-min))) ; normal call from Imenu
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
871 (let (index-alist ; accumulated value to return
54888
89ed55db7532 (python-orig-start-line, python-orig-file): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54886
diff changeset
872 name)
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
873 (while (re-search-forward
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
874 (rx (and line-start (0+ space) ; leading space
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
875 (or (group "def") (group "class")) ; type
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
876 (1+ space) (group (1+ (or word ?_))))) ; name
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
877 nil t)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
878 (unless (python-in-string/comment)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
879 (let ((pos (match-beginning 0))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
880 (name (match-string-no-properties 3)))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
881 (if (match-beginning 2) ; def or class?
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
882 (setq name (concat "class " name)))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
883 (save-restriction
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
884 (narrow-to-defun)
54888
89ed55db7532 (python-orig-start-line, python-orig-file): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54886
diff changeset
885 (let* ((python-recursing t)
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
886 (sublist (python-imenu-create-index)))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
887 (if sublist
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
888 (progn (push (cons (concat " " name) pos) sublist)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
889 (push (cons name sublist) index-alist))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
890 (push (cons name pos) index-alist)))))))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
891 (nreverse index-alist)))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
892
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
893 ;;;; `Electric' commands.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
894
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
895 (defun python-electric-colon (arg)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
896 "Insert a colon and maybe outdent the line if it is a statement like `else'.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
897 With numeric ARG, just insert that many colons. With \\[universal-argument],
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
898 just insert a single colon."
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
899 (interactive "*P")
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
900 (self-insert-command (if (not (integerp arg)) 1 arg))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
901 (and (not arg)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
902 (eolp)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
903 (python-outdent-p)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
904 (not (python-in-string/comment))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
905 (> (current-indentation) (python-calculate-indentation))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
906 (python-indent-line))) ; OK, do it
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
907 (put 'python-electric-colon 'delete-selection t)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
908
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
909 (defun python-backspace (arg)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
910 "Maybe delete a level of indentation on the current line.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
911 If not at the end of line's indentation, or on a comment line, just call
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
912 `backward-delete-char-untabify'. With ARG, repeat that many times."
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
913 (interactive "*p")
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
914 (if (or (/= (current-indentation) (current-column))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
915 (bolp)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
916 (python-continuation-line-p))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
917 (backward-delete-char-untabify arg)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
918 (let ((indent 0))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
919 (save-excursion
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
920 (while (and (> arg 0) (python-beginning-of-block))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
921 (setq arg (1- arg)))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
922 (when (zerop arg)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
923 (setq indent (current-indentation))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
924 (message "Closes %s" (python-initial-text))))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
925 (delete-horizontal-space)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
926 (indent-to indent))))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
927 (put 'python-backspace 'delete-selection 'supersede)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
928
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
929 ;;;; pychecker
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
930
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
931 (defcustom python-check-command "pychecker --stdlib"
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
932 "*Command used to check a Python file."
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
933 :type 'string
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
934 :group 'python)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
935
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
936 (defvar python-saved-check-command nil
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
937 "Internal use.")
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
938
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
939 ;; After `sgml-validate-command'.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
940 (defun python-check (command)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
941 "Check a Python file (default current buffer's file).
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
942 Runs COMMAND, a shell command, as if by `compile'.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
943 See `python-check-command' for the default."
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
944 (interactive
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
945 (list (read-string "Checker command: "
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
946 (or python-saved-check-command
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
947 (concat python-check-command " "
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
948 (let ((name (buffer-file-name)))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
949 (if name
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
950 (file-name-nondirectory name))))))))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
951 (setq python-saved-check-command command)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
952 (save-some-buffers (not compilation-ask-about-save) nil)
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
953 (let ((compilation-error-regexp-alist
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
954 (cons '("(\\([^,]+\\), line \\([0-9]+\\))" 1 2)
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
955 compilation-error-regexp-alist)))
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
956 (compilation-start command)))
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
957
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
958 ;;;; Inferior mode stuff (following cmuscheme).
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
959
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
960 ;; Fixme: Make sure we can work with IPython.
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
961
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
962 (defcustom python-python-command "python"
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
963 "*Shell command to run Python interpreter.
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
964 Any arguments can't contain whitespace.
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
965 Note that IPython may not work properly; it must at least be used with the
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
966 `-cl' flag, i.e. use `ipython -cl'."
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
967 :group 'python
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
968 :type 'string)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
969
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
970 (defcustom python-jython-command "jython"
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
971 "*Shell command to run Jython interpreter.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
972 Any arguments can't contain whitespace."
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
973 :group 'python
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
974 :type 'string)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
975
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
976 (defvar python-command python-python-command
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
977 "Actual command used to run Python.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
978 May be `python-python-command' or `python-jython-command'.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
979 Additional arguments are added when the command is used by `run-python'
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
980 et al.")
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
981
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
982 (defvar python-buffer nil
54938
109b2bf180dd (python-after-info-look): Use with-no-warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54888
diff changeset
983 "The current python process buffer."
109b2bf180dd (python-after-info-look): Use with-no-warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54888
diff changeset
984 ;; Fixme: a single process is currently assumed, so that this doc
109b2bf180dd (python-after-info-look): Use with-no-warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54888
diff changeset
985 ;; is misleading.
109b2bf180dd (python-after-info-look): Use with-no-warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54888
diff changeset
986
109b2bf180dd (python-after-info-look): Use with-no-warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54888
diff changeset
987 ;; "*The current python process buffer.
109b2bf180dd (python-after-info-look): Use with-no-warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54888
diff changeset
988 ;; To run multiple Python processes, start the first with \\[run-python].
109b2bf180dd (python-after-info-look): Use with-no-warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54888
diff changeset
989 ;; It will be in a buffer named *Python*. Rename that with
109b2bf180dd (python-after-info-look): Use with-no-warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54888
diff changeset
990 ;; \\[rename-buffer]. Now start a new process with \\[run-python]. It
109b2bf180dd (python-after-info-look): Use with-no-warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54888
diff changeset
991 ;; will be in a new buffer, named *Python*. Switch between the different
109b2bf180dd (python-after-info-look): Use with-no-warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54888
diff changeset
992 ;; process buffers with \\[switch-to-buffer].
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
993
54938
109b2bf180dd (python-after-info-look): Use with-no-warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54888
diff changeset
994 ;; Commands that send text from source buffers to Python processes have
109b2bf180dd (python-after-info-look): Use with-no-warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54888
diff changeset
995 ;; to choose a process to send to. This is determined by global variable
109b2bf180dd (python-after-info-look): Use with-no-warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54888
diff changeset
996 ;; `python-buffer'. Suppose you have three inferior Pythons running:
109b2bf180dd (python-after-info-look): Use with-no-warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54888
diff changeset
997 ;; Buffer Process
109b2bf180dd (python-after-info-look): Use with-no-warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54888
diff changeset
998 ;; foo python
109b2bf180dd (python-after-info-look): Use with-no-warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54888
diff changeset
999 ;; bar python<2>
109b2bf180dd (python-after-info-look): Use with-no-warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54888
diff changeset
1000 ;; *Python* python<3>
109b2bf180dd (python-after-info-look): Use with-no-warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54888
diff changeset
1001 ;; If you do a \\[python-send-region-and-go] command on some Python source
109b2bf180dd (python-after-info-look): Use with-no-warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54888
diff changeset
1002 ;; code, what process does it go to?
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1003
54938
109b2bf180dd (python-after-info-look): Use with-no-warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54888
diff changeset
1004 ;; - In a process buffer (foo, bar, or *Python*), send it to that process.
109b2bf180dd (python-after-info-look): Use with-no-warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54888
diff changeset
1005 ;; - In some other buffer (e.g. a source file), send it to the process
109b2bf180dd (python-after-info-look): Use with-no-warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54888
diff changeset
1006 ;; attached to `python-buffer'.
109b2bf180dd (python-after-info-look): Use with-no-warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54888
diff changeset
1007 ;; Process selection is done by function `python-proc'.
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1008
54938
109b2bf180dd (python-after-info-look): Use with-no-warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54888
diff changeset
1009 ;; Whenever \\[run-python] starts a new process, it resets `python-buffer'
109b2bf180dd (python-after-info-look): Use with-no-warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54888
diff changeset
1010 ;; to be the new process's buffer. If you only run one process, this will
109b2bf180dd (python-after-info-look): Use with-no-warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54888
diff changeset
1011 ;; do the right thing. If you run multiple processes, you can change
109b2bf180dd (python-after-info-look): Use with-no-warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54888
diff changeset
1012 ;; `python-buffer' to another process buffer with \\[set-variable]."
109b2bf180dd (python-after-info-look): Use with-no-warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54888
diff changeset
1013 )
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1014
54840
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1015 (defconst python-compilation-regexp-alist
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1016 ;; FIXME: maybe these should move to compilation-error-regexp-alist-alist.
54840
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1017 `((,(rx (and line-start (1+ (any " \t")) "File \""
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1018 (group (1+ (not (any "\"<")))) ; avoid `<stdin>' &c
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1019 "\", line " (group (1+ digit))))
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1020 1 2)
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1021 (,(rx (and " in file " (group (1+ not-newline)) " on line "
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1022 (group (1+ digit))))
55300
2db456741f80 (python-compilation-line-number): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55240
diff changeset
1023 1 2))
54840
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1024 "`compilation-error-regexp-alist' for inferior Python.")
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1025
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1026 (defvar inferior-python-mode-map
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1027 (let ((map (make-sparse-keymap)))
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1028 ;; This will inherit from comint-mode-map.
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1029 (define-key map "\C-c\C-l" 'python-load-file)
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1030 (define-key map "\C-c\C-v" 'python-check)
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1031 ;; Note that we _can_ still use these commands which send to the
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1032 ;; Python process even at the prompt iff we have a normal prompt,
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1033 ;; i.e. '>>> ' and not '... '. See the comment before
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1034 ;; python-send-region. Fixme: uncomment these if we address that.
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1035
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1036 ;; (define-key map [(meta ?\t)] 'python-complete-symbol)
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1037 ;; (define-key map "\C-c\C-f" 'python-describe-symbol)
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1038 map))
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1039
54938
109b2bf180dd (python-after-info-look): Use with-no-warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54888
diff changeset
1040 ;; Fixme: This should inherit some stuff from python-mode, but I'm not
109b2bf180dd (python-after-info-look): Use with-no-warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54888
diff changeset
1041 ;; sure how much: at least some keybindings, like C-c C-f; syntax?;
109b2bf180dd (python-after-info-look): Use with-no-warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54888
diff changeset
1042 ;; font-locking, e.g. for triple-quoted strings?
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1043 (define-derived-mode inferior-python-mode comint-mode "Inferior Python"
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1044 "Major mode for interacting with an inferior Python process.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1045 A Python process can be started with \\[run-python].
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1046
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1047 Hooks `comint-mode-hook' and `inferior-python-mode-hook' are run in
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1048 that order.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1049
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1050 You can send text to the inferior Python process from other buffers containing
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1051 Python source.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1052 * `python-switch-to-python' switches the current buffer to the Python
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1053 process buffer.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1054 * `python-send-region' sends the current region to the Python process.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1055 * `python-send-region-and-go' switches to the Python process buffer
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1056 after sending the text.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1057 For running multiple processes in multiple buffers, see `python-buffer'.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1058
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1059 \\{inferior-python-mode-map}"
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1060 :group 'python
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1061 (set-syntax-table python-mode-syntax-table)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1062 (setq mode-line-process '(":%s"))
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1063 (set (make-local-variable 'comint-input-filter) 'python-input-filter)
54840
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1064 (add-hook 'comint-preoutput-filter-functions #'python-preoutput-filter
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1065 nil t)
54938
109b2bf180dd (python-after-info-look): Use with-no-warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54888
diff changeset
1066 ;; Still required by `comint-redirect-send-command', for instance
109b2bf180dd (python-after-info-look): Use with-no-warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54888
diff changeset
1067 ;; (and we need to match things like `>>> ... >>> '):
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1068 (set (make-local-variable 'comint-prompt-regexp)
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1069 (rx (and line-start (1+ (and (repeat 3 (any ">.")) ?\ )))))
54840
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1070 (set (make-local-variable 'compilation-error-regexp-alist)
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1071 python-compilation-regexp-alist)
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1072 (compilation-shell-minor-mode 1))
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1073
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1074 (defcustom inferior-python-filter-regexp "\\`\\s-*\\S-?\\S-?\\s-*\\'"
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1075 "*Input matching this regexp is not saved on the history list.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1076 Default ignores all inputs of 0, 1, or 2 non-blank characters."
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1077 :type 'regexp
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1078 :group 'python)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1079
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1080 (defun python-input-filter (str)
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1081 "`comint-input-filter' function for inferior Python.
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1082 Don't save anything for STR matching `inferior-python-filter-regexp'."
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1083 (not (string-match inferior-python-filter-regexp str)))
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1084
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1085 ;; Fixme: Loses with quoted whitespace.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1086 (defun python-args-to-list (string)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1087 (let ((where (string-match "[ \t]" string)))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1088 (cond ((null where) (list string))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1089 ((not (= where 0))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1090 (cons (substring string 0 where)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1091 (python-args-to-list (substring string (+ 1 where)))))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1092 (t (let ((pos (string-match "[^ \t]" string)))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1093 (if pos (python-args-to-list (substring string pos))))))))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1094
54840
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1095 (defvar python-preoutput-result nil
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1096 "Data from last `_emacs_out' line seen by the preoutput filter.")
54840
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1097
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1098 (defvar python-preoutput-continuation nil
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1099 "If non-nil, funcall this when `python-preoutput-filter' sees `_emacs_ok'.")
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1100
61037
758ff54158e2 (python-preoutput-leftover): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 60931
diff changeset
1101 (defvar python-preoutput-leftover nil)
758ff54158e2 (python-preoutput-leftover): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 60931
diff changeset
1102
54840
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1103 ;; Using this stops us getting lines in the buffer like
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1104 ;; >>> ... ... >>>
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1105 ;; Also look for (and delete) an `_emacs_ok' string and call
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1106 ;; `python-preoutput-continuation' if we get it.
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1107 (defun python-preoutput-filter (s)
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1108 "`comint-preoutput-filter-functions' function: ignore prompts not at bol."
61037
758ff54158e2 (python-preoutput-leftover): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 60931
diff changeset
1109 (when python-preoutput-leftover
758ff54158e2 (python-preoutput-leftover): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 60931
diff changeset
1110 (setq s (concat python-preoutput-leftover s))
758ff54158e2 (python-preoutput-leftover): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 60931
diff changeset
1111 (setq python-preoutput-leftover nil))
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1112 (cond ((and (string-match (rx (and string-start (repeat 3 (any ".>"))
61037
758ff54158e2 (python-preoutput-leftover): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 60931
diff changeset
1113 " " string-end))
758ff54158e2 (python-preoutput-leftover): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 60931
diff changeset
1114 s)
758ff54158e2 (python-preoutput-leftover): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 60931
diff changeset
1115 (/= (let ((inhibit-field-text-motion t))
758ff54158e2 (python-preoutput-leftover): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 60931
diff changeset
1116 (line-beginning-position))
758ff54158e2 (python-preoutput-leftover): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 60931
diff changeset
1117 (point)))
758ff54158e2 (python-preoutput-leftover): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 60931
diff changeset
1118 "")
758ff54158e2 (python-preoutput-leftover): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 60931
diff changeset
1119 ((string= s "_emacs_ok\n")
758ff54158e2 (python-preoutput-leftover): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 60931
diff changeset
1120 (when python-preoutput-continuation
758ff54158e2 (python-preoutput-leftover): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 60931
diff changeset
1121 (funcall python-preoutput-continuation)
758ff54158e2 (python-preoutput-leftover): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 60931
diff changeset
1122 (setq python-preoutput-continuation nil))
758ff54158e2 (python-preoutput-leftover): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 60931
diff changeset
1123 "")
758ff54158e2 (python-preoutput-leftover): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 60931
diff changeset
1124 ((string-match "_emacs_out \\(.*\\)\n" s)
758ff54158e2 (python-preoutput-leftover): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 60931
diff changeset
1125 (setq python-preoutput-result (match-string 1 s))
758ff54158e2 (python-preoutput-leftover): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 60931
diff changeset
1126 "")
758ff54158e2 (python-preoutput-leftover): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 60931
diff changeset
1127 ((string-match ".*\n" s)
758ff54158e2 (python-preoutput-leftover): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 60931
diff changeset
1128 s)
758ff54158e2 (python-preoutput-leftover): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 60931
diff changeset
1129 ((or (eq t (compare-strings s nil nil "_emacs_ok\n" nil (length s)))
61086
bf4917ef8f38 (python-preoutput-filter): Fix last change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 61037
diff changeset
1130 (let ((end (min (length "_emacs_out ") (length s))))
bf4917ef8f38 (python-preoutput-filter): Fix last change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 61037
diff changeset
1131 (eq t (compare-strings s nil end "_emacs_out " nil end))))
61037
758ff54158e2 (python-preoutput-leftover): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 60931
diff changeset
1132 (setq python-preoutput-leftover s)
54840
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1133 "")
61037
758ff54158e2 (python-preoutput-leftover): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 60931
diff changeset
1134 (t s)))
54840
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1135
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1136 ;;;###autoload
54840
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1137 (defun run-python (&optional cmd noshow)
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1138 "Run an inferior Python process, input and output via buffer *Python*.
54840
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1139 CMD is the Python command to run. NOSHOW non-nil means don't show the
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1140 buffer automatically.
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1141 If there is a process already running in `*Python*', switch to
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1142 that buffer. Interactively, a prefix arg allows you to edit the initial
58415
86ead4686506 (run-python): Don't hard code *Python*. Don't modify process-environment.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 58358
diff changeset
1143 command line (default is `python-command'); `-i' etc. args will be added
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1144 to this as appropriate. Runs the hook `inferior-python-mode-hook'
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1145 \(after the `comint-mode-hook' is run).
54840
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1146 \(Type \\[describe-mode] in the process buffer for a list of commands.)"
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1147 (interactive (list (if current-prefix-arg
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1148 (read-string "Run Python: " python-command)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1149 python-command)))
54840
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1150 (unless cmd (setq cmd python-python-command))
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1151 (setq python-command cmd)
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1152 ;; Fixme: Consider making `python-buffer' buffer-local as a buffer
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1153 ;; (not a name) in Python buffers from which `run-python' &c is
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1154 ;; invoked. Would support multiple processes better.
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1155 (unless (comint-check-proc python-buffer)
55511
5dbde1bf6cad (help-buffer): Autoload when compiling.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55495
diff changeset
1156 (let* ((cmdlist (append (python-args-to-list cmd) '("-i")))
5dbde1bf6cad (help-buffer): Autoload when compiling.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55495
diff changeset
1157 (path (getenv "PYTHONPATH"))
5dbde1bf6cad (help-buffer): Autoload when compiling.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55495
diff changeset
1158 (process-environment ; to import emacs.py
58415
86ead4686506 (run-python): Don't hard code *Python*. Don't modify process-environment.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 58358
diff changeset
1159 (cons (concat "PYTHONPATH=" data-directory
55511
5dbde1bf6cad (help-buffer): Autoload when compiling.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55495
diff changeset
1160 (if path (concat ":" path)))
5dbde1bf6cad (help-buffer): Autoload when compiling.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55495
diff changeset
1161 process-environment)))
54840
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1162 (set-buffer (apply 'make-comint "Python" (car cmdlist) nil
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1163 (cdr cmdlist)))
58415
86ead4686506 (run-python): Don't hard code *Python*. Don't modify process-environment.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 58358
diff changeset
1164 (setq python-buffer (buffer-name)))
54840
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1165 (inferior-python-mode)
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1166 ;; Load function defintions we need.
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1167 ;; Before the preoutput function was used, this was done via -c in
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1168 ;; cmdlist, but that loses the banner and doesn't run the startup
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1169 ;; file. The code might be inline here, but there's enough that it
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1170 ;; seems worth putting in a separate file, and it's probably cleaner
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1171 ;; to put it in a module.
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1172 (python-send-string "import emacs"))
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1173 (unless noshow (pop-to-buffer python-buffer)))
54840
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1174
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1175 ;; Fixme: We typically lose if the inferior isn't in the normal REPL,
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1176 ;; e.g. prompt is `help> '. Probably raise an error if the form of
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1177 ;; the prompt is unexpected; actually, it needs to be `>>> ', not
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1178 ;; `... ', i.e. we're not inputting a block &c. However, this may not
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1179 ;; be the place to do it, e.g. we might actually want to send commands
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1180 ;; having set up such a state.
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1181
55240
780b94f913fe (python-send-command): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55054
diff changeset
1182 (defun python-send-command (command)
780b94f913fe (python-send-command): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55054
diff changeset
1183 "Like `python-send-string' but resets `compilation-minor-mode'."
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1184 (goto-char (point-max))
55240
780b94f913fe (python-send-command): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55054
diff changeset
1185 (let ((end (marker-position (process-mark (python-proc)))))
780b94f913fe (python-send-command): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55054
diff changeset
1186 (compilation-forget-errors)
780b94f913fe (python-send-command): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55054
diff changeset
1187 (python-send-string command)
780b94f913fe (python-send-command): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55054
diff changeset
1188 (set-marker compilation-parsing-end end)
780b94f913fe (python-send-command): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55054
diff changeset
1189 (setq compilation-last-buffer (current-buffer))))
780b94f913fe (python-send-command): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55054
diff changeset
1190
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1191 (defun python-send-region (start end)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1192 "Send the region to the inferior Python process."
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1193 ;; The region is evaluated from a temporary file. This avoids
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1194 ;; problems with blank lines, which have different semantics
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1195 ;; interactively and in files. It also saves the inferior process
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1196 ;; buffer filling up with interpreter prompts. We need a Python
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1197 ;; function to remove the temporary file when it has been evaluated
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1198 ;; (though we could probably do it in Lisp with a Comint output
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1199 ;; filter). This function also catches exceptions and truncates
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1200 ;; tracebacks not to mention the frame of the function itself.
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1201 ;;
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1202 ;; The compilation-minor-mode parsing takes care of relating the
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1203 ;; reference to the temporary file to the source.
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1204 ;;
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1205 ;; Fixme: Write a `coding' header to the temp file if the region is
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1206 ;; non-ASCII.
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1207 (interactive "r")
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1208 (let* ((f (make-temp-file "py"))
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1209 (command (format "emacs.eexecfile(%S)" f))
54888
89ed55db7532 (python-orig-start-line, python-orig-file): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54886
diff changeset
1210 (orig-start (copy-marker start)))
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1211 (when (save-excursion
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1212 (goto-char start)
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1213 (/= 0 (current-indentation))) ; need dummy block
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1214 (save-excursion
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1215 (goto-char orig-start)
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1216 ;; Wrong if we had indented code at buffer start.
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1217 (set-marker orig-start (line-beginning-position 0)))
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1218 (write-region "if True:\n" nil f nil 'nomsg))
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1219 (write-region start end f t 'nomsg)
58415
86ead4686506 (run-python): Don't hard code *Python*. Don't modify process-environment.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 58358
diff changeset
1220 (with-current-buffer (process-buffer (python-proc)) ;Runs python if needed.
86ead4686506 (run-python): Don't hard code *Python*. Don't modify process-environment.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 58358
diff changeset
1221 (python-send-command command)
86ead4686506 (run-python): Don't hard code *Python*. Don't modify process-environment.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 58358
diff changeset
1222 ;; Tell compile.el to redirect error locations in file `f' to
86ead4686506 (run-python): Don't hard code *Python*. Don't modify process-environment.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 58358
diff changeset
1223 ;; positions past marker `orig-start'. It has to be done *after*
86ead4686506 (run-python): Don't hard code *Python*. Don't modify process-environment.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 58358
diff changeset
1224 ;; python-send-command's call to compilation-forget-errors.
86ead4686506 (run-python): Don't hard code *Python*. Don't modify process-environment.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 58358
diff changeset
1225 (compilation-fake-loc orig-start f))))
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1226
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1227 (defun python-send-string (string)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1228 "Evaluate STRING in inferior Python process."
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1229 (interactive "sPython command: ")
54840
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1230 (comint-send-string (python-proc) string)
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1231 (comint-send-string (python-proc) "\n\n"))
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1232
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1233 (defun python-send-buffer ()
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1234 "Send the current buffer to the inferior Python process."
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1235 (interactive)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1236 (python-send-region (point-min) (point-max)))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1237
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1238 ;; Fixme: Try to define the function or class within the relevant
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1239 ;; module, not just at top level.
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1240 (defun python-send-defun ()
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1241 "Send the current defun (class or method) to the inferior Python process."
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1242 (interactive)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1243 (save-excursion (python-send-region (progn (beginning-of-defun) (point))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1244 (progn (end-of-defun) (point)))))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1245
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1246 (defun python-switch-to-python (eob-p)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1247 "Switch to the Python process buffer.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1248 With prefix arg, position cursor at end of buffer."
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1249 (interactive "P")
58415
86ead4686506 (run-python): Don't hard code *Python*. Don't modify process-environment.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 58358
diff changeset
1250 (pop-to-buffer (process-buffer (python-proc))) ;Runs python if needed.
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1251 (when eob-p
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1252 (push-mark)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1253 (goto-char (point-max))))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1254
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1255 (defun python-send-region-and-go (start end)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1256 "Send the region to the inferior Python process.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1257 Then switch to the process buffer."
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1258 (interactive "r")
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1259 (python-send-region start end)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1260 (python-switch-to-python t))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1261
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1262 (defcustom python-source-modes '(python-mode jython-mode)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1263 "*Used to determine if a buffer contains Python source code.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1264 If it's loaded into a buffer that is in one of these major modes, it's
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1265 considered a Python source file by `python-load-file'.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1266 Used by these commands to determine defaults."
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1267 :type '(repeat function)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1268 :group 'python)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1269
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1270 (defvar python-prev-dir/file nil
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1271 "Caches (directory . file) pair used in the last `python-load-file' command.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1272 Used for determining the default in the next one.")
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1273
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1274 (defun python-load-file (file-name)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1275 "Load a Python file FILE-NAME into the inferior Python process.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1276 If the file has extension `.py' import or reload it as a module.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1277 Treating it as a module keeps the global namespace clean, provides
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1278 function location information for debugging, and supports users of
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1279 module-qualified names."
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1280 (interactive (comint-get-source "Load Python file: " python-prev-dir/file
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1281 python-source-modes
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1282 t)) ; because execfile needs exact name
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1283 (comint-check-source file-name) ; Check to see if buffer needs saving.
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1284 (setq python-prev-dir/file (cons (file-name-directory file-name)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1285 (file-name-nondirectory file-name)))
58415
86ead4686506 (run-python): Don't hard code *Python*. Don't modify process-environment.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 58358
diff changeset
1286 (with-current-buffer (process-buffer (python-proc)) ;Runs python if needed.
86ead4686506 (run-python): Don't hard code *Python*. Don't modify process-environment.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 58358
diff changeset
1287 ;; Fixme: I'm not convinced by this logic from python-mode.el.
86ead4686506 (run-python): Don't hard code *Python*. Don't modify process-environment.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 58358
diff changeset
1288 (python-send-command
86ead4686506 (run-python): Don't hard code *Python*. Don't modify process-environment.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 58358
diff changeset
1289 (if (string-match "\\.py\\'" file-name)
86ead4686506 (run-python): Don't hard code *Python*. Don't modify process-environment.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 58358
diff changeset
1290 (let ((module (file-name-sans-extension
86ead4686506 (run-python): Don't hard code *Python*. Don't modify process-environment.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 58358
diff changeset
1291 (file-name-nondirectory file-name))))
86ead4686506 (run-python): Don't hard code *Python*. Don't modify process-environment.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 58358
diff changeset
1292 (format "emacs.eimport(%S,%S)"
86ead4686506 (run-python): Don't hard code *Python*. Don't modify process-environment.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 58358
diff changeset
1293 module (file-name-directory file-name)))
86ead4686506 (run-python): Don't hard code *Python*. Don't modify process-environment.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 58358
diff changeset
1294 (format "execfile(%S)" file-name)))
86ead4686506 (run-python): Don't hard code *Python*. Don't modify process-environment.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 58358
diff changeset
1295 (message "%s loaded" file-name)))
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1296
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1297 ;; Fixme: If we need to start the process, wait until we've got the OK
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1298 ;; from the startup.
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1299 (defun python-proc ()
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1300 "Return the current Python process.
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1301 See variable `python-buffer'. Starts a new process if necessary."
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1302 (or (if python-buffer
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1303 (get-buffer-process (if (eq major-mode 'inferior-python-mode)
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1304 (current-buffer)
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1305 python-buffer)))
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1306 (progn (run-python nil t)
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1307 (python-proc))))
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1308
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1309 ;;;; Context-sensitive help.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1310
54840
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1311 (defconst python-dotty-syntax-table
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1312 (let ((table (make-syntax-table)))
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1313 (set-char-table-parent table python-mode-syntax-table)
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1314 (modify-syntax-entry ?. "_" table)
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1315 table)
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1316 "Syntax table giving `.' symbol syntax.
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1317 Otherwise inherits from `python-mode-syntax-table'.")
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1318
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1319 (defvar view-return-to-alist)
55511
5dbde1bf6cad (help-buffer): Autoload when compiling.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55495
diff changeset
1320 (eval-when-compile (autoload 'help-buffer "help-fns"))
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1321
54840
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1322 ;; Fixme: Should this actually be used instead of info-look, i.e. be
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1323 ;; bound to C-h S? Can we use other pydoc stuff before python 2.2?
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1324 (defun python-describe-symbol (symbol)
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1325 "Get help on SYMBOL using `help'.
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1326 Interactively, prompt for symbol.
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1327
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1328 Symbol may be anything recognized by the interpreter's `help' command --
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1329 e.g. `CALLS' -- not just variables in scope.
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1330 This only works for Python version 2.2 or newer since earlier interpreters
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1331 don't support `help'."
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1332 ;; Note that we do this in the inferior process, not a separate one, to
54840
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1333 ;; ensure the environment is appropriate.
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1334 (interactive
54840
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1335 (let ((symbol (with-syntax-table python-dotty-syntax-table
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1336 (current-word)))
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1337 (enable-recursive-minibuffers t))
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1338 (list (read-string (if symbol
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1339 (format "Describe symbol (default %s): " symbol)
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1340 "Describe symbol: ")
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1341 nil nil symbol))))
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1342 (if (equal symbol "") (error "No symbol"))
54840
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1343 (let* ((func `(lambda ()
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1344 (comint-redirect-send-command (format "emacs.ehelp(%S)\n"
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1345 ,symbol)
54840
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1346 "*Help*" nil))))
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1347 ;; Ensure we have a suitable help buffer.
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1348 ;; Fixme: Maybe process `Related help topics' a la help xrefs and
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1349 ;; allow C-c C-f in help buffer.
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1350 (let ((temp-buffer-show-hook ; avoid xref stuff
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1351 (lambda ()
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1352 (toggle-read-only 1)
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1353 (setq view-return-to-alist
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1354 (list (cons (selected-window) help-return-method))))))
55447
f1b7359315f0 (python-describe-symbol): Pass INTERACTIVE-P argument to `help-setup-xref'.
Juanma Barranquero <lekktu@gmail.com>
parents: 55397
diff changeset
1355 (help-setup-xref (list 'python-describe-symbol symbol) (interactive-p))
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1356 (with-output-to-temp-buffer (help-buffer)
54840
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1357 (with-current-buffer standard-output
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1358 (set (make-local-variable 'comint-redirect-subvert-readonly) t)
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1359 (print-help-return-message))))
54840
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1360 (if (and python-buffer (get-buffer python-buffer))
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1361 (with-current-buffer python-buffer
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1362 (funcall func))
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1363 (setq python-preoutput-continuation func)
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1364 (run-python nil t))))
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1365
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1366 (add-to-list 'debug-ignored-errors "^No symbol")
54840
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1367
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1368 (defun python-send-receive (string)
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1369 "Send STRING to inferior Python (if any) and return result.
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1370 The result is what follows `_emacs_out' in the output (or nil)."
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1371 (let ((proc (python-proc)))
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1372 (python-send-string string)
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1373 (setq python-preoutput-result nil)
61037
758ff54158e2 (python-preoutput-leftover): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 60931
diff changeset
1374 (while (progn
758ff54158e2 (python-preoutput-leftover): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 60931
diff changeset
1375 (accept-process-output proc 5)
758ff54158e2 (python-preoutput-leftover): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 60931
diff changeset
1376 python-preoutput-leftover))
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1377 python-preoutput-result))
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1378
54840
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1379 ;; Fixme: try to make it work with point in the arglist. Also, is
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1380 ;; there anything reasonable we can do with random methods?
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1381 ;; (Currently only works with functions.)
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1382 (defun python-eldoc-function ()
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1383 "`eldoc-print-current-symbol-info' for Python.
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1384 Only works when point is in a function name, not its arglist, for instance.
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1385 Assumes an inferior Python is running."
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1386 (let ((symbol (with-syntax-table python-dotty-syntax-table
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1387 (current-word))))
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1388 (when symbol
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1389 (python-send-receive (format "emacs.eargs(%S)" symbol)))))
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1390
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1391 ;;;; Info-look functionality.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1392
54840
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1393 (defun python-after-info-look ()
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1394 "Set up info-look for Python.
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1395 Used with `eval-after-load'."
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1396 (let* ((version (let ((s (shell-command-to-string (concat python-command
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1397 " -V"))))
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1398 (string-match "^Python \\([0-9]+\\.[0-9]+\\>\\)" s)
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1399 (match-string 1 s)))
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1400 ;; Whether info files have a Python version suffix, e.g. in Debian.
55447
f1b7359315f0 (python-describe-symbol): Pass INTERACTIVE-P argument to `help-setup-xref'.
Juanma Barranquero <lekktu@gmail.com>
parents: 55397
diff changeset
1401 (versioned
54840
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1402 (with-temp-buffer
54938
109b2bf180dd (python-after-info-look): Use with-no-warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54888
diff changeset
1403 (with-no-warnings (Info-mode))
54840
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1404 (condition-case ()
54888
89ed55db7532 (python-orig-start-line, python-orig-file): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54886
diff changeset
1405 ;; Don't use `info' because it would pop-up a *info* buffer.
54938
109b2bf180dd (python-after-info-look): Use with-no-warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54888
diff changeset
1406 (with-no-warnings
109b2bf180dd (python-after-info-look): Use with-no-warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54888
diff changeset
1407 (Info-goto-node (format "(python%s-lib)Miscellaneous Index"
55511
5dbde1bf6cad (help-buffer): Autoload when compiling.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55495
diff changeset
1408 version))
5dbde1bf6cad (help-buffer): Autoload when compiling.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55495
diff changeset
1409 t)
54840
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1410 (error nil)))))
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1411 (info-lookup-maybe-add-help
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1412 :mode 'python-mode
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1413 :regexp "[[:alnum:]_]+"
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1414 :doc-spec
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1415 ;; Fixme: Can this reasonably be made specific to indices with
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1416 ;; different rules? Is the order of indices optimal?
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1417 ;; (Miscellaneous in -ref first prefers lookup of keywords, for
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1418 ;; instance.)
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1419 (if versioned
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1420 ;; The empty prefix just gets us highlighted terms.
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1421 `((,(concat "(python" version "-ref)Miscellaneous Index") nil "")
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1422 (,(concat "(python" version "-ref)Module Index" nil ""))
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1423 (,(concat "(python" version "-ref)Function-Method-Variable Index"
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1424 nil ""))
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1425 (,(concat "(python" version "-ref)Class-Exception-Object Index"
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1426 nil ""))
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1427 (,(concat "(python" version "-lib)Module Index" nil ""))
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1428 (,(concat "(python" version "-lib)Class-Exception-Object Index"
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1429 nil ""))
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1430 (,(concat "(python" version "-lib)Function-Method-Variable Index"
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1431 nil ""))
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1432 (,(concat "(python" version "-lib)Miscellaneous Index" nil "")))
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1433 '(("(python-ref)Miscellaneous Index" nil "")
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1434 ("(python-ref)Module Index" nil "")
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1435 ("(python-ref)Function-Method-Variable Index" nil "")
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1436 ("(python-ref)Class-Exception-Object Index" nil "")
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1437 ("(python-lib)Module Index" nil "")
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1438 ("(python-lib)Class-Exception-Object Index" nil "")
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1439 ("(python-lib)Function-Method-Variable Index" nil "")
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1440 ("(python-lib)Miscellaneous Index" nil ""))))))
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1441 (eval-after-load "info-look" '(python-after-info-look))
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1442
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1443 ;;;; Miscellancy.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1444
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1445 (defcustom python-jython-packages '("java" "javax" "org" "com")
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1446 "Packages implying `jython-mode'.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1447 If these are imported near the beginning of the buffer, `python-mode'
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1448 actually punts to `jython-mode'."
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1449 :type '(repeat string)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1450 :group 'python)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1451
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1452 ;; Called from `python-mode', this causes a recursive call of the
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1453 ;; mode. See logic there to break out of the recursion.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1454 (defun python-maybe-jython ()
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1455 "Invoke `jython-mode' if the buffer appears to contain Jython code.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1456 The criterion is either a match for `jython-mode' via
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1457 `interpreter-mode-alist' or an import of a module from the list
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1458 `python-jython-packages'."
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1459 ;; The logic is taken from python-mode.el.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1460 (save-excursion
54840
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1461 (save-restriction
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1462 (widen)
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1463 (goto-char (point-min))
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1464 (let ((interpreter (if (looking-at auto-mode-interpreter-regexp)
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1465 (match-string 2))))
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1466 (if (and interpreter (eq 'jython-mode
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1467 (cdr (assoc (file-name-nondirectory
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1468 interpreter)
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1469 interpreter-mode-alist))))
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1470 (jython-mode)
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1471 (if (catch 'done
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1472 (while (re-search-forward
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1473 (rx (and line-start (or "import" "from") (1+ space)
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1474 (group (1+ (not (any " \t\n."))))))
55054
ee7e5daa7ffd (python-maybe-jython): Don't assume point-min==1.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54943
diff changeset
1475 (+ (point-min) 10000) ; Probably not worth customizing.
54840
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1476 t)
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1477 (if (member (match-string 1) python-jython-packages)
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1478 (throw 'done t))))
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1479 (jython-mode)))))))
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1480
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1481 (defun python-fill-paragraph (&optional justify)
54840
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1482 "`fill-paragraph-function' handling comments and multi-line strings.
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1483 If any of the current line is a comment, fill the comment or the
54840
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1484 paragraph of it that point is in, preserving the comment's
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1485 indentation and initial comment characters. Similarly if the end
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1486 of the current line is in or at the end of a multi-line string.
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1487 Otherwise, do nothing."
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1488 (interactive "P")
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1489 (or (fill-comment-paragraph justify)
54840
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1490 ;; The `paragraph-start' and `paragraph-separate' variables
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1491 ;; don't allow us to delimit the last paragraph in a multi-line
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1492 ;; string properly, so narrow to the string and then fill around
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1493 ;; (the end of) the current line.
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1494 (save-excursion
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1495 (end-of-line)
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1496 (let* ((syntax (syntax-ppss))
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1497 (orig (point))
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1498 (start (nth 8 syntax))
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1499 end)
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1500 (cond ((eq t (nth 3 syntax)) ; in fenced string
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1501 (goto-char (nth 8 syntax)) ; string start
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1502 (condition-case () ; for unbalanced quotes
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1503 (progn (forward-sexp)
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1504 (setq end (point)))
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1505 (error (setq end (point-max)))))
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1506 ((re-search-backward "\\s|\\s-*\\=" nil t) ; end of fenced
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1507 ; string
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1508 (forward-char)
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1509 (setq end (point))
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1510 (condition-case ()
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1511 (progn (backward-sexp)
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1512 (setq start (point)))
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1513 (error nil))))
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1514 (when end
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1515 (save-restriction
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1516 (narrow-to-region start end)
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1517 (goto-char orig)
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1518 (fill-paragraph justify))))))
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1519 t)
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1520
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1521 (defun python-shift-left (start end &optional count)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1522 "Shift lines in region COUNT (the prefix arg) columns to the left.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1523 COUNT defaults to `python-indent'. If region isn't active, just shift
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1524 current line. The region shifted includes the lines in which START and
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1525 END lie. It is an error if any lines in the region are indented less than
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1526 COUNT columns."
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1527 (interactive (if mark-active
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1528 (list (region-beginning) (region-end) current-prefix-arg)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1529 (list (point) (point) current-prefix-arg)))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1530 (if count
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1531 (setq count (prefix-numeric-value count))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1532 (setq count python-indent))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1533 (when (> count 0)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1534 (save-excursion
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1535 (goto-char start)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1536 (while (< (point) end)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1537 (if (and (< (current-indentation) count)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1538 (not (looking-at "[ \t]*$")))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1539 (error "Can't shift all lines enough"))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1540 (forward-line))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1541 (indent-rigidly start end (- count)))))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1542
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1543 (add-to-list 'debug-ignored-errors "^Can't shift all lines enough")
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1544
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1545 (defun python-shift-right (start end &optional count)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1546 "Shift lines in region COUNT (the prefix arg) columns to the right.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1547 COUNT defaults to `python-indent'. If region isn't active, just shift
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1548 current line. The region shifted includes the lines in which START and
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1549 END lie."
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1550 (interactive (if mark-active
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1551 (list (region-beginning) (region-end) current-prefix-arg)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1552 (list (point) (point) current-prefix-arg)))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1553 (if count
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1554 (setq count (prefix-numeric-value count))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1555 (setq count python-indent))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1556 (indent-rigidly start end count))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1557
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1558 (defun python-outline-level ()
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1559 "`outline-level' function for Python mode.
54840
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1560 The level is the number of `python-indent' steps of indentation
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1561 of current line."
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1562 (/ (current-indentation) python-indent))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1563
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1564 ;; Fixme: Consider top-level assignments, imports, &c.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1565 (defun python-current-defun ()
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1566 "`add-log-current-defun-function' for Python."
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1567 (save-excursion
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1568 ;; Move up the tree of nested `class' and `def' blocks until we
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1569 ;; get to zero indentation, accumulating the defined names.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1570 (let ((start t)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1571 accum)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1572 (while (or start (> (current-indentation) 0))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1573 (setq start nil)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1574 (python-beginning-of-block)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1575 (end-of-line)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1576 (beginning-of-defun)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1577 (if (looking-at (rx (and (0+ space) (or "def" "class") (1+ space)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1578 (group (1+ (or word (syntax symbol))))
60931
494d942e49fe (python-close-block-statement-p)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 59996
diff changeset
1579 ;; Greediness makes this unnecessary? --Stef
494d942e49fe (python-close-block-statement-p)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 59996
diff changeset
1580 symbol-end)))
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1581 (push (match-string 1) accum)))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1582 (if accum (mapconcat 'identity accum ".")))))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1583
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1584 (defun python-mark-block ()
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1585 "Mark the block around point.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1586 Uses `python-beginning-of-block', `python-end-of-block'."
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1587 (interactive)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1588 (push-mark)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1589 (python-beginning-of-block)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1590 (push-mark (point) nil t)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1591 (python-end-of-block)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1592 (exchange-point-and-mark))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1593
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1594 ;;;; Completion.
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1595
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1596 (defun python-symbol-completions (symbol)
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1597 "Return a list of completions of the string SYMBOL from Python process.
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1598 The list is sorted."
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1599 (when symbol
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1600 (let ((completions
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1601 (condition-case ()
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1602 (car (read-from-string (python-send-receive
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1603 (format "emacs.complete(%S)" symbol))))
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1604 (error nil))))
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1605 (sort
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1606 ;; We can get duplicates from the above -- don't know why.
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1607 (delete-dups completions)
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1608 #'string<))))
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1609
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1610 (defun python-partial-symbol ()
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1611 "Return the partial symbol before point (for completion)."
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1612 (let ((end (point))
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1613 (start (save-excursion
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1614 (and (re-search-backward
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1615 (rx (and (or buffer-start (regexp "[^[:alnum:]._]"))
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1616 (group (1+ (regexp "[[:alnum:]._]")))
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1617 point))
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1618 nil t)
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1619 (match-beginning 1)))))
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1620 (if start (buffer-substring-no-properties start end))))
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1621
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1622 ;; Fixme: We should have an abstraction of this sort of thing in the
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1623 ;; core.
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1624 (defun python-complete-symbol ()
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1625 "Perform completion on the Python symbol preceding point.
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1626 Repeating the command scrolls the completion window."
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1627 (interactive)
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1628 (let ((window (get-buffer-window "*Completions*")))
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1629 (if (and (eq last-command this-command)
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1630 window (window-live-p window) (window-buffer window)
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1631 (buffer-name (window-buffer window)))
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1632 (with-current-buffer (window-buffer window)
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1633 (if (pos-visible-in-window-p (point-max) window)
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1634 (set-window-start window (point-min))
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1635 (save-selected-window
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1636 (select-window window)
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1637 (scroll-up))))
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1638 ;; Do completion.
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1639 (let* ((end (point))
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1640 (symbol (python-partial-symbol))
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1641 (completions (python-symbol-completions symbol))
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1642 (completion (if completions
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1643 (try-completion symbol completions))))
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1644 (when symbol
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1645 (cond ((eq completion t))
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1646 ((null completion)
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1647 (message "Can't find completion for \"%s\"" symbol)
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1648 (ding))
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1649 ((not (string= symbol completion))
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1650 (delete-region (- end (length symbol)) end)
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1651 (insert completion))
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1652 (t
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1653 (message "Making completion list...")
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1654 (with-output-to-temp-buffer "*Completions*"
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1655 (display-completion-list completions))
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1656 (message "Making completion list...%s" "done"))))))))
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1657
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1658 (eval-when-compile (require 'hippie-exp))
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1659
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1660 (defun python-try-complete (old)
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1661 "Completion function for Python for use with `hippie-expand'."
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1662 (when (eq major-mode 'python-mode) ; though we only add it locally
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1663 (unless old
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1664 (let ((symbol (python-partial-symbol)))
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1665 (he-init-string (- (point) (length symbol)) (point))
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1666 (if (not (he-string-member he-search-string he-tried-table))
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1667 (push he-search-string he-tried-table))
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1668 (setq he-expand-list
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1669 (and symbol (python-symbol-completions symbol)))))
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1670 (while (and he-expand-list
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1671 (he-string-member (car he-expand-list) he-tried-table))
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1672 (pop he-expand-list))
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1673 (if he-expand-list
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1674 (progn
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1675 (he-substitute-string (pop he-expand-list))
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1676 t)
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1677 (if old (he-reset-string))
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1678 nil)))
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1679
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1680 ;;;; Modes.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1681
54840
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1682 (defvar outline-heading-end-regexp)
61857
7b4e7e55f61b (python-mode): Use new name eldoc-documentation-function.
Richard M. Stallman <rms@gnu.org>
parents: 61086
diff changeset
1683 (defvar eldoc-documentation-function)
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1684
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1685 ;;;###autoload
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1686 (define-derived-mode python-mode fundamental-mode "Python"
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1687 "Major mode for editing Python files.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1688 Turns on Font Lock mode unconditionally since it is required for correct
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1689 parsing of the source.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1690 See also `jython-mode', which is actually invoked if the buffer appears to
54840
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1691 contain Jython code. See also `run-python' and associated Python mode
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1692 commands for running Python under Emacs.
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1693
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1694 The Emacs commands which work with `defun's, e.g. \\[beginning-of-defun], deal
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1695 with nested `def' and `class' blocks. They take the innermost one as
54840
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1696 current without distinguishing method and class definitions. Used multiple
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1697 times, they move over others at the same indentation level until they reach
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1698 the end of definitions at that level, when they move up a level.
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1699 \\<python-mode-map>
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1700 Colon is electric: it outdents the line if appropriate, e.g. for
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1701 an else statement. \\[python-backspace] at the beginning of an indented statement
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1702 deletes a level of indentation to close the current block; otherwise it
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1703 deletes a charcter backward. TAB indents the current line relative to
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1704 the preceding code. Successive TABs, with no intervening command, cycle
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1705 through the possibilities for indentation on the basis of enclosing blocks.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1706
54840
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1707 \\[fill-paragraph] fills comments and multiline strings appropriately, but has no
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1708 effect outside them.
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1709
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1710 Supports Eldoc mode (only for functions, using a Python process),
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1711 Info-Look and Imenu. In Outline minor mode, `class' and `def'
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1712 lines count as headers.
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1713
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1714 \\{python-mode-map}"
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1715 :group 'python
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1716 (set (make-local-variable 'font-lock-defaults)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1717 '(python-font-lock-keywords nil nil ((?_ . "w")) nil
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1718 (font-lock-syntactic-keywords
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1719 . python-font-lock-syntactic-keywords)
60931
494d942e49fe (python-close-block-statement-p)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 59996
diff changeset
1720 ;; This probably isn't worth it.
494d942e49fe (python-close-block-statement-p)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 59996
diff changeset
1721 ;; (font-lock-syntactic-face-function
494d942e49fe (python-close-block-statement-p)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 59996
diff changeset
1722 ;; . python-font-lock-syntactic-face-function)
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1723 ))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1724 (set (make-local-variable 'parse-sexp-lookup-properties) t)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1725 (set (make-local-variable 'comment-start) "# ")
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1726 (set (make-local-variable 'comment-indent-function) #'python-comment-indent)
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1727 (set (make-local-variable 'indent-line-function) #'python-indent-line)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1728 (set (make-local-variable 'paragraph-start) "\\s-*$")
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1729 (set (make-local-variable 'fill-paragraph-function) 'python-fill-paragraph)
59250
54d81a8baaa6 (python-mode): Use mode-require-final-newline.
Richard M. Stallman <rms@gnu.org>
parents: 58739
diff changeset
1730 (set (make-local-variable 'require-final-newline) mode-require-final-newline)
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1731 (set (make-local-variable 'add-log-current-defun-function)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1732 #'python-current-defun)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1733 ;; Fixme: Generalize to do all blocks?
54840
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1734 (set (make-local-variable 'outline-regexp) "\\s-*\\(def\\|class\\)\\>")
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1735 (set (make-local-variable 'outline-heading-end-regexp) ":\\s-*\n")
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1736 (set (make-local-variable 'outline-level) #'python-outline-level)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1737 (set (make-local-variable 'open-paren-in-column-0-is-defun-start) nil)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1738 (make-local-variable 'python-saved-check-command)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1739 (set (make-local-variable 'beginning-of-defun-function)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1740 'python-beginning-of-defun)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1741 (set (make-local-variable 'end-of-defun-function) 'python-end-of-defun)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1742 (setq imenu-create-index-function #'python-imenu-create-index)
61857
7b4e7e55f61b (python-mode): Use new name eldoc-documentation-function.
Richard M. Stallman <rms@gnu.org>
parents: 61086
diff changeset
1743 (set (make-local-variable 'eldoc-documentation-function)
54840
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1744 #'python-eldoc-function)
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1745 (add-hook 'eldoc-mode-hook
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1746 '(lambda () (run-python 0 t)) nil t) ; need it running
55397
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1747 (if (featurep 'hippie-exp)
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1748 (set (make-local-variable 'hippie-expand-try-functions-list)
a828ab1b3079 Changes largely merged in from Dave Love's code. Doc fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55300
diff changeset
1749 (cons 'python-try-complete hippie-expand-try-functions-list)))
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1750 (unless font-lock-mode (font-lock-mode 1))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1751 (when python-guess-indent (python-guess-indent))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1752 (set (make-local-variable 'python-command) python-python-command)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1753 (unless (boundp 'python-mode-running) ; kill the recursion from jython-mode
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1754 (let ((python-mode-running t))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1755 (python-maybe-jython))))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1756
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1757 (custom-add-option 'python-mode-hook 'imenu-add-menubar-index)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1758 (custom-add-option 'python-mode-hook
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1759 '(lambda ()
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1760 "Turn on Indent Tabs mode."
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1761 (set (make-local-variable 'indent-tabs-mode) t)))
54840
3768540a819c Doc fixes. Changes for compiler warnings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54838
diff changeset
1762 (custom-add-option 'python-mode-hook 'turn-on-eldoc-mode)
54789
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1763
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1764 ;;;###autoload
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1765 (define-derived-mode jython-mode python-mode "Jython"
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1766 "Major mode for editing Jython files.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1767 Like `python-mode', but sets up parameters for Jython subprocesses.
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1768 Runs `jython-mode-hook' after `python-mode-hook'."
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1769 :group 'python
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1770 (set (make-local-variable 'python-command) python-jython-command))
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1771
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1772 (provide 'python)
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1773 ;; arch-tag: 6fce1d99-a704-4de9-ba19-c6e4912b0554
9d1d7f062a4f New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1774 ;;; python.el ends here