annotate Misc/python-mode.el @ 58765:2ba7677bfa95 legacy-trunk

testCopysign was defined twice in test_math; combine the definitions
author Mark Dickinson <dickinsm@gmail.com>
date Sat, 06 Feb 2010 23:11:25 +0000
parents 5bda4f76ad92
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
1 ;;; python-mode.el --- Major mode for editing Python programs
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3 ;; Copyright (C) 1992,1993,1994 Tim Peters
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
4
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
5 ;; Author: 2003-2007 http://sf.net/projects/python-mode
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
6 ;; 1995-2002 Barry A. Warsaw
2799
4a998b1a331f #changed all email address to go through python.org
Barry Warsaw <barry@python.org>
parents: 2798
diff changeset
7 ;; 1992-1994 Tim Peters
6555
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
8 ;; Maintainer: python-mode@python.org
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
9 ;; Created: Feb 1992
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
10 ;; Keywords: python languages oop
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
11
18415
d8414f51d4f5 (py-version): Hopefully fixed my XEmacs settings so this doesn't get
Barry Warsaw <barry@python.org>
parents: 18412
diff changeset
12 (defconst py-version "$Revision$"
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
13 "`python-mode' version number.")
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
14
2524
6001448fab89 #updated copywrite notice by removing the GPL language according to
Barry Warsaw <barry@python.org>
parents: 2513
diff changeset
15 ;; This software is provided as-is, without express or implied
6001448fab89 #updated copywrite notice by removing the GPL language according to
Barry Warsaw <barry@python.org>
parents: 2513
diff changeset
16 ;; warranty. Permission to use, copy, modify, distribute or sell this
6001448fab89 #updated copywrite notice by removing the GPL language according to
Barry Warsaw <barry@python.org>
parents: 2513
diff changeset
17 ;; software, without fee, for any purpose and by any individual or
6001448fab89 #updated copywrite notice by removing the GPL language according to
Barry Warsaw <barry@python.org>
parents: 2513
diff changeset
18 ;; organization, is hereby granted, provided that the above copyright
6001448fab89 #updated copywrite notice by removing the GPL language according to
Barry Warsaw <barry@python.org>
parents: 2513
diff changeset
19 ;; notice and this paragraph appear in all copies.
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
20
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
21 ;;; Commentary:
3925
4bcee63d5bb1 (python-mode): automatically install imenu stuff.
Barry Warsaw <barry@python.org>
parents: 3924
diff changeset
22
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
23 ;; This is a major mode for editing Python programs. It was developed by Tim
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
24 ;; Peters after an original idea by Michael A. Guravage. Tim subsequently
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
25 ;; left the net and in 1995, Barry Warsaw inherited the mode. Tim's now back
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
26 ;; but disavows all responsibility for the mode. In fact, we suspect he
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
27 ;; doesn't even use Emacs any more. In 2003, python-mode.el was moved to its
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
28 ;; own SourceForge project apart from the Python project, and now is
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
29 ;; maintained by the volunteers at the python-mode@python.org mailing list.
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
30
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
31 ;; pdbtrack support contributed by Ken Manheimer, April 2001. Skip Montanaro
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
32 ;; has also contributed significantly to python-mode's development.
17416
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
33
23222
ab4fa78afddf (py-execute-region): If you ran this without having visited a
Barry Warsaw <barry@python.org>
parents: 22524
diff changeset
34 ;; Please use the SourceForge Python project to submit bugs or
ab4fa78afddf (py-execute-region): If you ran this without having visited a
Barry Warsaw <barry@python.org>
parents: 22524
diff changeset
35 ;; patches:
17416
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
36 ;;
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
37 ;; http://sourceforge.net/projects/python
6836
0255b5ecde10 Update to the Big Comment at the top of the file. It should better
Barry Warsaw <barry@python.org>
parents: 6767
diff changeset
38
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
39 ;; INSTALLATION:
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
40
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
41 ;; To install, just drop this file into a directory on your load-path and
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
42 ;; byte-compile it. To set up Emacs to automatically edit files ending in
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
43 ;; ".py" using python-mode add the following to your ~/.emacs file (GNU
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
44 ;; Emacs) or ~/.xemacs/init.el file (XEmacs):
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
45 ;; (setq auto-mode-alist (cons '("\\.py$" . python-mode) auto-mode-alist))
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
46 ;; (setq interpreter-mode-alist (cons '("python" . python-mode)
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
47 ;; interpreter-mode-alist))
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
48 ;; (autoload 'python-mode "python-mode" "Python editing mode." t)
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
49 ;;
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
50 ;; In XEmacs syntax highlighting should be enabled automatically. In GNU
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
51 ;; Emacs you may have to add these lines to your ~/.emacs file:
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
52 ;; (global-font-lock-mode t)
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
53 ;; (setq font-lock-maximum-decoration t)
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
54
6836
0255b5ecde10 Update to the Big Comment at the top of the file. It should better
Barry Warsaw <barry@python.org>
parents: 6767
diff changeset
55 ;; FOR MORE INFORMATION:
0255b5ecde10 Update to the Big Comment at the top of the file. It should better
Barry Warsaw <barry@python.org>
parents: 6767
diff changeset
56
17416
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
57 ;; There is some information on python-mode.el at
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
58
9028
65139719b656 Update commentary. For most stuff, point people to the web page
Barry Warsaw <barry@python.org>
parents: 9027
diff changeset
59 ;; http://www.python.org/emacs/python-mode/
65139719b656 Update commentary. For most stuff, point people to the web page
Barry Warsaw <barry@python.org>
parents: 9027
diff changeset
60 ;;
23222
ab4fa78afddf (py-execute-region): If you ran this without having visited a
Barry Warsaw <barry@python.org>
parents: 22524
diff changeset
61 ;; It does contain links to other packages that you might find useful,
ab4fa78afddf (py-execute-region): If you ran this without having visited a
Barry Warsaw <barry@python.org>
parents: 22524
diff changeset
62 ;; such as pdb interfaces, OO-Browser links, etc.
6836
0255b5ecde10 Update to the Big Comment at the top of the file. It should better
Barry Warsaw <barry@python.org>
parents: 6767
diff changeset
63
0255b5ecde10 Update to the Big Comment at the top of the file. It should better
Barry Warsaw <barry@python.org>
parents: 6767
diff changeset
64 ;; BUG REPORTING:
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
65
17416
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
66 ;; As mentioned above, please use the SourceForge Python project for
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
67 ;; submitting bug reports or patches. The old recommendation, to use
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
68 ;; C-c C-b will still work, but those reports have a higher chance of
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
69 ;; getting buried in my mailbox. Please include a complete, but
6544
d28932d676c8 Changes in preparation for integrating into the Python CVS tree.
Barry Warsaw <barry@python.org>
parents: 6232
diff changeset
70 ;; concise code sample and a recipe for reproducing the bug. Send
d28932d676c8 Changes in preparation for integrating into the Python CVS tree.
Barry Warsaw <barry@python.org>
parents: 6232
diff changeset
71 ;; suggestions and other comments to python-mode@python.org.
d28932d676c8 Changes in preparation for integrating into the Python CVS tree.
Barry Warsaw <barry@python.org>
parents: 6232
diff changeset
72
d28932d676c8 Changes in preparation for integrating into the Python CVS tree.
Barry Warsaw <barry@python.org>
parents: 6232
diff changeset
73 ;; When in a Python mode buffer, do a C-h m for more help. It's
6836
0255b5ecde10 Update to the Big Comment at the top of the file. It should better
Barry Warsaw <barry@python.org>
parents: 6767
diff changeset
74 ;; doubtful that a texinfo manual would be very useful, but if you
0255b5ecde10 Update to the Big Comment at the top of the file. It should better
Barry Warsaw <barry@python.org>
parents: 6767
diff changeset
75 ;; want to contribute one, I'll certainly accept it!
2543
1a448dd84edc (py-submit-bug-report): fixed summary querying
Barry Warsaw <barry@python.org>
parents: 2537
diff changeset
76
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
77 ;;; Code:
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
78
9027
d53237bcf15f (py-shell-map): New variable contains the keymap used in *Python*
Barry Warsaw <barry@python.org>
parents: 9026
diff changeset
79 (require 'comint)
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
80 (require 'custom)
17416
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
81 (require 'cl)
24269
d7237037f379 We need to (require 'compile) to guarantee that compile-internal is
Barry Warsaw <barry@python.org>
parents: 24248
diff changeset
82 (require 'compile)
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
83 (require 'ansi-color)
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
84
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
85
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
86 ;; user definable variables
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
87 ;; vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
88
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
89 (defgroup python nil
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
90 "Support for the Python programming language, <http://www.python.org/>"
11147
bbd035e5a972 A few minor Customize changes:
Barry Warsaw <barry@python.org>
parents: 11146
diff changeset
91 :group 'languages
bbd035e5a972 A few minor Customize changes:
Barry Warsaw <barry@python.org>
parents: 11146
diff changeset
92 :prefix "py-")
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
93
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
94 (defcustom py-tab-always-indent t
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
95 "*Non-nil means TAB in Python mode should always reindent the current line,
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
96 regardless of where in the line point is when the TAB command is used."
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
97 :type 'boolean
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
98 :group 'python)
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
99
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
100 (defcustom py-python-command "python"
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
101 "*Shell command used to start Python interpreter."
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
102 :type 'string
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
103 :group 'python)
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
104
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
105 (make-obsolete-variable 'py-jpython-command 'py-jython-command)
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
106 (defcustom py-jython-command "jython"
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
107 "*Shell command used to start the Jython interpreter."
7950
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
108 :type 'string
11147
bbd035e5a972 A few minor Customize changes:
Barry Warsaw <barry@python.org>
parents: 11146
diff changeset
109 :group 'python
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
110 :tag "Jython Command")
7950
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
111
10207
29d1d3b08ca7 (py-default-interpreter): New variable which selects whether CPython
Barry Warsaw <barry@python.org>
parents: 9927
diff changeset
112 (defcustom py-default-interpreter 'cpython
29d1d3b08ca7 (py-default-interpreter): New variable which selects whether CPython
Barry Warsaw <barry@python.org>
parents: 9927
diff changeset
113 "*Which Python interpreter is used by default.
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
114 The value for this variable can be either `cpython' or `jython'.
10207
29d1d3b08ca7 (py-default-interpreter): New variable which selects whether CPython
Barry Warsaw <barry@python.org>
parents: 9927
diff changeset
115
29d1d3b08ca7 (py-default-interpreter): New variable which selects whether CPython
Barry Warsaw <barry@python.org>
parents: 9927
diff changeset
116 When the value is `cpython', the variables `py-python-command' and
29d1d3b08ca7 (py-default-interpreter): New variable which selects whether CPython
Barry Warsaw <barry@python.org>
parents: 9927
diff changeset
117 `py-python-command-args' are consulted to determine the interpreter
29d1d3b08ca7 (py-default-interpreter): New variable which selects whether CPython
Barry Warsaw <barry@python.org>
parents: 9927
diff changeset
118 and arguments to use.
29d1d3b08ca7 (py-default-interpreter): New variable which selects whether CPython
Barry Warsaw <barry@python.org>
parents: 9927
diff changeset
119
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
120 When the value is `jython', the variables `py-jython-command' and
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
121 `py-jython-command-args' are consulted to determine the interpreter
10207
29d1d3b08ca7 (py-default-interpreter): New variable which selects whether CPython
Barry Warsaw <barry@python.org>
parents: 9927
diff changeset
122 and arguments to use.
29d1d3b08ca7 (py-default-interpreter): New variable which selects whether CPython
Barry Warsaw <barry@python.org>
parents: 9927
diff changeset
123
11146
f62e465c4d01 (python-mode): Set which interpreter (CPython or JPython) to use the
Barry Warsaw <barry@python.org>
parents: 11144
diff changeset
124 Note that this variable is consulted only the first time that a Python
f62e465c4d01 (python-mode): Set which interpreter (CPython or JPython) to use the
Barry Warsaw <barry@python.org>
parents: 11144
diff changeset
125 mode buffer is visited during an Emacs session. After that, use
10207
29d1d3b08ca7 (py-default-interpreter): New variable which selects whether CPython
Barry Warsaw <barry@python.org>
parents: 9927
diff changeset
126 \\[py-toggle-shells] to change the interpreter shell."
29d1d3b08ca7 (py-default-interpreter): New variable which selects whether CPython
Barry Warsaw <barry@python.org>
parents: 9927
diff changeset
127 :type '(choice (const :tag "Python (a.k.a. CPython)" cpython)
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
128 (const :tag "Jython" jython))
10207
29d1d3b08ca7 (py-default-interpreter): New variable which selects whether CPython
Barry Warsaw <barry@python.org>
parents: 9927
diff changeset
129 :group 'python)
29d1d3b08ca7 (py-default-interpreter): New variable which selects whether CPython
Barry Warsaw <barry@python.org>
parents: 9927
diff changeset
130
7197
26d07735ba4a (py-python-command-args): New variable, allows user to customize the
Barry Warsaw <barry@python.org>
parents: 7152
diff changeset
131 (defcustom py-python-command-args '("-i")
26d07735ba4a (py-python-command-args): New variable, allows user to customize the
Barry Warsaw <barry@python.org>
parents: 7152
diff changeset
132 "*List of string arguments to be used when starting a Python shell."
26d07735ba4a (py-python-command-args): New variable, allows user to customize the
Barry Warsaw <barry@python.org>
parents: 7152
diff changeset
133 :type '(repeat string)
26d07735ba4a (py-python-command-args): New variable, allows user to customize the
Barry Warsaw <barry@python.org>
parents: 7152
diff changeset
134 :group 'python)
26d07735ba4a (py-python-command-args): New variable, allows user to customize the
Barry Warsaw <barry@python.org>
parents: 7152
diff changeset
135
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
136 (make-obsolete-variable 'py-jpython-command-args 'py-jython-command-args)
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
137 (defcustom py-jython-command-args '("-i")
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
138 "*List of string arguments to be used when starting a Jython shell."
7950
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
139 :type '(repeat string)
11147
bbd035e5a972 A few minor Customize changes:
Barry Warsaw <barry@python.org>
parents: 11146
diff changeset
140 :group 'python
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
141 :tag "Jython Command Args")
7950
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
142
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
143 (defcustom py-indent-offset 4
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
144 "*Amount of offset per level of indentation.
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
145 `\\[py-guess-indent-offset]' can usually guess a good value when
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
146 you're editing someone else's Python code."
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
147 :type 'integer
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
148 :group 'python)
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
149
18150
9ce8a995bf12 (py-continuation-offset): New variable which controls how much to
Barry Warsaw <barry@python.org>
parents: 17422
diff changeset
150 (defcustom py-continuation-offset 4
18412
a29bef457ed8 (py-continuation-offset): Update docstring to describe that this
Barry Warsaw <barry@python.org>
parents: 18156
diff changeset
151 "*Additional amount of offset to give for some continuation lines.
18150
9ce8a995bf12 (py-continuation-offset): New variable which controls how much to
Barry Warsaw <barry@python.org>
parents: 17422
diff changeset
152 Continuation lines are those that immediately follow a backslash
18412
a29bef457ed8 (py-continuation-offset): Update docstring to describe that this
Barry Warsaw <barry@python.org>
parents: 18156
diff changeset
153 terminated line. Only those continuation lines for a block opening
a29bef457ed8 (py-continuation-offset): Update docstring to describe that this
Barry Warsaw <barry@python.org>
parents: 18156
diff changeset
154 statement are given this extra offset."
18150
9ce8a995bf12 (py-continuation-offset): New variable which controls how much to
Barry Warsaw <barry@python.org>
parents: 17422
diff changeset
155 :type 'integer
9ce8a995bf12 (py-continuation-offset): New variable which controls how much to
Barry Warsaw <barry@python.org>
parents: 17422
diff changeset
156 :group 'python)
9ce8a995bf12 (py-continuation-offset): New variable which controls how much to
Barry Warsaw <barry@python.org>
parents: 17422
diff changeset
157
7672
1fb868f25459 (py-smart-indentation): New variable which controls the automagic
Barry Warsaw <barry@python.org>
parents: 7481
diff changeset
158 (defcustom py-smart-indentation t
1fb868f25459 (py-smart-indentation): New variable which controls the automagic
Barry Warsaw <barry@python.org>
parents: 7481
diff changeset
159 "*Should `python-mode' try to automagically set some indentation variables?
1fb868f25459 (py-smart-indentation): New variable which controls the automagic
Barry Warsaw <barry@python.org>
parents: 7481
diff changeset
160 When this variable is non-nil, two things happen when a buffer is set
1fb868f25459 (py-smart-indentation): New variable which controls the automagic
Barry Warsaw <barry@python.org>
parents: 7481
diff changeset
161 to `python-mode':
1fb868f25459 (py-smart-indentation): New variable which controls the automagic
Barry Warsaw <barry@python.org>
parents: 7481
diff changeset
162
10918
a8a1eb99341c (py-statement-closes-block-p): py-goto-initial-line could leave us in
Barry Warsaw <barry@python.org>
parents: 10877
diff changeset
163 1. `py-indent-offset' is guessed from existing code in the buffer.
7699
96b7c1323d30 (py-smart-indentation): Updated docstring for new policy.
Barry Warsaw <barry@python.org>
parents: 7676
diff changeset
164 Only guessed values between 2 and 8 are considered. If a valid
7672
1fb868f25459 (py-smart-indentation): New variable which controls the automagic
Barry Warsaw <barry@python.org>
parents: 7481
diff changeset
165 guess can't be made (perhaps because you are visiting a new
7699
96b7c1323d30 (py-smart-indentation): Updated docstring for new policy.
Barry Warsaw <barry@python.org>
parents: 7676
diff changeset
166 file), then the value in `py-indent-offset' is used.
7672
1fb868f25459 (py-smart-indentation): New variable which controls the automagic
Barry Warsaw <barry@python.org>
parents: 7481
diff changeset
167
7699
96b7c1323d30 (py-smart-indentation): Updated docstring for new policy.
Barry Warsaw <barry@python.org>
parents: 7676
diff changeset
168 2. `indent-tabs-mode' is turned off if `py-indent-offset' does not
96b7c1323d30 (py-smart-indentation): Updated docstring for new policy.
Barry Warsaw <barry@python.org>
parents: 7676
diff changeset
169 equal `tab-width' (`indent-tabs-mode' is never turned on by
96b7c1323d30 (py-smart-indentation): Updated docstring for new policy.
Barry Warsaw <barry@python.org>
parents: 7676
diff changeset
170 Python mode). This means that for newly written code, tabs are
96b7c1323d30 (py-smart-indentation): Updated docstring for new policy.
Barry Warsaw <barry@python.org>
parents: 7676
diff changeset
171 only inserted in indentation if one tab is one indentation
96b7c1323d30 (py-smart-indentation): Updated docstring for new policy.
Barry Warsaw <barry@python.org>
parents: 7676
diff changeset
172 level, otherwise only spaces are used.
7672
1fb868f25459 (py-smart-indentation): New variable which controls the automagic
Barry Warsaw <barry@python.org>
parents: 7481
diff changeset
173
7676
bdcf708ae4da #(py-smart-indentation): Small fixes for clarity in the docstring.
Barry Warsaw <barry@python.org>
parents: 7675
diff changeset
174 Note that both these settings occur *after* `python-mode-hook' is run,
bdcf708ae4da #(py-smart-indentation): Small fixes for clarity in the docstring.
Barry Warsaw <barry@python.org>
parents: 7675
diff changeset
175 so if you want to defeat the automagic configuration, you must also
bdcf708ae4da #(py-smart-indentation): Small fixes for clarity in the docstring.
Barry Warsaw <barry@python.org>
parents: 7675
diff changeset
176 set `py-smart-indentation' to nil in your `python-mode-hook'."
7672
1fb868f25459 (py-smart-indentation): New variable which controls the automagic
Barry Warsaw <barry@python.org>
parents: 7481
diff changeset
177 :type 'boolean
1fb868f25459 (py-smart-indentation): New variable which controls the automagic
Barry Warsaw <barry@python.org>
parents: 7481
diff changeset
178 :group 'python)
1fb868f25459 (py-smart-indentation): New variable which controls the automagic
Barry Warsaw <barry@python.org>
parents: 7481
diff changeset
179
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
180 (defcustom py-align-multiline-strings-p t
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
181 "*Flag describing how multi-line triple quoted strings are aligned.
3114
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
182 When this flag is non-nil, continuation lines are lined up under the
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
183 preceding line's indentation. When this flag is nil, continuation
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
184 lines are aligned to column zero."
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
185 :type '(choice (const :tag "Align under preceding line" t)
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
186 (const :tag "Align to column zero" nil))
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
187 :group 'python)
3114
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
188
9136
e1b710e30acf (py-block-comment-prefix): Remove trailing space. Also explain that
Barry Warsaw <barry@python.org>
parents: 9106
diff changeset
189 (defcustom py-block-comment-prefix "##"
3445
07977bf0d997 (py-comment-region): obsoleted by comment-region
Barry Warsaw <barry@python.org>
parents: 3436
diff changeset
190 "*String used by \\[comment-region] to comment out a block of code.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
191 This should follow the convention for non-indenting comment lines so
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
192 that the indentation commands won't get confused (i.e., the string
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
193 should be of the form `#x...' where `x' is not a blank or a tab, and
9136
e1b710e30acf (py-block-comment-prefix): Remove trailing space. Also explain that
Barry Warsaw <barry@python.org>
parents: 9106
diff changeset
194 `...' is arbitrary). However, this string should not end in whitespace."
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
195 :type 'string
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
196 :group 'python)
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
197
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
198 (defcustom py-honor-comment-indentation t
3434
529f4d9cbe3d (py-honor-comment-indentation, py-compute-indentation): allow other
Barry Warsaw <barry@python.org>
parents: 3429
diff changeset
199 "*Controls how comment lines influence subsequent indentation.
529f4d9cbe3d (py-honor-comment-indentation, py-compute-indentation): allow other
Barry Warsaw <barry@python.org>
parents: 3429
diff changeset
200
529f4d9cbe3d (py-honor-comment-indentation, py-compute-indentation): allow other
Barry Warsaw <barry@python.org>
parents: 3429
diff changeset
201 When nil, all comment lines are skipped for indentation purposes, and
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
202 if possible, a faster algorithm is used (i.e. X/Emacs 19 and beyond).
3429
da86b3b54363 (py-honor-comment-indentation): new variable.
Barry Warsaw <barry@python.org>
parents: 3428
diff changeset
203
3434
529f4d9cbe3d (py-honor-comment-indentation, py-compute-indentation): allow other
Barry Warsaw <barry@python.org>
parents: 3429
diff changeset
204 When t, lines that begin with a single `#' are a hint to subsequent
529f4d9cbe3d (py-honor-comment-indentation, py-compute-indentation): allow other
Barry Warsaw <barry@python.org>
parents: 3429
diff changeset
205 line indentation. If the previous line is such a comment line (as
8370
f2b0859fece3 #Documentation and comment typos patch given by Michael Ernst. More
Barry Warsaw <barry@python.org>
parents: 8070
diff changeset
206 opposed to one that starts with `py-block-comment-prefix'), then its
3434
529f4d9cbe3d (py-honor-comment-indentation, py-compute-indentation): allow other
Barry Warsaw <barry@python.org>
parents: 3429
diff changeset
207 indentation is used as a hint for this line's indentation. Lines that
529f4d9cbe3d (py-honor-comment-indentation, py-compute-indentation): allow other
Barry Warsaw <barry@python.org>
parents: 3429
diff changeset
208 begin with `py-block-comment-prefix' are ignored for indentation
529f4d9cbe3d (py-honor-comment-indentation, py-compute-indentation): allow other
Barry Warsaw <barry@python.org>
parents: 3429
diff changeset
209 purposes.
529f4d9cbe3d (py-honor-comment-indentation, py-compute-indentation): allow other
Barry Warsaw <barry@python.org>
parents: 3429
diff changeset
210
22336
029e4cbd2312 backport bwarsaw's checkin of
Michael W. Hudson <mwh@python.net>
parents: 18415
diff changeset
211 When not nil or t, comment lines that begin with a single `#' are used
029e4cbd2312 backport bwarsaw's checkin of
Michael W. Hudson <mwh@python.net>
parents: 18415
diff changeset
212 as indentation hints, unless the comment character is in column zero."
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
213 :type '(choice
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
214 (const :tag "Skip all comment lines (fast)" nil)
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
215 (const :tag "Single # `sets' indentation for next line" t)
6544
d28932d676c8 Changes in preparation for integrating into the Python CVS tree.
Barry Warsaw <barry@python.org>
parents: 6232
diff changeset
216 (const :tag "Single # `sets' indentation except at column zero"
d28932d676c8 Changes in preparation for integrating into the Python CVS tree.
Barry Warsaw <barry@python.org>
parents: 6232
diff changeset
217 other)
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
218 )
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
219 :group 'python)
3429
da86b3b54363 (py-honor-comment-indentation): new variable.
Barry Warsaw <barry@python.org>
parents: 3428
diff changeset
220
5969
5f6a2eadab97 #Fixed two byte-compiler errors
Barry Warsaw <barry@python.org>
parents: 5968
diff changeset
221 (defcustom py-temp-directory
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
222 (let ((ok '(lambda (x)
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
223 (and x
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
224 (setq x (expand-file-name x)) ; always true
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
225 (file-directory-p x)
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
226 (file-writable-p x)
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
227 x))))
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
228 (or (funcall ok (getenv "TMPDIR"))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
229 (funcall ok "/usr/tmp")
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
230 (funcall ok "/tmp")
22524
0aae09986fc9 backport bwarsaw's checkin of
Michael W. Hudson <mwh@python.net>
parents: 22336
diff changeset
231 (funcall ok "/var/tmp")
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
232 (funcall ok ".")
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
233 (error
7480
55c3fd1853ce (py-temp-directory): Minor docstring nit.
Barry Warsaw <barry@python.org>
parents: 7478
diff changeset
234 "Couldn't find a usable temp directory -- set `py-temp-directory'")))
22524
0aae09986fc9 backport bwarsaw's checkin of
Michael W. Hudson <mwh@python.net>
parents: 22336
diff changeset
235 "*Directory used for temporary files created by a *Python* process.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
236 By default, the first directory from this list that exists and that you
22524
0aae09986fc9 backport bwarsaw's checkin of
Michael W. Hudson <mwh@python.net>
parents: 22336
diff changeset
237 can write into: the value (if any) of the environment variable TMPDIR,
0aae09986fc9 backport bwarsaw's checkin of
Michael W. Hudson <mwh@python.net>
parents: 22336
diff changeset
238 /usr/tmp, /tmp, /var/tmp, or the current directory."
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
239 :type 'string
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
240 :group 'python)
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
241
5969
5f6a2eadab97 #Fixed two byte-compiler errors
Barry Warsaw <barry@python.org>
parents: 5968
diff changeset
242 (defcustom py-beep-if-tab-change t
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
243 "*Ring the bell if `tab-width' is changed.
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
244 If a comment of the form
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
245
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
246 \t# vi:set tabsize=<number>:
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
247
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
248 is found before the first code line when the file is entered, and the
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
249 current value of (the general Emacs variable) `tab-width' does not
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
250 equal <number>, `tab-width' is set to <number>, a message saying so is
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
251 displayed in the echo area, and if `py-beep-if-tab-change' is non-nil
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
252 the Emacs bell is also rung as a warning."
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
253 :type 'boolean
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
254 :group 'python)
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
255
6731
21656204dd4f (py-jump-on-exception): Variable which if t, means that if an
Barry Warsaw <barry@python.org>
parents: 6730
diff changeset
256 (defcustom py-jump-on-exception t
21656204dd4f (py-jump-on-exception): Variable which if t, means that if an
Barry Warsaw <barry@python.org>
parents: 6730
diff changeset
257 "*Jump to innermost exception frame in *Python Output* buffer.
8924
0954ad4acdfd (py-compute-indentation): Changes to the `t' condition which affect
Barry Warsaw <barry@python.org>
parents: 8911
diff changeset
258 When this variable is non-nil and an exception occurs when running
6731
21656204dd4f (py-jump-on-exception): Variable which if t, means that if an
Barry Warsaw <barry@python.org>
parents: 6730
diff changeset
259 Python code synchronously in a subprocess, jump immediately to the
8924
0954ad4acdfd (py-compute-indentation): Changes to the `t' condition which affect
Barry Warsaw <barry@python.org>
parents: 8911
diff changeset
260 source code of the innermost traceback frame."
8381
822e0812f20c (py-ask-about-save): New variable used in
Barry Warsaw <barry@python.org>
parents: 8380
diff changeset
261 :type 'boolean
822e0812f20c (py-ask-about-save): New variable used in
Barry Warsaw <barry@python.org>
parents: 8380
diff changeset
262 :group 'python)
822e0812f20c (py-ask-about-save): New variable used in
Barry Warsaw <barry@python.org>
parents: 8380
diff changeset
263
822e0812f20c (py-ask-about-save): New variable used in
Barry Warsaw <barry@python.org>
parents: 8380
diff changeset
264 (defcustom py-ask-about-save t
822e0812f20c (py-ask-about-save): New variable used in
Barry Warsaw <barry@python.org>
parents: 8380
diff changeset
265 "If not nil, ask about which buffers to save before executing some code.
822e0812f20c (py-ask-about-save): New variable used in
Barry Warsaw <barry@python.org>
parents: 8380
diff changeset
266 Otherwise, all modified buffers are saved without asking."
822e0812f20c (py-ask-about-save): New variable used in
Barry Warsaw <barry@python.org>
parents: 8380
diff changeset
267 :type 'boolean
822e0812f20c (py-ask-about-save): New variable used in
Barry Warsaw <barry@python.org>
parents: 8380
diff changeset
268 :group 'python)
6731
21656204dd4f (py-jump-on-exception): Variable which if t, means that if an
Barry Warsaw <barry@python.org>
parents: 6730
diff changeset
269
6556
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
270 (defcustom py-backspace-function 'backward-delete-char-untabify
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
271 "*Function called by `py-electric-backspace' when deleting backwards."
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
272 :type 'function
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
273 :group 'python)
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
274
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
275 (defcustom py-delete-function 'delete-char
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
276 "*Function called by `py-electric-delete' when deleting forwards."
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
277 :type 'function
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
278 :group 'python)
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
279
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
280 (defcustom py-imenu-show-method-args-p nil
9457
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
281 "*Controls echoing of arguments of functions & methods in the Imenu buffer.
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
282 When non-nil, arguments are printed."
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
283 :type 'boolean
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
284 :group 'python)
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
285 (make-variable-buffer-local 'py-indent-offset)
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
286
17416
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
287 (defcustom py-pdbtrack-do-tracking-p t
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
288 "*Controls whether the pdbtrack feature is enabled or not.
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
289 When non-nil, pdbtrack is enabled in all comint-based buffers,
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
290 e.g. shell buffers and the *Python* buffer. When using pdb to debug a
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
291 Python program, pdbtrack notices the pdb prompt and displays the
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
292 source file and line that the program is stopped at, much the same way
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
293 as gud-mode does for debugging C programs with gdb."
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
294 :type 'boolean
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
295 :group 'python)
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
296 (make-variable-buffer-local 'py-pdbtrack-do-tracking-p)
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
297
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
298 (defcustom py-pdbtrack-minor-mode-string " PDB"
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
299 "*String to use in the minor mode list when pdbtrack is enabled."
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
300 :type 'string
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
301 :group 'python)
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
302
23277
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
303 (defcustom py-import-check-point-max
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
304 20000
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
305 "Maximum number of characters to search for a Java-ish import statement.
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
306 When `python-mode' tries to calculate the shell to use (either a
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
307 CPython or a Jython shell), it looks at the so-called `shebang' line
23277
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
308 -- i.e. #! line. If that's not available, it looks at some of the
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
309 file heading imports to see if they look Java-like."
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
310 :type 'integer
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
311 :group 'python
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
312 )
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
313
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
314 (make-obsolete-variable 'py-jpython-packages 'py-jython-packages)
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
315 (defcustom py-jython-packages
23277
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
316 '("java" "javax" "org" "com")
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
317 "Imported packages that imply `jython-mode'."
23277
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
318 :type '(repeat string)
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
319 :group 'python)
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
320
7142
aff1e7b1f523 (py-master-file): New buffer-local variable which can be set in the
Barry Warsaw <barry@python.org>
parents: 6836
diff changeset
321 ;; Not customizable
aff1e7b1f523 (py-master-file): New buffer-local variable which can be set in the
Barry Warsaw <barry@python.org>
parents: 6836
diff changeset
322 (defvar py-master-file nil
aff1e7b1f523 (py-master-file): New buffer-local variable which can be set in the
Barry Warsaw <barry@python.org>
parents: 6836
diff changeset
323 "If non-nil, execute the named file instead of the buffer's file.
7478
80739b0bc302 (py-master-file): Fixed some typos in the docstring.
Barry Warsaw <barry@python.org>
parents: 7262
diff changeset
324 The intent is to allow you to set this variable in the file's local
7142
aff1e7b1f523 (py-master-file): New buffer-local variable which can be set in the
Barry Warsaw <barry@python.org>
parents: 6836
diff changeset
325 variable section, e.g.:
aff1e7b1f523 (py-master-file): New buffer-local variable which can be set in the
Barry Warsaw <barry@python.org>
parents: 6836
diff changeset
326
aff1e7b1f523 (py-master-file): New buffer-local variable which can be set in the
Barry Warsaw <barry@python.org>
parents: 6836
diff changeset
327 # Local Variables:
aff1e7b1f523 (py-master-file): New buffer-local variable which can be set in the
Barry Warsaw <barry@python.org>
parents: 6836
diff changeset
328 # py-master-file: \"master.py\"
aff1e7b1f523 (py-master-file): New buffer-local variable which can be set in the
Barry Warsaw <barry@python.org>
parents: 6836
diff changeset
329 # End:
aff1e7b1f523 (py-master-file): New buffer-local variable which can be set in the
Barry Warsaw <barry@python.org>
parents: 6836
diff changeset
330
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
331 so that typing \\[py-execute-buffer] in that buffer executes the named
9454
e5996279f58c #Fixed some typos in docstrings.
Barry Warsaw <barry@python.org>
parents: 9144
diff changeset
332 master file instead of the buffer's file. If the file name has a
e5996279f58c #Fixed some typos in docstrings.
Barry Warsaw <barry@python.org>
parents: 9144
diff changeset
333 relative path, the value of variable `default-directory' for the
e5996279f58c #Fixed some typos in docstrings.
Barry Warsaw <barry@python.org>
parents: 9144
diff changeset
334 buffer is prepended to come up with a file name.")
7142
aff1e7b1f523 (py-master-file): New buffer-local variable which can be set in the
Barry Warsaw <barry@python.org>
parents: 6836
diff changeset
335 (make-variable-buffer-local 'py-master-file)
aff1e7b1f523 (py-master-file): New buffer-local variable which can be set in the
Barry Warsaw <barry@python.org>
parents: 6836
diff changeset
336
23229
2b47d0dcfa66 Some contributions and ideas by Alexander Schmolck: add a keybinding
Barry Warsaw <barry@python.org>
parents: 23224
diff changeset
337 (defcustom py-pychecker-command "pychecker"
2b47d0dcfa66 Some contributions and ideas by Alexander Schmolck: add a keybinding
Barry Warsaw <barry@python.org>
parents: 23224
diff changeset
338 "*Shell command used to run Pychecker."
2b47d0dcfa66 Some contributions and ideas by Alexander Schmolck: add a keybinding
Barry Warsaw <barry@python.org>
parents: 23224
diff changeset
339 :type 'string
2b47d0dcfa66 Some contributions and ideas by Alexander Schmolck: add a keybinding
Barry Warsaw <barry@python.org>
parents: 23224
diff changeset
340 :group 'python
2b47d0dcfa66 Some contributions and ideas by Alexander Schmolck: add a keybinding
Barry Warsaw <barry@python.org>
parents: 23224
diff changeset
341 :tag "Pychecker Command")
2b47d0dcfa66 Some contributions and ideas by Alexander Schmolck: add a keybinding
Barry Warsaw <barry@python.org>
parents: 23224
diff changeset
342
2b47d0dcfa66 Some contributions and ideas by Alexander Schmolck: add a keybinding
Barry Warsaw <barry@python.org>
parents: 23224
diff changeset
343 (defcustom py-pychecker-command-args '("--stdlib")
2b47d0dcfa66 Some contributions and ideas by Alexander Schmolck: add a keybinding
Barry Warsaw <barry@python.org>
parents: 23224
diff changeset
344 "*List of string arguments to be passed to pychecker."
2b47d0dcfa66 Some contributions and ideas by Alexander Schmolck: add a keybinding
Barry Warsaw <barry@python.org>
parents: 23224
diff changeset
345 :type '(repeat string)
2b47d0dcfa66 Some contributions and ideas by Alexander Schmolck: add a keybinding
Barry Warsaw <barry@python.org>
parents: 23224
diff changeset
346 :group 'python
2b47d0dcfa66 Some contributions and ideas by Alexander Schmolck: add a keybinding
Barry Warsaw <barry@python.org>
parents: 23224
diff changeset
347 :tag "Pychecker Command Args")
2b47d0dcfa66 Some contributions and ideas by Alexander Schmolck: add a keybinding
Barry Warsaw <barry@python.org>
parents: 23224
diff changeset
348
23277
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
349 (defvar py-shell-alist
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
350 '(("jython" . 'jython)
23277
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
351 ("python" . 'cpython))
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
352 "*Alist of interpreters and python shells. Used by `py-choose-shell'
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
353 to select the appropriate python interpreter mode for a file.")
6556
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
354
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
355 (defcustom py-shell-input-prompt-1-regexp "^>>> "
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
356 "*A regular expression to match the input prompt of the shell."
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
357 :type 'string
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
358 :group 'python)
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
359
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
360 (defcustom py-shell-input-prompt-2-regexp "^[.][.][.] "
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
361 "*A regular expression to match the input prompt of the shell after the
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
362 first line of input."
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
363 :type 'string
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
364 :group 'python)
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
365
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
366 (defcustom py-shell-switch-buffers-on-execute t
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
367 "*Controls switching to the Python buffer where commands are
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
368 executed. When non-nil the buffer switches to the Python buffer, if
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
369 not no switching occurs."
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
370 :type 'boolean
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
371 :group 'python)
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
372
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
373
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
374 ;; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
375 ;; NO USER DEFINABLE VARIABLES BEYOND THIS POINT
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
376
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
377 (defvar py-line-number-offset 0
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
378 "When an exception occurs as a result of py-execute-region, a
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
379 subsequent py-up-exception needs the line number where the region
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
380 started, in order to jump to the correct file line. This variable is
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
381 set in py-execute-region and used in py-jump-to-exception.")
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
382
6562
53835043528c (py-emacs-features): Test for working make-temp-name, which is broken
Barry Warsaw <barry@python.org>
parents: 6560
diff changeset
383 (defconst py-emacs-features
53835043528c (py-emacs-features): Test for working make-temp-name, which is broken
Barry Warsaw <barry@python.org>
parents: 6560
diff changeset
384 (let (features)
53835043528c (py-emacs-features): Test for working make-temp-name, which is broken
Barry Warsaw <barry@python.org>
parents: 6560
diff changeset
385 features)
6232
fc5e1e004994 (py-parse-partial-sexp-works-p): Removed as obsolete. All current
Barry Warsaw <barry@python.org>
parents: 5969
diff changeset
386 "A list of features extant in the Emacs you are using.
6565
e1c8d7182d66 #(py-emacs-features): Fixed typo in docstring.
Barry Warsaw <barry@python.org>
parents: 6564
diff changeset
387 There are many flavors of Emacs out there, with different levels of
e1c8d7182d66 #(py-emacs-features): Fixed typo in docstring.
Barry Warsaw <barry@python.org>
parents: 6564
diff changeset
388 support for features needed by `python-mode'.")
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
389
23229
2b47d0dcfa66 Some contributions and ideas by Alexander Schmolck: add a keybinding
Barry Warsaw <barry@python.org>
parents: 23224
diff changeset
390 ;; Face for None, True, False, self, and Ellipsis
2b47d0dcfa66 Some contributions and ideas by Alexander Schmolck: add a keybinding
Barry Warsaw <barry@python.org>
parents: 23224
diff changeset
391 (defvar py-pseudo-keyword-face 'py-pseudo-keyword-face
2b47d0dcfa66 Some contributions and ideas by Alexander Schmolck: add a keybinding
Barry Warsaw <barry@python.org>
parents: 23224
diff changeset
392 "Face for pseudo keywords in Python mode, like self, True, False, Ellipsis.")
2b47d0dcfa66 Some contributions and ideas by Alexander Schmolck: add a keybinding
Barry Warsaw <barry@python.org>
parents: 23224
diff changeset
393 (make-face 'py-pseudo-keyword-face)
2b47d0dcfa66 Some contributions and ideas by Alexander Schmolck: add a keybinding
Barry Warsaw <barry@python.org>
parents: 23224
diff changeset
394
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
395 ;; PEP 318 decorators
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
396 (defvar py-decorators-face 'py-decorators-face
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
397 "Face method decorators.")
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
398 (make-face 'py-decorators-face)
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
399
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
400 ;; Face for builtins
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
401 (defvar py-builtins-face 'py-builtins-face
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
402 "Face for builtins like TypeError, object, open, and exec.")
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
403 (make-face 'py-builtins-face)
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
404
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
405 ;; XXX, TODO, and FIXME comments and such
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
406 (defvar py-XXX-tag-face 'py-XXX-tag-face
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
407 "Face for XXX, TODO, and FIXME tags")
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
408 (make-face 'py-XXX-tag-face)
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
409
23229
2b47d0dcfa66 Some contributions and ideas by Alexander Schmolck: add a keybinding
Barry Warsaw <barry@python.org>
parents: 23224
diff changeset
410 (defun py-font-lock-mode-hook ()
2b47d0dcfa66 Some contributions and ideas by Alexander Schmolck: add a keybinding
Barry Warsaw <barry@python.org>
parents: 23224
diff changeset
411 (or (face-differs-from-default-p 'py-pseudo-keyword-face)
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
412 (copy-face 'font-lock-keyword-face 'py-pseudo-keyword-face))
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
413 (or (face-differs-from-default-p 'py-builtins-face)
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
414 (copy-face 'font-lock-keyword-face 'py-builtins-face))
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
415 (or (face-differs-from-default-p 'py-decorators-face)
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
416 (copy-face 'py-pseudo-keyword-face 'py-decorators-face))
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
417 (or (face-differs-from-default-p 'py-XXX-tag-face)
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
418 (copy-face 'font-lock-comment-face 'py-XXX-tag-face))
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
419 )
23229
2b47d0dcfa66 Some contributions and ideas by Alexander Schmolck: add a keybinding
Barry Warsaw <barry@python.org>
parents: 23224
diff changeset
420 (add-hook 'font-lock-mode-hook 'py-font-lock-mode-hook)
2b47d0dcfa66 Some contributions and ideas by Alexander Schmolck: add a keybinding
Barry Warsaw <barry@python.org>
parents: 23224
diff changeset
421
5150
4665e2849a4a (python-font-lock-keywords): Use new convention for installing in mode
Barry Warsaw <barry@python.org>
parents: 5075
diff changeset
422 (defvar python-font-lock-keywords
6564
812aad8c05c2 (python-font-lock-keywords): Pick up block introducing keywords with
Barry Warsaw <barry@python.org>
parents: 6563
diff changeset
423 (let ((kw1 (mapconcat 'identity
812aad8c05c2 (python-font-lock-keywords): Pick up block introducing keywords with
Barry Warsaw <barry@python.org>
parents: 6563
diff changeset
424 '("and" "assert" "break" "class"
812aad8c05c2 (python-font-lock-keywords): Pick up block introducing keywords with
Barry Warsaw <barry@python.org>
parents: 6563
diff changeset
425 "continue" "def" "del" "elif"
812aad8c05c2 (python-font-lock-keywords): Pick up block introducing keywords with
Barry Warsaw <barry@python.org>
parents: 6563
diff changeset
426 "else" "except" "exec" "for"
812aad8c05c2 (python-font-lock-keywords): Pick up block introducing keywords with
Barry Warsaw <barry@python.org>
parents: 6563
diff changeset
427 "from" "global" "if" "import"
812aad8c05c2 (python-font-lock-keywords): Pick up block introducing keywords with
Barry Warsaw <barry@python.org>
parents: 6563
diff changeset
428 "in" "is" "lambda" "not"
812aad8c05c2 (python-font-lock-keywords): Pick up block introducing keywords with
Barry Warsaw <barry@python.org>
parents: 6563
diff changeset
429 "or" "pass" "print" "raise"
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
430 "return" "while" "with" "yield"
6564
812aad8c05c2 (python-font-lock-keywords): Pick up block introducing keywords with
Barry Warsaw <barry@python.org>
parents: 6563
diff changeset
431 )
812aad8c05c2 (python-font-lock-keywords): Pick up block introducing keywords with
Barry Warsaw <barry@python.org>
parents: 6563
diff changeset
432 "\\|"))
812aad8c05c2 (python-font-lock-keywords): Pick up block introducing keywords with
Barry Warsaw <barry@python.org>
parents: 6563
diff changeset
433 (kw2 (mapconcat 'identity
812aad8c05c2 (python-font-lock-keywords): Pick up block introducing keywords with
Barry Warsaw <barry@python.org>
parents: 6563
diff changeset
434 '("else:" "except:" "finally:" "try:")
812aad8c05c2 (python-font-lock-keywords): Pick up block introducing keywords with
Barry Warsaw <barry@python.org>
parents: 6563
diff changeset
435 "\\|"))
31236
acbc7563a8e7 Sync with python-mode project. Adds two changes:
Skip Montanaro <skip@pobox.com>
parents: 30034
diff changeset
436 (kw3 (mapconcat 'identity
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
437 ;; Don't include True, False, None, or
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
438 ;; Ellipsis in this list, since they are
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
439 ;; already defined as pseudo keywords.
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
440 '("__debug__"
31236
acbc7563a8e7 Sync with python-mode project. Adds two changes:
Skip Montanaro <skip@pobox.com>
parents: 30034
diff changeset
441 "__import__" "__name__" "abs" "apply" "basestring"
acbc7563a8e7 Sync with python-mode project. Adds two changes:
Skip Montanaro <skip@pobox.com>
parents: 30034
diff changeset
442 "bool" "buffer" "callable" "chr" "classmethod"
acbc7563a8e7 Sync with python-mode project. Adds two changes:
Skip Montanaro <skip@pobox.com>
parents: 30034
diff changeset
443 "cmp" "coerce" "compile" "complex" "copyright"
acbc7563a8e7 Sync with python-mode project. Adds two changes:
Skip Montanaro <skip@pobox.com>
parents: 30034
diff changeset
444 "delattr" "dict" "dir" "divmod"
acbc7563a8e7 Sync with python-mode project. Adds two changes:
Skip Montanaro <skip@pobox.com>
parents: 30034
diff changeset
445 "enumerate" "eval" "execfile" "exit" "file"
acbc7563a8e7 Sync with python-mode project. Adds two changes:
Skip Montanaro <skip@pobox.com>
parents: 30034
diff changeset
446 "filter" "float" "getattr" "globals" "hasattr"
acbc7563a8e7 Sync with python-mode project. Adds two changes:
Skip Montanaro <skip@pobox.com>
parents: 30034
diff changeset
447 "hash" "hex" "id" "input" "int" "intern"
acbc7563a8e7 Sync with python-mode project. Adds two changes:
Skip Montanaro <skip@pobox.com>
parents: 30034
diff changeset
448 "isinstance" "issubclass" "iter" "len" "license"
acbc7563a8e7 Sync with python-mode project. Adds two changes:
Skip Montanaro <skip@pobox.com>
parents: 30034
diff changeset
449 "list" "locals" "long" "map" "max" "min" "object"
acbc7563a8e7 Sync with python-mode project. Adds two changes:
Skip Montanaro <skip@pobox.com>
parents: 30034
diff changeset
450 "oct" "open" "ord" "pow" "property" "range"
acbc7563a8e7 Sync with python-mode project. Adds two changes:
Skip Montanaro <skip@pobox.com>
parents: 30034
diff changeset
451 "raw_input" "reduce" "reload" "repr" "round"
acbc7563a8e7 Sync with python-mode project. Adds two changes:
Skip Montanaro <skip@pobox.com>
parents: 30034
diff changeset
452 "setattr" "slice" "staticmethod" "str" "sum"
acbc7563a8e7 Sync with python-mode project. Adds two changes:
Skip Montanaro <skip@pobox.com>
parents: 30034
diff changeset
453 "super" "tuple" "type" "unichr" "unicode" "vars"
acbc7563a8e7 Sync with python-mode project. Adds two changes:
Skip Montanaro <skip@pobox.com>
parents: 30034
diff changeset
454 "xrange" "zip")
acbc7563a8e7 Sync with python-mode project. Adds two changes:
Skip Montanaro <skip@pobox.com>
parents: 30034
diff changeset
455 "\\|"))
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
456 (kw4 (mapconcat 'identity
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
457 ;; Exceptions and warnings
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
458 '("ArithmeticError" "AssertionError"
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
459 "AttributeError" "DeprecationWarning" "EOFError"
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
460 "EnvironmentError" "Exception"
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
461 "FloatingPointError" "FutureWarning" "IOError"
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
462 "ImportError" "IndentationError" "IndexError"
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
463 "KeyError" "KeyboardInterrupt" "LookupError"
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
464 "MemoryError" "NameError" "NotImplemented"
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
465 "NotImplementedError" "OSError" "OverflowError"
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
466 "OverflowWarning" "PendingDeprecationWarning"
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
467 "ReferenceError" "RuntimeError" "RuntimeWarning"
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
468 "StandardError" "StopIteration" "SyntaxError"
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
469 "SyntaxWarning" "SystemError" "SystemExit"
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
470 "TabError" "TypeError" "UnboundLocalError"
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
471 "UnicodeDecodeError" "UnicodeEncodeError"
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
472 "UnicodeError" "UnicodeTranslateError"
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
473 "UserWarning" "ValueError" "Warning"
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
474 "ZeroDivisionError")
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
475 "\\|"))
6564
812aad8c05c2 (python-font-lock-keywords): Pick up block introducing keywords with
Barry Warsaw <barry@python.org>
parents: 6563
diff changeset
476 )
3427
af5ff5231d4a (python-font-lock-keywords): Much improved descrimination between
Barry Warsaw <barry@python.org>
parents: 3426
diff changeset
477 (list
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
478 '("^[ \t]*\\(@.+\\)" 1 'py-decorators-face)
6563
2aa13c0c8f2f (python-font-lock-keywords): Fix for consecutive keyword font locking,
Barry Warsaw <barry@python.org>
parents: 6562
diff changeset
479 ;; keywords
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
480 (cons (concat "\\<\\(" kw1 "\\)\\>[ \n\t(]") 1)
31236
acbc7563a8e7 Sync with python-mode project. Adds two changes:
Skip Montanaro <skip@pobox.com>
parents: 30034
diff changeset
481 ;; builtins when they don't appear as object attributes
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
482 (list (concat "\\([^. \t]\\|^\\)[ \t]*\\<\\(" kw3 "\\)\\>[ \n\t(]") 2
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
483 'py-builtins-face)
6564
812aad8c05c2 (python-font-lock-keywords): Pick up block introducing keywords with
Barry Warsaw <barry@python.org>
parents: 6563
diff changeset
484 ;; block introducing keywords with immediately following colons.
812aad8c05c2 (python-font-lock-keywords): Pick up block introducing keywords with
Barry Warsaw <barry@python.org>
parents: 6563
diff changeset
485 ;; Yes "except" is in both lists.
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
486 (cons (concat "\\<\\(" kw2 "\\)[ \n\t(]") 1)
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
487 ;; Exceptions
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
488 (list (concat "\\<\\(" kw4 "\\)[ \n\t:,(]") 1 'py-builtins-face)
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
489 ;; `as' but only in "import foo as bar" or "with foo as bar"
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
490 '("[ \t]*\\(\\<from\\>.*\\)?\\<import\\>.*\\<\\(as\\)\\>" . 2)
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
491 '("[ \t]*\\<with\\>.*\\<\\(as\\)\\>" . 1)
3427
af5ff5231d4a (python-font-lock-keywords): Much improved descrimination between
Barry Warsaw <barry@python.org>
parents: 3426
diff changeset
492 ;; classes
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
493 '("\\<class[ \t]+\\([a-zA-Z_]+[a-zA-Z0-9_]*\\)" 1 font-lock-type-face)
3427
af5ff5231d4a (python-font-lock-keywords): Much improved descrimination between
Barry Warsaw <barry@python.org>
parents: 3426
diff changeset
494 ;; functions
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
495 '("\\<def[ \t]+\\([a-zA-Z_]+[a-zA-Z0-9_]*\\)"
3427
af5ff5231d4a (python-font-lock-keywords): Much improved descrimination between
Barry Warsaw <barry@python.org>
parents: 3426
diff changeset
496 1 font-lock-function-name-face)
23229
2b47d0dcfa66 Some contributions and ideas by Alexander Schmolck: add a keybinding
Barry Warsaw <barry@python.org>
parents: 23224
diff changeset
497 ;; pseudo-keywords
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
498 '("\\<\\(self\\|None\\|True\\|False\\|Ellipsis\\)\\>"
23229
2b47d0dcfa66 Some contributions and ideas by Alexander Schmolck: add a keybinding
Barry Warsaw <barry@python.org>
parents: 23224
diff changeset
499 1 py-pseudo-keyword-face)
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
500 ;; XXX, TODO, and FIXME tags
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
501 '("XXX\\|TODO\\|FIXME" 0 py-XXX-tag-face t)
3427
af5ff5231d4a (python-font-lock-keywords): Much improved descrimination between
Barry Warsaw <barry@python.org>
parents: 3426
diff changeset
502 ))
3436
db9f6ede58a7 (python-font-lock-keywords): make it a defconst
Barry Warsaw <barry@python.org>
parents: 3434
diff changeset
503 "Additional expressions to highlight in Python mode.")
5150
4665e2849a4a (python-font-lock-keywords): Use new convention for installing in mode
Barry Warsaw <barry@python.org>
parents: 5075
diff changeset
504 (put 'python-mode 'font-lock-defaults '(python-font-lock-keywords))
4665e2849a4a (python-font-lock-keywords): Use new convention for installing in mode
Barry Warsaw <barry@python.org>
parents: 5075
diff changeset
505
6668
98552704b88f (python-mode): Patch to fix Imenu support under Emacs, given by
Barry Warsaw <barry@python.org>
parents: 6667
diff changeset
506 ;; have to bind py-file-queue before installing the kill-emacs-hook
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
507 (defvar py-file-queue nil
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
508 "Queue of Python temp files awaiting execution.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
509 Currently-active file is at the head of the list.")
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
510
17416
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
511 (defvar py-pdbtrack-is-tracking-p nil)
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
512
23229
2b47d0dcfa66 Some contributions and ideas by Alexander Schmolck: add a keybinding
Barry Warsaw <barry@python.org>
parents: 23224
diff changeset
513 (defvar py-pychecker-history nil)
17416
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
514
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
515
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
516
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
517 ;; Constants
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
518
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
519 (defconst py-stringlit-re
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
520 (concat
8379
f5ebcc7a5ab2 (py-stringlit-re): Another ME patch to recognize SQTQs and DQTQs
Barry Warsaw <barry@python.org>
parents: 8378
diff changeset
521 ;; These fail if backslash-quote ends the string (not worth
f5ebcc7a5ab2 (py-stringlit-re): Another ME patch to recognize SQTQs and DQTQs
Barry Warsaw <barry@python.org>
parents: 8378
diff changeset
522 ;; fixing?). They precede the short versions so that the first two
f5ebcc7a5ab2 (py-stringlit-re): Another ME patch to recognize SQTQs and DQTQs
Barry Warsaw <barry@python.org>
parents: 8378
diff changeset
523 ;; quotes don't look like an empty short string.
f5ebcc7a5ab2 (py-stringlit-re): Another ME patch to recognize SQTQs and DQTQs
Barry Warsaw <barry@python.org>
parents: 8378
diff changeset
524 ;;
f5ebcc7a5ab2 (py-stringlit-re): Another ME patch to recognize SQTQs and DQTQs
Barry Warsaw <barry@python.org>
parents: 8378
diff changeset
525 ;; (maybe raw), long single quoted triple quoted strings (SQTQ),
f5ebcc7a5ab2 (py-stringlit-re): Another ME patch to recognize SQTQs and DQTQs
Barry Warsaw <barry@python.org>
parents: 8378
diff changeset
526 ;; with potential embedded single quotes
f5ebcc7a5ab2 (py-stringlit-re): Another ME patch to recognize SQTQs and DQTQs
Barry Warsaw <barry@python.org>
parents: 8378
diff changeset
527 "[rR]?'''[^']*\\(\\('[^']\\|''[^']\\)[^']*\\)*'''"
f5ebcc7a5ab2 (py-stringlit-re): Another ME patch to recognize SQTQs and DQTQs
Barry Warsaw <barry@python.org>
parents: 8378
diff changeset
528 "\\|"
f5ebcc7a5ab2 (py-stringlit-re): Another ME patch to recognize SQTQs and DQTQs
Barry Warsaw <barry@python.org>
parents: 8378
diff changeset
529 ;; (maybe raw), long double quoted triple quoted strings (DQTQ),
f5ebcc7a5ab2 (py-stringlit-re): Another ME patch to recognize SQTQs and DQTQs
Barry Warsaw <barry@python.org>
parents: 8378
diff changeset
530 ;; with potential embedded double quotes
f5ebcc7a5ab2 (py-stringlit-re): Another ME patch to recognize SQTQs and DQTQs
Barry Warsaw <barry@python.org>
parents: 8378
diff changeset
531 "[rR]?\"\"\"[^\"]*\\(\\(\"[^\"]\\|\"\"[^\"]\\)[^\"]*\\)*\"\"\""
f5ebcc7a5ab2 (py-stringlit-re): Another ME patch to recognize SQTQs and DQTQs
Barry Warsaw <barry@python.org>
parents: 8378
diff changeset
532 "\\|"
f5ebcc7a5ab2 (py-stringlit-re): Another ME patch to recognize SQTQs and DQTQs
Barry Warsaw <barry@python.org>
parents: 8378
diff changeset
533 "[rR]?'\\([^'\n\\]\\|\\\\.\\)*'" ; single-quoted
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
534 "\\|" ; or
8379
f5ebcc7a5ab2 (py-stringlit-re): Another ME patch to recognize SQTQs and DQTQs
Barry Warsaw <barry@python.org>
parents: 8378
diff changeset
535 "[rR]?\"\\([^\"\n\\]\\|\\\\.\\)*\"" ; double-quoted
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
536 )
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
537 "Regular expression matching a Python string literal.")
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
538
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
539 (defconst py-continued-re
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
540 ;; This is tricky because a trailing backslash does not mean
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
541 ;; continuation if it's in a comment
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
542 (concat
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
543 "\\(" "[^#'\"\n\\]" "\\|" py-stringlit-re "\\)*"
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
544 "\\\\$")
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
545 "Regular expression matching Python backslash continuation lines.")
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
546
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
547 (defconst py-blank-or-comment-re "[ \t]*\\($\\|#\\)"
8911
9a984276cc56 #Typos from previous checkin
Barry Warsaw <barry@python.org>
parents: 8910
diff changeset
548 "Regular expression matching a blank or comment line.")
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
549
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
550 (defconst py-outdent-re
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
551 (concat "\\(" (mapconcat 'identity
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
552 '("else:"
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
553 "except\\(\\s +.*\\)?:"
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
554 "finally:"
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
555 "elif\\s +.*:")
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
556 "\\|")
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
557 "\\)")
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
558 "Regular expression matching statements to be dedented one level.")
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
559
6544
d28932d676c8 Changes in preparation for integrating into the Python CVS tree.
Barry Warsaw <barry@python.org>
parents: 6232
diff changeset
560 (defconst py-block-closing-keywords-re
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
561 "\\(return\\|raise\\|break\\|continue\\|pass\\)"
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
562 "Regular expression matching keywords which typically close a block.")
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
563
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
564 (defconst py-no-outdent-re
6544
d28932d676c8 Changes in preparation for integrating into the Python CVS tree.
Barry Warsaw <barry@python.org>
parents: 6232
diff changeset
565 (concat
d28932d676c8 Changes in preparation for integrating into the Python CVS tree.
Barry Warsaw <barry@python.org>
parents: 6232
diff changeset
566 "\\("
d28932d676c8 Changes in preparation for integrating into the Python CVS tree.
Barry Warsaw <barry@python.org>
parents: 6232
diff changeset
567 (mapconcat 'identity
d28932d676c8 Changes in preparation for integrating into the Python CVS tree.
Barry Warsaw <barry@python.org>
parents: 6232
diff changeset
568 (list "try:"
d28932d676c8 Changes in preparation for integrating into the Python CVS tree.
Barry Warsaw <barry@python.org>
parents: 6232
diff changeset
569 "except\\(\\s +.*\\)?:"
d28932d676c8 Changes in preparation for integrating into the Python CVS tree.
Barry Warsaw <barry@python.org>
parents: 6232
diff changeset
570 "while\\s +.*:"
d28932d676c8 Changes in preparation for integrating into the Python CVS tree.
Barry Warsaw <barry@python.org>
parents: 6232
diff changeset
571 "for\\s +.*:"
d28932d676c8 Changes in preparation for integrating into the Python CVS tree.
Barry Warsaw <barry@python.org>
parents: 6232
diff changeset
572 "if\\s +.*:"
d28932d676c8 Changes in preparation for integrating into the Python CVS tree.
Barry Warsaw <barry@python.org>
parents: 6232
diff changeset
573 "elif\\s +.*:"
d28932d676c8 Changes in preparation for integrating into the Python CVS tree.
Barry Warsaw <barry@python.org>
parents: 6232
diff changeset
574 (concat py-block-closing-keywords-re "[ \t\n]")
d28932d676c8 Changes in preparation for integrating into the Python CVS tree.
Barry Warsaw <barry@python.org>
parents: 6232
diff changeset
575 )
d28932d676c8 Changes in preparation for integrating into the Python CVS tree.
Barry Warsaw <barry@python.org>
parents: 6232
diff changeset
576 "\\|")
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
577 "\\)")
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
578 "Regular expression matching lines not to dedent after.")
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
579
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
580 (defvar py-traceback-line-re
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
581 "[ \t]+File \"\\([^\"]+\\)\", line \\([0-9]+\\)"
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
582 "Regular expression that describes tracebacks.")
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
583
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
584 ;; pdbtrack constants
17416
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
585 (defconst py-pdbtrack-stack-entry-regexp
28139
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
586 ; "^> \\([^(]+\\)(\\([0-9]+\\))\\([?a-zA-Z0-9_]+\\)()"
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
587 "^> \\(.*\\)(\\([0-9]+\\))\\([?a-zA-Z0-9_]+\\)()"
17416
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
588 "Regular expression pdbtrack uses to find a stack trace entry.")
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
589
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
590 (defconst py-pdbtrack-input-prompt "\n[(<]*[Pp]db[>)]+ "
17416
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
591 "Regular expression pdbtrack uses to recognize a pdb prompt.")
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
592
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
593 (defconst py-pdbtrack-track-range 10000
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
594 "Max number of characters from end of buffer to search for stack entry.")
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
595
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
596
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
597
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
598 ;; Major mode boilerplate
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
599
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
600 ;; define a mode-specific abbrev table for those who use such things
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
601 (defvar python-mode-abbrev-table nil
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
602 "Abbrev table in use in `python-mode' buffers.")
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
603 (define-abbrev-table 'python-mode-abbrev-table nil)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
604
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
605 (defvar python-mode-hook nil
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
606 "*Hook called by `python-mode'.")
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
607
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
608 (make-obsolete-variable 'jpython-mode-hook 'jython-mode-hook)
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
609 (defvar jython-mode-hook nil
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
610 "*Hook called by `jython-mode'. `jython-mode' also calls
23277
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
611 `python-mode-hook'.")
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
612
23270
f970588e89b1 (py-shell-hook): A new hook variable, run at the end of py-shell.
Barry Warsaw <barry@python.org>
parents: 23230
diff changeset
613 (defvar py-shell-hook nil
f970588e89b1 (py-shell-hook): A new hook variable, run at the end of py-shell.
Barry Warsaw <barry@python.org>
parents: 23230
diff changeset
614 "*Hook called by `py-shell'.")
f970588e89b1 (py-shell-hook): A new hook variable, run at the end of py-shell.
Barry Warsaw <barry@python.org>
parents: 23230
diff changeset
615
8370
f2b0859fece3 #Documentation and comment typos patch given by Michael Ernst. More
Barry Warsaw <barry@python.org>
parents: 8070
diff changeset
616 ;; In previous version of python-mode.el, the hook was incorrectly
f2b0859fece3 #Documentation and comment typos patch given by Michael Ernst. More
Barry Warsaw <barry@python.org>
parents: 8070
diff changeset
617 ;; called py-mode-hook, and was not defvar'd. Deprecate its use.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
618 (and (fboundp 'make-obsolete-variable)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
619 (make-obsolete-variable 'py-mode-hook 'python-mode-hook))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
620
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
621 (defvar py-mode-map ()
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
622 "Keymap used in `python-mode' buffers.")
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
623 (if py-mode-map
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
624 nil
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
625 (setq py-mode-map (make-sparse-keymap))
6556
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
626 ;; electric keys
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
627 (define-key py-mode-map ":" 'py-electric-colon)
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
628 ;; indentation level modifiers
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
629 (define-key py-mode-map "\C-c\C-l" 'py-shift-region-left)
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
630 (define-key py-mode-map "\C-c\C-r" 'py-shift-region-right)
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
631 (define-key py-mode-map "\C-c<" 'py-shift-region-left)
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
632 (define-key py-mode-map "\C-c>" 'py-shift-region-right)
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
633 ;; subprocess commands
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
634 (define-key py-mode-map "\C-c\C-c" 'py-execute-buffer)
8378
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
635 (define-key py-mode-map "\C-c\C-m" 'py-execute-import-or-reload)
8380
cd2dfed0c44b (py-execute-string): Bind to C-c C-s, and put on menu
Barry Warsaw <barry@python.org>
parents: 8379
diff changeset
636 (define-key py-mode-map "\C-c\C-s" 'py-execute-string)
6556
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
637 (define-key py-mode-map "\C-c|" 'py-execute-region)
8378
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
638 (define-key py-mode-map "\e\C-x" 'py-execute-def-or-class)
6556
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
639 (define-key py-mode-map "\C-c!" 'py-shell)
7950
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
640 (define-key py-mode-map "\C-c\C-t" 'py-toggle-shells)
6556
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
641 ;; Caution! Enter here at your own risk. We are trying to support
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
642 ;; several behaviors and it gets disgusting. :-( This logic ripped
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
643 ;; largely from CC Mode.
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
644 ;;
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
645 ;; In XEmacs 19, Emacs 19, and Emacs 20, we use this to bind
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
646 ;; backwards deletion behavior to DEL, which both Delete and
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
647 ;; Backspace get translated to. There's no way to separate this
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
648 ;; behavior in a clean way, so deal with it! Besides, it's been
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
649 ;; this way since the dawn of time.
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
650 (if (not (boundp 'delete-key-deletes-forward))
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
651 (define-key py-mode-map "\177" 'py-electric-backspace)
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
652 ;; However, XEmacs 20 actually achieved enlightenment. It is
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
653 ;; possible to sanely define both backward and forward deletion
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
654 ;; behavior under X separately (TTYs are forever beyond hope, but
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
655 ;; who cares? XEmacs 20 does the right thing with these too).
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
656 (define-key py-mode-map [delete] 'py-electric-delete)
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
657 (define-key py-mode-map [backspace] 'py-electric-backspace))
6677
e45b83708d9e (py-mode-map): Bind py-mark-def-or-class to C-M-h with a different
Barry Warsaw <barry@python.org>
parents: 6670
diff changeset
658 ;; Separate M-BS from C-M-h. The former should remain
e45b83708d9e (py-mode-map): Bind py-mark-def-or-class to C-M-h with a different
Barry Warsaw <barry@python.org>
parents: 6670
diff changeset
659 ;; backward-kill-word.
e45b83708d9e (py-mode-map): Bind py-mark-def-or-class to C-M-h with a different
Barry Warsaw <barry@python.org>
parents: 6670
diff changeset
660 (define-key py-mode-map [(control meta h)] 'py-mark-def-or-class)
6559
1a233be5fc17 (mark-python-def-or-class): Renamed to py-mark-def-or-class globally.
Barry Warsaw <barry@python.org>
parents: 6556
diff changeset
661 (define-key py-mode-map "\C-c\C-k" 'py-mark-block)
6556
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
662 ;; Miscellaneous
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
663 (define-key py-mode-map "\C-c:" 'py-guess-indent-offset)
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
664 (define-key py-mode-map "\C-c\t" 'py-indent-region)
17416
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
665 (define-key py-mode-map "\C-c\C-d" 'py-pdbtrack-toggle-stack-tracking)
6556
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
666 (define-key py-mode-map "\C-c\C-n" 'py-next-statement)
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
667 (define-key py-mode-map "\C-c\C-p" 'py-previous-statement)
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
668 (define-key py-mode-map "\C-c\C-u" 'py-goto-block-up)
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
669 (define-key py-mode-map "\C-c#" 'py-comment-region)
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
670 (define-key py-mode-map "\C-c?" 'py-describe-mode)
23224
ed5d75912d60 Skip Montanaro's contribution (slightly mod'd by Barry) to provide a
Barry Warsaw <barry@python.org>
parents: 23223
diff changeset
671 (define-key py-mode-map "\C-c\C-h" 'py-help-at-point)
8377
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
672 (define-key py-mode-map "\e\C-a" 'py-beginning-of-def-or-class)
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
673 (define-key py-mode-map "\e\C-e" 'py-end-of-def-or-class)
6663
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
674 (define-key py-mode-map "\C-c-" 'py-up-exception)
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
675 (define-key py-mode-map "\C-c=" 'py-down-exception)
9905
6cf01eab05a3 (py-narrow-to-defun): New command (bound to C-x n d) which mimics the
Barry Warsaw <barry@python.org>
parents: 9897
diff changeset
676 ;; stuff that is `standard' but doesn't interface well with
6cf01eab05a3 (py-narrow-to-defun): New command (bound to C-x n d) which mimics the
Barry Warsaw <barry@python.org>
parents: 9897
diff changeset
677 ;; python-mode, which forces us to rebind to special commands
6cf01eab05a3 (py-narrow-to-defun): New command (bound to C-x n d) which mimics the
Barry Warsaw <barry@python.org>
parents: 9897
diff changeset
678 (define-key py-mode-map "\C-xnd" 'py-narrow-to-defun)
6556
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
679 ;; information
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
680 (define-key py-mode-map "\C-c\C-b" 'py-submit-bug-report)
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
681 (define-key py-mode-map "\C-c\C-v" 'py-version)
23229
2b47d0dcfa66 Some contributions and ideas by Alexander Schmolck: add a keybinding
Barry Warsaw <barry@python.org>
parents: 23224
diff changeset
682 (define-key py-mode-map "\C-c\C-w" 'py-pychecker-run)
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
683 ;; shadow global bindings for newline-and-indent w/ the py- version.
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
684 ;; BAW - this is extremely bad form, but I'm not going to change it
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
685 ;; for now.
6663
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
686 (mapcar #'(lambda (key)
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
687 (define-key py-mode-map key 'py-newline-and-indent))
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
688 (where-is-internal 'newline-and-indent))
9927
35f568480764 (py-mode-map): Add back force of RET (aka C-m) to
Barry Warsaw <barry@python.org>
parents: 9906
diff changeset
689 ;; Force RET to be py-newline-and-indent even if it didn't get
35f568480764 (py-mode-map): Add back force of RET (aka C-m) to
Barry Warsaw <barry@python.org>
parents: 9906
diff changeset
690 ;; mapped by the above code. motivation: Emacs' default binding for
35f568480764 (py-mode-map): Add back force of RET (aka C-m) to
Barry Warsaw <barry@python.org>
parents: 9906
diff changeset
691 ;; RET is `newline' and C-j is `newline-and-indent'. Most Pythoneers
35f568480764 (py-mode-map): Add back force of RET (aka C-m) to
Barry Warsaw <barry@python.org>
parents: 9906
diff changeset
692 ;; expect RET to do a `py-newline-and-indent' and any Emacsers who
35f568480764 (py-mode-map): Add back force of RET (aka C-m) to
Barry Warsaw <barry@python.org>
parents: 9906
diff changeset
693 ;; dislike this are probably knowledgeable enough to do a rebind.
35f568480764 (py-mode-map): Add back force of RET (aka C-m) to
Barry Warsaw <barry@python.org>
parents: 9906
diff changeset
694 ;; However, we do *not* change C-j since many Emacsers have already
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
695 ;; swapped RET and C-j and they don't want C-j bound to `newline' to
9927
35f568480764 (py-mode-map): Add back force of RET (aka C-m) to
Barry Warsaw <barry@python.org>
parents: 9906
diff changeset
696 ;; change.
35f568480764 (py-mode-map): Add back force of RET (aka C-m) to
Barry Warsaw <barry@python.org>
parents: 9906
diff changeset
697 (define-key py-mode-map "\C-m" 'py-newline-and-indent)
6663
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
698 )
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
699
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
700 (defvar py-mode-output-map nil
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
701 "Keymap used in *Python Output* buffers.")
6663
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
702 (if py-mode-output-map
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
703 nil
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
704 (setq py-mode-output-map (make-sparse-keymap))
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
705 (define-key py-mode-output-map [button2] 'py-mouseto-exception)
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
706 (define-key py-mode-output-map "\C-c\C-c" 'py-goto-exception)
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
707 ;; TBD: Disable all self-inserting keys. This is bogus, we should
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
708 ;; really implement this as *Python Output* buffer being read-only
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
709 (mapcar #' (lambda (key)
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
710 (define-key py-mode-output-map key
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
711 #'(lambda () (interactive) (beep))))
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
712 (where-is-internal 'self-insert-command))
2495
718c65d0e12d (py-mode-map): py-mark-block moved to C-c C-m (was C-c C-b).
Barry Warsaw <barry@python.org>
parents: 2493
diff changeset
713 )
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
714
9027
d53237bcf15f (py-shell-map): New variable contains the keymap used in *Python*
Barry Warsaw <barry@python.org>
parents: 9026
diff changeset
715 (defvar py-shell-map nil
d53237bcf15f (py-shell-map): New variable contains the keymap used in *Python*
Barry Warsaw <barry@python.org>
parents: 9026
diff changeset
716 "Keymap used in *Python* shell buffers.")
d53237bcf15f (py-shell-map): New variable contains the keymap used in *Python*
Barry Warsaw <barry@python.org>
parents: 9026
diff changeset
717 (if py-shell-map
d53237bcf15f (py-shell-map): New variable contains the keymap used in *Python*
Barry Warsaw <barry@python.org>
parents: 9026
diff changeset
718 nil
d53237bcf15f (py-shell-map): New variable contains the keymap used in *Python*
Barry Warsaw <barry@python.org>
parents: 9026
diff changeset
719 (setq py-shell-map (copy-keymap comint-mode-map))
d53237bcf15f (py-shell-map): New variable contains the keymap used in *Python*
Barry Warsaw <barry@python.org>
parents: 9026
diff changeset
720 (define-key py-shell-map [tab] 'tab-to-tab-stop)
d53237bcf15f (py-shell-map): New variable contains the keymap used in *Python*
Barry Warsaw <barry@python.org>
parents: 9026
diff changeset
721 (define-key py-shell-map "\C-c-" 'py-up-exception)
d53237bcf15f (py-shell-map): New variable contains the keymap used in *Python*
Barry Warsaw <barry@python.org>
parents: 9026
diff changeset
722 (define-key py-shell-map "\C-c=" 'py-down-exception)
d53237bcf15f (py-shell-map): New variable contains the keymap used in *Python*
Barry Warsaw <barry@python.org>
parents: 9026
diff changeset
723 )
d53237bcf15f (py-shell-map): New variable contains the keymap used in *Python*
Barry Warsaw <barry@python.org>
parents: 9026
diff changeset
724
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
725 (defvar py-mode-syntax-table nil
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
726 "Syntax table used in `python-mode' buffers.")
23224
ed5d75912d60 Skip Montanaro's contribution (slightly mod'd by Barry) to provide a
Barry Warsaw <barry@python.org>
parents: 23223
diff changeset
727 (when (not py-mode-syntax-table)
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
728 (setq py-mode-syntax-table (make-syntax-table))
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
729 (modify-syntax-entry ?\( "()" py-mode-syntax-table)
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
730 (modify-syntax-entry ?\) ")(" py-mode-syntax-table)
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
731 (modify-syntax-entry ?\[ "(]" py-mode-syntax-table)
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
732 (modify-syntax-entry ?\] ")[" py-mode-syntax-table)
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
733 (modify-syntax-entry ?\{ "(}" py-mode-syntax-table)
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
734 (modify-syntax-entry ?\} "){" py-mode-syntax-table)
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
735 ;; Add operator symbols misassigned in the std table
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
736 (modify-syntax-entry ?\$ "." py-mode-syntax-table)
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
737 (modify-syntax-entry ?\% "." py-mode-syntax-table)
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
738 (modify-syntax-entry ?\& "." py-mode-syntax-table)
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
739 (modify-syntax-entry ?\* "." py-mode-syntax-table)
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
740 (modify-syntax-entry ?\+ "." py-mode-syntax-table)
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
741 (modify-syntax-entry ?\- "." py-mode-syntax-table)
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
742 (modify-syntax-entry ?\/ "." py-mode-syntax-table)
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
743 (modify-syntax-entry ?\< "." py-mode-syntax-table)
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
744 (modify-syntax-entry ?\= "." py-mode-syntax-table)
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
745 (modify-syntax-entry ?\> "." py-mode-syntax-table)
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
746 (modify-syntax-entry ?\| "." py-mode-syntax-table)
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
747 ;; For historical reasons, underscore is word class instead of
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
748 ;; symbol class. GNU conventions say it should be symbol class, but
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
749 ;; there's a natural conflict between what major mode authors want
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
750 ;; and what users expect from `forward-word' and `backward-word'.
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
751 ;; Guido and I have hashed this out and have decided to keep
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
752 ;; underscore in word class. If you're tempted to change it, try
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
753 ;; binding M-f and M-b to py-forward-into-nomenclature and
10207
29d1d3b08ca7 (py-default-interpreter): New variable which selects whether CPython
Barry Warsaw <barry@python.org>
parents: 9927
diff changeset
754 ;; py-backward-into-nomenclature instead. This doesn't help in all
29d1d3b08ca7 (py-default-interpreter): New variable which selects whether CPython
Barry Warsaw <barry@python.org>
parents: 9927
diff changeset
755 ;; situations where you'd want the different behavior
29d1d3b08ca7 (py-default-interpreter): New variable which selects whether CPython
Barry Warsaw <barry@python.org>
parents: 9927
diff changeset
756 ;; (e.g. backward-kill-word).
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
757 (modify-syntax-entry ?\_ "w" py-mode-syntax-table)
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
758 ;; Both single quote and double quote are string delimiters
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
759 (modify-syntax-entry ?\' "\"" py-mode-syntax-table)
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
760 (modify-syntax-entry ?\" "\"" py-mode-syntax-table)
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
761 ;; backquote is open and close paren
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
762 (modify-syntax-entry ?\` "$" py-mode-syntax-table)
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
763 ;; comment delimiters
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
764 (modify-syntax-entry ?\# "<" py-mode-syntax-table)
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
765 (modify-syntax-entry ?\n ">" py-mode-syntax-table)
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
766 )
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
767
23224
ed5d75912d60 Skip Montanaro's contribution (slightly mod'd by Barry) to provide a
Barry Warsaw <barry@python.org>
parents: 23223
diff changeset
768 ;; An auxiliary syntax table which places underscore and dot in the
ed5d75912d60 Skip Montanaro's contribution (slightly mod'd by Barry) to provide a
Barry Warsaw <barry@python.org>
parents: 23223
diff changeset
769 ;; symbol class for simplicity
ed5d75912d60 Skip Montanaro's contribution (slightly mod'd by Barry) to provide a
Barry Warsaw <barry@python.org>
parents: 23223
diff changeset
770 (defvar py-dotted-expression-syntax-table nil
ed5d75912d60 Skip Montanaro's contribution (slightly mod'd by Barry) to provide a
Barry Warsaw <barry@python.org>
parents: 23223
diff changeset
771 "Syntax table used to identify Python dotted expressions.")
ed5d75912d60 Skip Montanaro's contribution (slightly mod'd by Barry) to provide a
Barry Warsaw <barry@python.org>
parents: 23223
diff changeset
772 (when (not py-dotted-expression-syntax-table)
ed5d75912d60 Skip Montanaro's contribution (slightly mod'd by Barry) to provide a
Barry Warsaw <barry@python.org>
parents: 23223
diff changeset
773 (setq py-dotted-expression-syntax-table
ed5d75912d60 Skip Montanaro's contribution (slightly mod'd by Barry) to provide a
Barry Warsaw <barry@python.org>
parents: 23223
diff changeset
774 (copy-syntax-table py-mode-syntax-table))
ed5d75912d60 Skip Montanaro's contribution (slightly mod'd by Barry) to provide a
Barry Warsaw <barry@python.org>
parents: 23223
diff changeset
775 (modify-syntax-entry ?_ "_" py-dotted-expression-syntax-table)
ed5d75912d60 Skip Montanaro's contribution (slightly mod'd by Barry) to provide a
Barry Warsaw <barry@python.org>
parents: 23223
diff changeset
776 (modify-syntax-entry ?. "_" py-dotted-expression-syntax-table))
ed5d75912d60 Skip Montanaro's contribution (slightly mod'd by Barry) to provide a
Barry Warsaw <barry@python.org>
parents: 23223
diff changeset
777
4195
e3f6ada28ed0 I have been increasingly annoyed about the fact that
Barry Warsaw <barry@python.org>
parents: 4194
diff changeset
778
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
779
9106
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
780 ;; Utilities
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
781 (defmacro py-safe (&rest body)
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
782 "Safely execute BODY, return nil if an error occurred."
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
783 (` (condition-case nil
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
784 (progn (,@ body))
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
785 (error nil))))
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
786
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
787 (defsubst py-keep-region-active ()
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
788 "Keep the region active in XEmacs."
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
789 ;; Ignore byte-compiler warnings you might see. Also note that
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
790 ;; FSF's Emacs 19 does it differently; its policy doesn't require us
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
791 ;; to take explicit action.
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
792 (and (boundp 'zmacs-region-stays)
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
793 (setq zmacs-region-stays t)))
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
794
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
795 (defsubst py-point (position)
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
796 "Returns the value of point at certain commonly referenced POSITIONs.
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
797 POSITION can be one of the following symbols:
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
798
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
799 bol -- beginning of line
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
800 eol -- end of line
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
801 bod -- beginning of def or class
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
802 eod -- end of def or class
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
803 bob -- beginning of buffer
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
804 eob -- end of buffer
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
805 boi -- back to indentation
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
806 bos -- beginning of statement
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
807
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
808 This function does not modify point or mark."
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
809 (let ((here (point)))
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
810 (cond
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
811 ((eq position 'bol) (beginning-of-line))
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
812 ((eq position 'eol) (end-of-line))
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
813 ((eq position 'bod) (py-beginning-of-def-or-class 'either))
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
814 ((eq position 'eod) (py-end-of-def-or-class 'either))
9106
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
815 ;; Kind of funny, I know, but useful for py-up-exception.
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
816 ((eq position 'bob) (beginning-of-buffer))
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
817 ((eq position 'eob) (end-of-buffer))
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
818 ((eq position 'boi) (back-to-indentation))
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
819 ((eq position 'bos) (py-goto-initial-line))
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
820 (t (error "Unknown buffer position requested: %s" position))
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
821 )
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
822 (prog1
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
823 (point)
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
824 (goto-char here))))
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
825
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
826 (defsubst py-highlight-line (from to file line)
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
827 (cond
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
828 ((fboundp 'make-extent)
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
829 ;; XEmacs
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
830 (let ((e (make-extent from to)))
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
831 (set-extent-property e 'mouse-face 'highlight)
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
832 (set-extent-property e 'py-exc-info (cons file line))
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
833 (set-extent-property e 'keymap py-mode-output-map)))
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
834 (t
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
835 ;; Emacs -- Please port this!
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
836 )
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
837 ))
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
838
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
839 (defun py-in-literal (&optional lim)
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
840 "Return non-nil if point is in a Python literal (a comment or string).
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
841 Optional argument LIM indicates the beginning of the containing form,
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
842 i.e. the limit on how far back to scan."
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
843 ;; This is the version used for non-XEmacs, which has a nicer
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
844 ;; interface.
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
845 ;;
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
846 ;; WARNING: Watch out for infinite recursion.
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
847 (let* ((lim (or lim (py-point 'bod)))
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
848 (state (parse-partial-sexp lim (point))))
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
849 (cond
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
850 ((nth 3 state) 'string)
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
851 ((nth 4 state) 'comment)
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
852 (t nil))))
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
853
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
854 ;; XEmacs has a built-in function that should make this much quicker.
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
855 ;; In this case, lim is ignored
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
856 (defun py-fast-in-literal (&optional lim)
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
857 "Fast version of `py-in-literal', used only by XEmacs.
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
858 Optional LIM is ignored."
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
859 ;; don't have to worry about context == 'block-comment
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
860 (buffer-syntactic-context))
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
861
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
862 (if (fboundp 'buffer-syntactic-context)
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
863 (defalias 'py-in-literal 'py-fast-in-literal))
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
864
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
865
ce52e922fbb2 #Code rearranging to quiet byte-compiler
Barry Warsaw <barry@python.org>
parents: 9063
diff changeset
866
3818
3c5ca7727988 (python-mode): Added menu support, requires easymenu.
Barry Warsaw <barry@python.org>
parents: 3813
diff changeset
867 ;; Menu definitions, only relevent if you have the easymenu.el package
3c5ca7727988 (python-mode): Added menu support, requires easymenu.
Barry Warsaw <barry@python.org>
parents: 3813
diff changeset
868 ;; (standard in the latest Emacs 19 and XEmacs 19 distributions).
3938
61b4cae77f7e (py-menu): Create default value
Barry Warsaw <barry@python.org>
parents: 3937
diff changeset
869 (defvar py-menu nil
61b4cae77f7e (py-menu): Create default value
Barry Warsaw <barry@python.org>
parents: 3937
diff changeset
870 "Menu for Python Mode.
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
871 This menu will get created automatically if you have the `easymenu'
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
872 package. Note that the latest X/Emacs releases contain this package.")
3938
61b4cae77f7e (py-menu): Create default value
Barry Warsaw <barry@python.org>
parents: 3937
diff changeset
873
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
874 (and (py-safe (require 'easymenu) t)
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
875 (easy-menu-define
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
876 py-menu py-mode-map "Python Mode menu"
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
877 '("Python"
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
878 ["Comment Out Region" py-comment-region (mark)]
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
879 ["Uncomment Region" (py-comment-region (point) (mark) '(4)) (mark)]
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
880 "-"
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
881 ["Mark current block" py-mark-block t]
6559
1a233be5fc17 (mark-python-def-or-class): Renamed to py-mark-def-or-class globally.
Barry Warsaw <barry@python.org>
parents: 6556
diff changeset
882 ["Mark current def" py-mark-def-or-class t]
1a233be5fc17 (mark-python-def-or-class): Renamed to py-mark-def-or-class globally.
Barry Warsaw <barry@python.org>
parents: 6556
diff changeset
883 ["Mark current class" (py-mark-def-or-class t) t]
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
884 "-"
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
885 ["Shift region left" py-shift-region-left (mark)]
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
886 ["Shift region right" py-shift-region-right (mark)]
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
887 "-"
8378
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
888 ["Import/reload file" py-execute-import-or-reload t]
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
889 ["Execute buffer" py-execute-buffer t]
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
890 ["Execute region" py-execute-region (mark)]
8378
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
891 ["Execute def or class" py-execute-def-or-class (mark)]
8380
cd2dfed0c44b (py-execute-string): Bind to C-c C-s, and put on menu
Barry Warsaw <barry@python.org>
parents: 8379
diff changeset
892 ["Execute string" py-execute-string t]
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
893 ["Start interpreter..." py-shell t]
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
894 "-"
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
895 ["Go to start of block" py-goto-block-up t]
8377
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
896 ["Go to start of class" (py-beginning-of-def-or-class t) t]
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
897 ["Move to end of class" (py-end-of-def-or-class t) t]
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
898 ["Move to start of def" py-beginning-of-def-or-class t]
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
899 ["Move to end of def" py-end-of-def-or-class t]
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
900 "-"
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
901 ["Describe mode" py-describe-mode t]
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
902 )))
3818
3c5ca7727988 (python-mode): Added menu support, requires easymenu.
Barry Warsaw <barry@python.org>
parents: 3813
diff changeset
903
3924
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
904
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
905
9457
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
906 ;; Imenu definitions
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
907 (defvar py-imenu-class-regexp
3924
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
908 (concat ; <<classes>>
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
909 "\\(" ;
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
910 "^[ \t]*" ; newline and maybe whitespace
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
911 "\\(class[ \t]+[a-zA-Z0-9_]+\\)" ; class name
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
912 ; possibly multiple superclasses
7878
ac2d1c1f1971 (imenu-example--python-class-regexp): Fix to recognize Module.Class in
Barry Warsaw <barry@python.org>
parents: 7796
diff changeset
913 "\\([ \t]*\\((\\([a-zA-Z0-9_,. \t\n]\\)*)\\)?\\)"
3924
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
914 "[ \t]*:" ; and the final :
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
915 "\\)" ; >>classes<<
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
916 )
9457
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
917 "Regexp for Python classes for use with the Imenu package."
3924
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
918 )
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
919
9457
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
920 (defvar py-imenu-method-regexp
3924
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
921 (concat ; <<methods and functions>>
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
922 "\\(" ;
3924
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
923 "^[ \t]*" ; new line and maybe whitespace
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
924 "\\(def[ \t]+" ; function definitions start with def
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
925 "\\([a-zA-Z0-9_]+\\)" ; name is here
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
926 ; function arguments...
9458
e7d984f266cc (py-imenu-method-regexp): Fix suggested by Daniel Calvelo to
Barry Warsaw <barry@python.org>
parents: 9457
diff changeset
927 ;; "[ \t]*(\\([-+/a-zA-Z0-9_=,\* \t\n.()\"'#]*\\))"
e7d984f266cc (py-imenu-method-regexp): Fix suggested by Daniel Calvelo to
Barry Warsaw <barry@python.org>
parents: 9457
diff changeset
928 "[ \t]*(\\([^:#]*\\))"
3924
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
929 "\\)" ; end of def
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
930 "[ \t]*:" ; and then the :
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
931 "\\)" ; >>methods and functions<<
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
932 )
9457
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
933 "Regexp for Python methods/functions for use with the Imenu package."
3924
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
934 )
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
935
9457
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
936 (defvar py-imenu-method-no-arg-parens '(2 8)
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
937 "Indices into groups of the Python regexp for use with Imenu.
3924
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
938
9457
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
939 Using these values will result in smaller Imenu lists, as arguments to
3924
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
940 functions are not listed.
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
941
9457
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
942 See the variable `py-imenu-show-method-args-p' for more
3924
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
943 information.")
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
944
9457
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
945 (defvar py-imenu-method-arg-parens '(2 7)
9454
e5996279f58c #Fixed some typos in docstrings.
Barry Warsaw <barry@python.org>
parents: 9144
diff changeset
946 "Indices into groups of the Python regexp for use with imenu.
9457
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
947 Using these values will result in large Imenu lists, as arguments to
3924
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
948 functions are listed.
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
949
9457
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
950 See the variable `py-imenu-show-method-args-p' for more
3924
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
951 information.")
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
952
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
953 ;; Note that in this format, this variable can still be used with the
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
954 ;; imenu--generic-function. Otherwise, there is no real reason to have
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
955 ;; it.
9457
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
956 (defvar py-imenu-generic-expression
3924
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
957 (cons
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
958 (concat
9457
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
959 py-imenu-class-regexp
3924
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
960 "\\|" ; or...
9457
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
961 py-imenu-method-regexp
3924
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
962 )
9457
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
963 py-imenu-method-no-arg-parens)
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
964 "Generic Python expression which may be used directly with Imenu.
3924
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
965 Used by setting the variable `imenu-generic-expression' to this value.
9457
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
966 Also, see the function \\[py-imenu-create-index] for a better
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
967 alternative for finding the index.")
3924
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
968
9457
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
969 ;; These next two variables are used when searching for the Python
3924
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
970 ;; class/definitions. Just saving some time in accessing the
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
971 ;; generic-python-expression, really.
9457
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
972 (defvar py-imenu-generic-regexp nil)
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
973 (defvar py-imenu-generic-parens nil)
3924
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
974
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
975
9457
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
976 (defun py-imenu-create-index-function ()
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
977 "Python interface function for the Imenu package.
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
978 Finds all Python classes and functions/methods. Calls function
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
979 \\[py-imenu-create-index-engine]. See that function for the details
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
980 of how this works."
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
981 (setq py-imenu-generic-regexp (car py-imenu-generic-expression)
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
982 py-imenu-generic-parens (if py-imenu-show-method-args-p
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
983 py-imenu-method-arg-parens
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
984 py-imenu-method-no-arg-parens))
3924
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
985 (goto-char (point-min))
9458
e7d984f266cc (py-imenu-method-regexp): Fix suggested by Daniel Calvelo to
Barry Warsaw <barry@python.org>
parents: 9457
diff changeset
986 ;; Warning: When the buffer has no classes or functions, this will
e7d984f266cc (py-imenu-method-regexp): Fix suggested by Daniel Calvelo to
Barry Warsaw <barry@python.org>
parents: 9457
diff changeset
987 ;; return nil, which seems proper according to the Imenu API, but
e7d984f266cc (py-imenu-method-regexp): Fix suggested by Daniel Calvelo to
Barry Warsaw <barry@python.org>
parents: 9457
diff changeset
988 ;; causes an error in the XEmacs port of Imenu. Sigh.
9457
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
989 (py-imenu-create-index-engine nil))
3924
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
990
9457
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
991 (defun py-imenu-create-index-engine (&optional start-indent)
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
992 "Function for finding Imenu definitions in Python.
3924
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
993
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
994 Finds all definitions (classes, methods, or functions) in a Python
9457
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
995 file for the Imenu package.
3924
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
996
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
997 Returns a possibly nested alist of the form
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
998
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
999 (INDEX-NAME . INDEX-POSITION)
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1000
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1001 The second element of the alist may be an alist, producing a nested
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1002 list as in
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1003
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1004 (INDEX-NAME . INDEX-ALIST)
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1005
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1006 This function should not be called directly, as it calls itself
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1007 recursively and requires some setup. Rather this is the engine for
9457
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
1008 the function \\[py-imenu-create-index-function].
3924
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1009
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1010 It works recursively by looking for all definitions at the current
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1011 indention level. When it finds one, it adds it to the alist. If it
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1012 finds a definition at a greater indentation level, it removes the
8370
f2b0859fece3 #Documentation and comment typos patch given by Michael Ernst. More
Barry Warsaw <barry@python.org>
parents: 8070
diff changeset
1013 previous definition from the alist. In its place it adds all
3924
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1014 definitions found at the next indentation level. When it finds a
9457
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
1015 definition that is less indented then the current level, it returns
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
1016 the alist it has created thus far.
3924
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1017
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1018 The optional argument START-INDENT indicates the starting indentation
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1019 at which to continue looking for Python classes, methods, or
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1020 functions. If this is not supplied, the function uses the indentation
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1021 of the first definition found."
9457
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
1022 (let (index-alist
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
1023 sub-method-alist
3924
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1024 looking-p
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1025 def-name prev-name
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1026 cur-indent def-pos
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1027 (class-paren (first py-imenu-generic-parens))
9457
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
1028 (def-paren (second py-imenu-generic-parens)))
3924
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1029 (setq looking-p
9457
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
1030 (re-search-forward py-imenu-generic-regexp (point-max) t))
3924
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1031 (while looking-p
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1032 (save-excursion
9457
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
1033 ;; used to set def-name to this value but generic-extract-name
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
1034 ;; is new to imenu-1.14. this way it still works with
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
1035 ;; imenu-1.11
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
1036 ;;(imenu--generic-extract-name py-imenu-generic-parens))
3924
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1037 (let ((cur-paren (if (match-beginning class-paren)
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1038 class-paren def-paren)))
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1039 (setq def-name
6670
8e3ee3577d4e (python-mode): Make imenu-create-index-function buffer local.
Barry Warsaw <barry@python.org>
parents: 6669
diff changeset
1040 (buffer-substring-no-properties (match-beginning cur-paren)
9457
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
1041 (match-end cur-paren))))
9005
ec01fe9c2841 (imenu-example--create-python-index-engine): Fix nesting breakage when
Barry Warsaw <barry@python.org>
parents: 8925
diff changeset
1042 (save-match-data
9457
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
1043 (py-beginning-of-def-or-class 'either))
3924
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1044 (beginning-of-line)
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1045 (setq cur-indent (current-indentation)))
9457
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
1046 ;; HACK: want to go to the next correct definition location. We
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
1047 ;; explicitly list them here but it would be better to have them
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
1048 ;; in a list.
3924
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1049 (setq def-pos
9457
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
1050 (or (match-beginning class-paren)
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
1051 (match-beginning def-paren)))
3924
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1052 ;; if we don't have a starting indent level, take this one
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1053 (or start-indent
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1054 (setq start-indent cur-indent))
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1055 ;; if we don't have class name yet, take this one
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1056 (or prev-name
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1057 (setq prev-name def-name))
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1058 ;; what level is the next definition on? must be same, deeper
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1059 ;; or shallower indentation
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1060 (cond
24248
305422d69d31 (py-imenu-create-index-function): Skip over stuff that looks like code
Barry Warsaw <barry@python.org>
parents: 24246
diff changeset
1061 ;; Skip code in comments and strings
305422d69d31 (py-imenu-create-index-function): Skip over stuff that looks like code
Barry Warsaw <barry@python.org>
parents: 24246
diff changeset
1062 ((py-in-literal))
3924
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1063 ;; at the same indent level, add it to the list...
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1064 ((= start-indent cur-indent)
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1065 (push (cons def-name def-pos) index-alist))
9457
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
1066 ;; deeper indented expression, recurse
3924
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1067 ((< start-indent cur-indent)
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1068 ;; the point is currently on the expression we're supposed to
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1069 ;; start on, so go back to the last expression. The recursive
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1070 ;; call will find this place again and add it to the correct
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1071 ;; list
9457
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
1072 (re-search-backward py-imenu-generic-regexp (point-min) 'move)
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
1073 (setq sub-method-alist (py-imenu-create-index-engine cur-indent))
3924
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1074 (if sub-method-alist
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1075 ;; we put the last element on the index-alist on the start
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1076 ;; of the submethod alist so the user can still get to it.
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1077 (let ((save-elmt (pop index-alist)))
6670
8e3ee3577d4e (python-mode): Make imenu-create-index-function buffer local.
Barry Warsaw <barry@python.org>
parents: 6669
diff changeset
1078 (push (cons prev-name
3924
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1079 (cons save-elmt sub-method-alist))
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1080 index-alist))))
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1081 ;; found less indented expression, we're done.
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1082 (t
3924
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1083 (setq looking-p nil)
9457
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
1084 (re-search-backward py-imenu-generic-regexp (point-min) t)))
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
1085 ;; end-cond
3924
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1086 (setq prev-name def-name)
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1087 (and looking-p
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1088 (setq looking-p
9457
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
1089 (re-search-forward py-imenu-generic-regexp
3924
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1090 (point-max) 'move))))
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1091 (nreverse index-alist)))
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
1092
23277
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1093
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1094
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1095 (defun py-choose-shell-by-shebang ()
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1096 "Choose CPython or Jython mode by looking at #! on the first line.
23277
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1097 Returns the appropriate mode function.
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1098 Used by `py-choose-shell', and similar to but distinct from
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1099 `set-auto-mode', though it uses `auto-mode-interpreter-regexp' (if available)."
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1100 ;; look for an interpreter specified in the first line
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1101 ;; similar to set-auto-mode (files.el)
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1102 (let* ((re (if (boundp 'auto-mode-interpreter-regexp)
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1103 auto-mode-interpreter-regexp
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1104 ;; stolen from Emacs 21.2
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1105 "#![ \t]?\\([^ \t\n]*/bin/env[ \t]\\)?\\([^ \t\n]+\\)"))
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1106 (interpreter (save-excursion
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1107 (goto-char (point-min))
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1108 (if (looking-at re)
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1109 (match-string 2)
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1110 "")))
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1111 elt)
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1112 ;; Map interpreter name to a mode.
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1113 (setq elt (assoc (file-name-nondirectory interpreter)
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1114 py-shell-alist))
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1115 (and elt (caddr elt))))
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1116
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1117
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1118
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1119 (defun py-choose-shell-by-import ()
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1120 "Choose CPython or Jython mode based imports.
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1121 If a file imports any packages in `py-jython-packages', within
23277
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1122 `py-import-check-point-max' characters from the start of the file,
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1123 return `jython', otherwise return nil."
23277
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1124 (let (mode)
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1125 (save-excursion
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1126 (goto-char (point-min))
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1127 (while (and (not mode)
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1128 (search-forward-regexp
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1129 "^\\(\\(from\\)\\|\\(import\\)\\) \\([^ \t\n.]+\\)"
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1130 py-import-check-point-max t))
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1131 (setq mode (and (member (match-string 4) py-jython-packages)
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1132 'jython
23277
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1133 ))))
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1134 mode))
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1135
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1136
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1137 (defun py-choose-shell ()
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1138 "Choose CPython or Jython mode. Returns the appropriate mode function.
23277
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1139 This does the following:
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1140 - look for an interpreter with `py-choose-shell-by-shebang'
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1141 - examine imports using `py-choose-shell-by-import'
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1142 - default to the variable `py-default-interpreter'"
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1143 (interactive)
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1144 (or (py-choose-shell-by-shebang)
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1145 (py-choose-shell-by-import)
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1146 py-default-interpreter
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1147 ; 'cpython ;; don't use to py-default-interpreter, because default
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1148 ; ;; is only way to choose CPython
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1149 ))
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1150
3818
3c5ca7727988 (python-mode): Added menu support, requires easymenu.
Barry Warsaw <barry@python.org>
parents: 3813
diff changeset
1151
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
1152 ;;;###autoload
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1153 (defun python-mode ()
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1154 "Major mode for editing Python files.
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
1155 To submit a problem report, enter `\\[py-submit-bug-report]' from a
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
1156 `python-mode' buffer. Do `\\[py-describe-mode]' for detailed
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
1157 documentation. To see what version of `python-mode' you are running,
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
1158 enter `\\[py-version]'.
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
1159
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
1160 This mode knows about Python indentation, tokens, comments and
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
1161 continuation lines. Paragraphs are separated by blank lines only.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1162
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1163 COMMANDS
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1164 \\{py-mode-map}
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1165 VARIABLES
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1166
3818
3c5ca7727988 (python-mode): Added menu support, requires easymenu.
Barry Warsaw <barry@python.org>
parents: 3813
diff changeset
1167 py-indent-offset\t\tindentation increment
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1168 py-block-comment-prefix\t\tcomment string used by `comment-region'
3818
3c5ca7727988 (python-mode): Added menu support, requires easymenu.
Barry Warsaw <barry@python.org>
parents: 3813
diff changeset
1169 py-python-command\t\tshell command to invoke Python interpreter
3c5ca7727988 (python-mode): Added menu support, requires easymenu.
Barry Warsaw <barry@python.org>
parents: 3813
diff changeset
1170 py-temp-directory\t\tdirectory used for temp files (if needed)
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1171 py-beep-if-tab-change\t\tring the bell if `tab-width' is changed"
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1172 (interactive)
4192
d23f78730e00 (python-mode): font-lock-defaults must be make-local-variable'd
Barry Warsaw <barry@python.org>
parents: 4189
diff changeset
1173 ;; set up local variables
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1174 (kill-all-local-variables)
4192
d23f78730e00 (python-mode): font-lock-defaults must be make-local-variable'd
Barry Warsaw <barry@python.org>
parents: 4189
diff changeset
1175 (make-local-variable 'font-lock-defaults)
d23f78730e00 (python-mode): font-lock-defaults must be make-local-variable'd
Barry Warsaw <barry@python.org>
parents: 4189
diff changeset
1176 (make-local-variable 'paragraph-separate)
d23f78730e00 (python-mode): font-lock-defaults must be make-local-variable'd
Barry Warsaw <barry@python.org>
parents: 4189
diff changeset
1177 (make-local-variable 'paragraph-start)
d23f78730e00 (python-mode): font-lock-defaults must be make-local-variable'd
Barry Warsaw <barry@python.org>
parents: 4189
diff changeset
1178 (make-local-variable 'require-final-newline)
d23f78730e00 (python-mode): font-lock-defaults must be make-local-variable'd
Barry Warsaw <barry@python.org>
parents: 4189
diff changeset
1179 (make-local-variable 'comment-start)
4763
38689aceae7b (python-mode): added comment-end definitions.
Barry Warsaw <barry@python.org>
parents: 4508
diff changeset
1180 (make-local-variable 'comment-end)
4192
d23f78730e00 (python-mode): font-lock-defaults must be make-local-variable'd
Barry Warsaw <barry@python.org>
parents: 4189
diff changeset
1181 (make-local-variable 'comment-start-skip)
d23f78730e00 (python-mode): font-lock-defaults must be make-local-variable'd
Barry Warsaw <barry@python.org>
parents: 4189
diff changeset
1182 (make-local-variable 'comment-column)
8628
aea6841ab898 (py-comment-indent-function): A replacement for
Barry Warsaw <barry@python.org>
parents: 8381
diff changeset
1183 (make-local-variable 'comment-indent-function)
4192
d23f78730e00 (python-mode): font-lock-defaults must be make-local-variable'd
Barry Warsaw <barry@python.org>
parents: 4189
diff changeset
1184 (make-local-variable 'indent-region-function)
d23f78730e00 (python-mode): font-lock-defaults must be make-local-variable'd
Barry Warsaw <barry@python.org>
parents: 4189
diff changeset
1185 (make-local-variable 'indent-line-function)
4195
e3f6ada28ed0 I have been increasingly annoyed about the fact that
Barry Warsaw <barry@python.org>
parents: 4194
diff changeset
1186 (make-local-variable 'add-log-current-defun-function)
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1187 (make-local-variable 'fill-paragraph-function)
4192
d23f78730e00 (python-mode): font-lock-defaults must be make-local-variable'd
Barry Warsaw <barry@python.org>
parents: 4189
diff changeset
1188 ;;
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
1189 (set-syntax-table py-mode-syntax-table)
8628
aea6841ab898 (py-comment-indent-function): A replacement for
Barry Warsaw <barry@python.org>
parents: 8381
diff changeset
1190 (setq major-mode 'python-mode
aea6841ab898 (py-comment-indent-function): A replacement for
Barry Warsaw <barry@python.org>
parents: 8381
diff changeset
1191 mode-name "Python"
aea6841ab898 (py-comment-indent-function): A replacement for
Barry Warsaw <barry@python.org>
parents: 8381
diff changeset
1192 local-abbrev-table python-mode-abbrev-table
aea6841ab898 (py-comment-indent-function): A replacement for
Barry Warsaw <barry@python.org>
parents: 8381
diff changeset
1193 font-lock-defaults '(python-font-lock-keywords)
aea6841ab898 (py-comment-indent-function): A replacement for
Barry Warsaw <barry@python.org>
parents: 8381
diff changeset
1194 paragraph-separate "^[ \t]*$"
aea6841ab898 (py-comment-indent-function): A replacement for
Barry Warsaw <barry@python.org>
parents: 8381
diff changeset
1195 paragraph-start "^[ \t]*$"
aea6841ab898 (py-comment-indent-function): A replacement for
Barry Warsaw <barry@python.org>
parents: 8381
diff changeset
1196 require-final-newline t
aea6841ab898 (py-comment-indent-function): A replacement for
Barry Warsaw <barry@python.org>
parents: 8381
diff changeset
1197 comment-start "# "
aea6841ab898 (py-comment-indent-function): A replacement for
Barry Warsaw <barry@python.org>
parents: 8381
diff changeset
1198 comment-end ""
aea6841ab898 (py-comment-indent-function): A replacement for
Barry Warsaw <barry@python.org>
parents: 8381
diff changeset
1199 comment-start-skip "# *"
aea6841ab898 (py-comment-indent-function): A replacement for
Barry Warsaw <barry@python.org>
parents: 8381
diff changeset
1200 comment-column 40
aea6841ab898 (py-comment-indent-function): A replacement for
Barry Warsaw <barry@python.org>
parents: 8381
diff changeset
1201 comment-indent-function 'py-comment-indent-function
aea6841ab898 (py-comment-indent-function): A replacement for
Barry Warsaw <barry@python.org>
parents: 8381
diff changeset
1202 indent-region-function 'py-indent-region
aea6841ab898 (py-comment-indent-function): A replacement for
Barry Warsaw <barry@python.org>
parents: 8381
diff changeset
1203 indent-line-function 'py-indent-line
4195
e3f6ada28ed0 I have been increasingly annoyed about the fact that
Barry Warsaw <barry@python.org>
parents: 4194
diff changeset
1204 ;; tell add-log.el how to find the current function/method/variable
e3f6ada28ed0 I have been increasingly annoyed about the fact that
Barry Warsaw <barry@python.org>
parents: 4194
diff changeset
1205 add-log-current-defun-function 'py-current-defun
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1206
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1207 fill-paragraph-function 'py-fill-paragraph
4188
c796ae115783 (python-mode): font-lock-defaults necessary for Emacs 19, but doesn't
Barry Warsaw <barry@python.org>
parents: 4187
diff changeset
1208 )
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1209 (use-local-map py-mode-map)
3818
3c5ca7727988 (python-mode): Added menu support, requires easymenu.
Barry Warsaw <barry@python.org>
parents: 3813
diff changeset
1210 ;; add the menu
3c5ca7727988 (python-mode): Added menu support, requires easymenu.
Barry Warsaw <barry@python.org>
parents: 3813
diff changeset
1211 (if py-menu
3c5ca7727988 (python-mode): Added menu support, requires easymenu.
Barry Warsaw <barry@python.org>
parents: 3813
diff changeset
1212 (easy-menu-add py-menu))
3094
5a1fbd21fc2a (python-mode): comment-multi-line must be nil for Emacs 19
Barry Warsaw <barry@python.org>
parents: 3093
diff changeset
1213 ;; Emacs 19 requires this
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
1214 (if (boundp 'comment-multi-line)
3094
5a1fbd21fc2a (python-mode): comment-multi-line must be nil for Emacs 19
Barry Warsaw <barry@python.org>
parents: 3093
diff changeset
1215 (setq comment-multi-line nil))
9457
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
1216 ;; Install Imenu if available
7672
1fb868f25459 (py-smart-indentation): New variable which controls the automagic
Barry Warsaw <barry@python.org>
parents: 7481
diff changeset
1217 (when (py-safe (require 'imenu))
9457
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
1218 (setq imenu-create-index-function #'py-imenu-create-index-function)
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
1219 (setq imenu-generic-expression py-imenu-generic-expression)
7672
1fb868f25459 (py-smart-indentation): New variable which controls the automagic
Barry Warsaw <barry@python.org>
parents: 7481
diff changeset
1220 (if (fboundp 'imenu-add-to-menubar)
1fb868f25459 (py-smart-indentation): New variable which controls the automagic
Barry Warsaw <barry@python.org>
parents: 7481
diff changeset
1221 (imenu-add-to-menubar (format "%s-%s" "IM" mode-name)))
1fb868f25459 (py-smart-indentation): New variable which controls the automagic
Barry Warsaw <barry@python.org>
parents: 7481
diff changeset
1222 )
1fb868f25459 (py-smart-indentation): New variable which controls the automagic
Barry Warsaw <barry@python.org>
parents: 7481
diff changeset
1223 ;; Run the mode hook. Note that py-mode-hook is deprecated.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1224 (if python-mode-hook
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1225 (run-hooks 'python-mode-hook)
7672
1fb868f25459 (py-smart-indentation): New variable which controls the automagic
Barry Warsaw <barry@python.org>
parents: 7481
diff changeset
1226 (run-hooks 'py-mode-hook))
1fb868f25459 (py-smart-indentation): New variable which controls the automagic
Barry Warsaw <barry@python.org>
parents: 7481
diff changeset
1227 ;; Now do the automagical guessing
1fb868f25459 (py-smart-indentation): New variable which controls the automagic
Barry Warsaw <barry@python.org>
parents: 7481
diff changeset
1228 (if py-smart-indentation
1fb868f25459 (py-smart-indentation): New variable which controls the automagic
Barry Warsaw <barry@python.org>
parents: 7481
diff changeset
1229 (let ((offset py-indent-offset))
8370
f2b0859fece3 #Documentation and comment typos patch given by Michael Ernst. More
Barry Warsaw <barry@python.org>
parents: 8070
diff changeset
1230 ;; It's okay if this fails to guess a good value
7672
1fb868f25459 (py-smart-indentation): New variable which controls the automagic
Barry Warsaw <barry@python.org>
parents: 7481
diff changeset
1231 (if (and (py-safe (py-guess-indent-offset))
1fb868f25459 (py-smart-indentation): New variable which controls the automagic
Barry Warsaw <barry@python.org>
parents: 7481
diff changeset
1232 (<= py-indent-offset 8)
1fb868f25459 (py-smart-indentation): New variable which controls the automagic
Barry Warsaw <barry@python.org>
parents: 7481
diff changeset
1233 (>= py-indent-offset 2))
1fb868f25459 (py-smart-indentation): New variable which controls the automagic
Barry Warsaw <barry@python.org>
parents: 7481
diff changeset
1234 (setq offset py-indent-offset))
1fb868f25459 (py-smart-indentation): New variable which controls the automagic
Barry Warsaw <barry@python.org>
parents: 7481
diff changeset
1235 (setq py-indent-offset offset)
7699
96b7c1323d30 (py-smart-indentation): Updated docstring for new policy.
Barry Warsaw <barry@python.org>
parents: 7676
diff changeset
1236 ;; Only turn indent-tabs-mode off if tab-width !=
96b7c1323d30 (py-smart-indentation): Updated docstring for new policy.
Barry Warsaw <barry@python.org>
parents: 7676
diff changeset
1237 ;; py-indent-offset. Never turn it on, because the user must
96b7c1323d30 (py-smart-indentation): Updated docstring for new policy.
Barry Warsaw <barry@python.org>
parents: 7676
diff changeset
1238 ;; have explicitly turned it off.
96b7c1323d30 (py-smart-indentation): Updated docstring for new policy.
Barry Warsaw <barry@python.org>
parents: 7676
diff changeset
1239 (if (/= tab-width py-indent-offset)
96b7c1323d30 (py-smart-indentation): Updated docstring for new policy.
Barry Warsaw <barry@python.org>
parents: 7676
diff changeset
1240 (setq indent-tabs-mode nil))
11146
f62e465c4d01 (python-mode): Set which interpreter (CPython or JPython) to use the
Barry Warsaw <barry@python.org>
parents: 11144
diff changeset
1241 ))
f62e465c4d01 (python-mode): Set which interpreter (CPython or JPython) to use the
Barry Warsaw <barry@python.org>
parents: 11144
diff changeset
1242 ;; Set the default shell if not already set
f62e465c4d01 (python-mode): Set which interpreter (CPython or JPython) to use the
Barry Warsaw <barry@python.org>
parents: 11144
diff changeset
1243 (when (null py-which-shell)
23277
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1244 (py-toggle-shells (py-choose-shell))))
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1245
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1246
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1247 (make-obsolete 'jpython-mode 'jython-mode)
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1248 (defun jython-mode ()
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1249 "Major mode for editing Jython/Jython files.
23277
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1250 This is a simple wrapper around `python-mode'.
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1251 It runs `jython-mode-hook' then calls `python-mode.'
23277
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1252 It is added to `interpreter-mode-alist' and `py-choose-shell'.
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1253 "
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1254 (interactive)
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1255 (python-mode)
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1256 (py-toggle-shells 'jython)
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1257 (when jython-mode-hook
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1258 (run-hooks 'jython-mode-hook)))
23277
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1259
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1260
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1261 ;; It's handy to add recognition of Python files to the
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1262 ;; interpreter-mode-alist and to auto-mode-alist. With the former, we
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1263 ;; can specify different `derived-modes' based on the #! line, but
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1264 ;; with the latter, we can't. So we just won't add them if they're
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1265 ;; already added.
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1266 ;;;###autoload
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1267 (let ((modes '(("jython" . jython-mode)
23277
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1268 ("python" . python-mode))))
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1269 (while modes
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1270 (when (not (assoc (car modes) interpreter-mode-alist))
23278
5f5cea272b46 Fix typo in the setup of interpreter-mode-alist.
Barry Warsaw <barry@python.org>
parents: 23277
diff changeset
1271 (push (car modes) interpreter-mode-alist))
23277
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1272 (setq modes (cdr modes))))
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1273 ;;;###autoload
23277
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1274 (when (not (or (rassq 'python-mode auto-mode-alist)
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1275 (rassq 'jython-mode auto-mode-alist)))
23277
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1276 (push '("\\.py$" . python-mode) auto-mode-alist))
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1277
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1278
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
1279
2535
875173f3f31c (py-electric-colon): new command
Barry Warsaw <barry@python.org>
parents: 2524
diff changeset
1280 ;; electric characters
2547
3281a931a1d9 (py-outdent-p): new function
Barry Warsaw <barry@python.org>
parents: 2544
diff changeset
1281 (defun py-outdent-p ()
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1282 "Returns non-nil if the current line should dedent one level."
2547
3281a931a1d9 (py-outdent-p): new function
Barry Warsaw <barry@python.org>
parents: 2544
diff changeset
1283 (save-excursion
3281a931a1d9 (py-outdent-p): new function
Barry Warsaw <barry@python.org>
parents: 2544
diff changeset
1284 (and (progn (back-to-indentation)
3281a931a1d9 (py-outdent-p): new function
Barry Warsaw <barry@python.org>
parents: 2544
diff changeset
1285 (looking-at py-outdent-re))
9827
ef97b4f6d187 (py-outdent-p): Short circuit infloop for illegal construct
Barry Warsaw <barry@python.org>
parents: 9639
diff changeset
1286 ;; short circuit infloop on illegal construct
ef97b4f6d187 (py-outdent-p): Short circuit infloop for illegal construct
Barry Warsaw <barry@python.org>
parents: 9639
diff changeset
1287 (not (bobp))
7152
d39a805852c2 (py-outdent-p): When looking at the previous line, watch out for
Barry Warsaw <barry@python.org>
parents: 7151
diff changeset
1288 (progn (forward-line -1)
d39a805852c2 (py-outdent-p): When looking at the previous line, watch out for
Barry Warsaw <barry@python.org>
parents: 7151
diff changeset
1289 (py-goto-initial-line)
d39a805852c2 (py-outdent-p): When looking at the previous line, watch out for
Barry Warsaw <barry@python.org>
parents: 7151
diff changeset
1290 (back-to-indentation)
2547
3281a931a1d9 (py-outdent-p): new function
Barry Warsaw <barry@python.org>
parents: 2544
diff changeset
1291 (while (or (looking-at py-blank-or-comment-re)
3281a931a1d9 (py-outdent-p): new function
Barry Warsaw <barry@python.org>
parents: 2544
diff changeset
1292 (bobp))
3281a931a1d9 (py-outdent-p): new function
Barry Warsaw <barry@python.org>
parents: 2544
diff changeset
1293 (backward-to-indentation 1))
3281a931a1d9 (py-outdent-p): new function
Barry Warsaw <barry@python.org>
parents: 2544
diff changeset
1294 (not (looking-at py-no-outdent-re)))
3281a931a1d9 (py-outdent-p): new function
Barry Warsaw <barry@python.org>
parents: 2544
diff changeset
1295 )))
30033
7058dcf733d4 make pending-delete/delete-selection mode work with py-electric-colon
Skip Montanaro <skip@pobox.com>
parents: 30031
diff changeset
1296
2535
875173f3f31c (py-electric-colon): new command
Barry Warsaw <barry@python.org>
parents: 2524
diff changeset
1297 (defun py-electric-colon (arg)
875173f3f31c (py-electric-colon): new command
Barry Warsaw <barry@python.org>
parents: 2524
diff changeset
1298 "Insert a colon.
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1299 In certain cases the line is dedented appropriately. If a numeric
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1300 argument ARG is provided, that many colons are inserted
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1301 non-electrically. Electric behavior is inhibited inside a string or
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1302 comment."
30033
7058dcf733d4 make pending-delete/delete-selection mode work with py-electric-colon
Skip Montanaro <skip@pobox.com>
parents: 30031
diff changeset
1303 (interactive "*P")
2535
875173f3f31c (py-electric-colon): new command
Barry Warsaw <barry@python.org>
parents: 2524
diff changeset
1304 (self-insert-command (prefix-numeric-value arg))
3095
c1d77d74fe35 (py-electric-colon): turn off electric behavior inside strings and
Barry Warsaw <barry@python.org>
parents: 3094
diff changeset
1305 ;; are we in a string or comment?
c1d77d74fe35 (py-electric-colon): turn off electric behavior inside strings and
Barry Warsaw <barry@python.org>
parents: 3094
diff changeset
1306 (if (save-excursion
c1d77d74fe35 (py-electric-colon): turn off electric behavior inside strings and
Barry Warsaw <barry@python.org>
parents: 3094
diff changeset
1307 (let ((pps (parse-partial-sexp (save-excursion
8377
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
1308 (py-beginning-of-def-or-class)
3095
c1d77d74fe35 (py-electric-colon): turn off electric behavior inside strings and
Barry Warsaw <barry@python.org>
parents: 3094
diff changeset
1309 (point))
c1d77d74fe35 (py-electric-colon): turn off electric behavior inside strings and
Barry Warsaw <barry@python.org>
parents: 3094
diff changeset
1310 (point))))
c1d77d74fe35 (py-electric-colon): turn off electric behavior inside strings and
Barry Warsaw <barry@python.org>
parents: 3094
diff changeset
1311 (not (or (nth 3 pps) (nth 4 pps)))))
c1d77d74fe35 (py-electric-colon): turn off electric behavior inside strings and
Barry Warsaw <barry@python.org>
parents: 3094
diff changeset
1312 (save-excursion
c1d77d74fe35 (py-electric-colon): turn off electric behavior inside strings and
Barry Warsaw <barry@python.org>
parents: 3094
diff changeset
1313 (let ((here (point))
c1d77d74fe35 (py-electric-colon): turn off electric behavior inside strings and
Barry Warsaw <barry@python.org>
parents: 3094
diff changeset
1314 (outdent 0)
4479
2343803318e4 (py-indent-line): take an optional universal argument which says to
Barry Warsaw <barry@python.org>
parents: 4346
diff changeset
1315 (indent (py-compute-indentation t)))
3095
c1d77d74fe35 (py-electric-colon): turn off electric behavior inside strings and
Barry Warsaw <barry@python.org>
parents: 3094
diff changeset
1316 (if (and (not arg)
c1d77d74fe35 (py-electric-colon): turn off electric behavior inside strings and
Barry Warsaw <barry@python.org>
parents: 3094
diff changeset
1317 (py-outdent-p)
c1d77d74fe35 (py-electric-colon): turn off electric behavior inside strings and
Barry Warsaw <barry@python.org>
parents: 3094
diff changeset
1318 (= indent (save-excursion
3934
f9ad98b58472 (py-electric-colon): Use (py-next-statement -1) instead of
Barry Warsaw <barry@python.org>
parents: 3926
diff changeset
1319 (py-next-statement -1)
4479
2343803318e4 (py-indent-line): take an optional universal argument which says to
Barry Warsaw <barry@python.org>
parents: 4346
diff changeset
1320 (py-compute-indentation t)))
3095
c1d77d74fe35 (py-electric-colon): turn off electric behavior inside strings and
Barry Warsaw <barry@python.org>
parents: 3094
diff changeset
1321 )
c1d77d74fe35 (py-electric-colon): turn off electric behavior inside strings and
Barry Warsaw <barry@python.org>
parents: 3094
diff changeset
1322 (setq outdent py-indent-offset))
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1323 ;; Don't indent, only dedent. This assumes that any lines
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1324 ;; that are already dedented relative to
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1325 ;; py-compute-indentation were put there on purpose. It's
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1326 ;; highly annoying to have `:' indent for you. Use TAB, C-c
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1327 ;; C-l or C-c C-r to adjust. TBD: Is there a better way to
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1328 ;; determine this???
3095
c1d77d74fe35 (py-electric-colon): turn off electric behavior inside strings and
Barry Warsaw <barry@python.org>
parents: 3094
diff changeset
1329 (if (< (current-indentation) indent) nil
c1d77d74fe35 (py-electric-colon): turn off electric behavior inside strings and
Barry Warsaw <barry@python.org>
parents: 3094
diff changeset
1330 (goto-char here)
c1d77d74fe35 (py-electric-colon): turn off electric behavior inside strings and
Barry Warsaw <barry@python.org>
parents: 3094
diff changeset
1331 (beginning-of-line)
c1d77d74fe35 (py-electric-colon): turn off electric behavior inside strings and
Barry Warsaw <barry@python.org>
parents: 3094
diff changeset
1332 (delete-horizontal-space)
c1d77d74fe35 (py-electric-colon): turn off electric behavior inside strings and
Barry Warsaw <barry@python.org>
parents: 3094
diff changeset
1333 (indent-to (- indent outdent))
c1d77d74fe35 (py-electric-colon): turn off electric behavior inside strings and
Barry Warsaw <barry@python.org>
parents: 3094
diff changeset
1334 )))))
2535
875173f3f31c (py-electric-colon): new command
Barry Warsaw <barry@python.org>
parents: 2524
diff changeset
1335
875173f3f31c (py-electric-colon): new command
Barry Warsaw <barry@python.org>
parents: 2524
diff changeset
1336
6555
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1337 ;; Python subprocess utilities and filters
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1338 (defun py-execute-file (proc filename)
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1339 "Send to Python interpreter process PROC \"execfile('FILENAME')\".
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1340 Make that process's buffer visible and force display. Also make
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1341 comint believe the user typed this string so that
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1342 `kill-output-from-shell' does The Right Thing."
6555
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1343 (let ((curbuf (current-buffer))
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1344 (procbuf (process-buffer proc))
9025
3df5b9d8335b (py-process-filter): Deleted this function. In order to fix
Barry Warsaw <barry@python.org>
parents: 9005
diff changeset
1345 ; (comint-scroll-to-bottom-on-output t)
6555
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1346 (msg (format "## working on region in file %s...\n" filename))
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1347 ;; add some comment, so that we can filter it out of history
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1348 (cmd (format "execfile(r'%s') # PYTHON-MODE\n" filename)))
6555
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1349 (unwind-protect
9025
3df5b9d8335b (py-process-filter): Deleted this function. In order to fix
Barry Warsaw <barry@python.org>
parents: 9005
diff changeset
1350 (save-excursion
6555
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1351 (set-buffer procbuf)
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1352 (goto-char (point-max))
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1353 (move-marker (process-mark proc) (point))
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1354 (funcall (process-filter proc) proc msg))
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1355 (set-buffer curbuf))
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1356 (process-send-string proc cmd)))
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1357
9025
3df5b9d8335b (py-process-filter): Deleted this function. In order to fix
Barry Warsaw <barry@python.org>
parents: 9005
diff changeset
1358 (defun py-comint-output-filter-function (string)
3df5b9d8335b (py-process-filter): Deleted this function. In order to fix
Barry Warsaw <barry@python.org>
parents: 9005
diff changeset
1359 "Watch output for Python prompt and exec next file waiting in queue.
3df5b9d8335b (py-process-filter): Deleted this function. In order to fix
Barry Warsaw <barry@python.org>
parents: 9005
diff changeset
1360 This function is appropriate for `comint-output-filter-functions'."
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1361 ;;remove ansi terminal escape sequences from string, not sure why they are
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1362 ;;still around...
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1363 (setq string (ansi-color-filter-apply string))
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1364 (when (and (string-match py-shell-input-prompt-1-regexp string)
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1365 py-file-queue)
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1366 (if py-shell-switch-buffers-on-execute
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1367 (pop-to-buffer (current-buffer)))
9025
3df5b9d8335b (py-process-filter): Deleted this function. In order to fix
Barry Warsaw <barry@python.org>
parents: 9005
diff changeset
1368 (py-safe (delete-file (car py-file-queue)))
3df5b9d8335b (py-process-filter): Deleted this function. In order to fix
Barry Warsaw <barry@python.org>
parents: 9005
diff changeset
1369 (setq py-file-queue (cdr py-file-queue))
3df5b9d8335b (py-process-filter): Deleted this function. In order to fix
Barry Warsaw <barry@python.org>
parents: 9005
diff changeset
1370 (if py-file-queue
3df5b9d8335b (py-process-filter): Deleted this function. In order to fix
Barry Warsaw <barry@python.org>
parents: 9005
diff changeset
1371 (let ((pyproc (get-buffer-process (current-buffer))))
3df5b9d8335b (py-process-filter): Deleted this function. In order to fix
Barry Warsaw <barry@python.org>
parents: 9005
diff changeset
1372 (py-execute-file pyproc (car py-file-queue))))
3df5b9d8335b (py-process-filter): Deleted this function. In order to fix
Barry Warsaw <barry@python.org>
parents: 9005
diff changeset
1373 ))
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1374
17416
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
1375 (defun py-pdbtrack-overlay-arrow (activation)
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
1376 "Activate or de arrow at beginning-of-line in current buffer."
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
1377 ;; This was derived/simplified from edebug-overlay-arrow
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
1378 (cond (activation
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
1379 (setq overlay-arrow-position (make-marker))
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
1380 (setq overlay-arrow-string "=>")
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
1381 (set-marker overlay-arrow-position (py-point 'bol) (current-buffer))
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
1382 (setq py-pdbtrack-is-tracking-p t))
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
1383 (overlay-arrow-position
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
1384 (setq overlay-arrow-position nil)
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
1385 (setq py-pdbtrack-is-tracking-p nil))
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
1386 ))
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
1387
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
1388 (defun py-pdbtrack-track-stack-file (text)
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
1389 "Show the file indicated by the pdb stack entry line, in a separate window.
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
1390
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
1391 Activity is disabled if the buffer-local variable
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
1392 `py-pdbtrack-do-tracking-p' is nil.
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
1393
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
1394 We depend on the pdb input prompt matching `py-pdbtrack-input-prompt'
28139
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1395 at the beginning of the line.
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1396
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1397 If the traceback target file path is invalid, we look for the most
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1398 recently visited python-mode buffer which either has the name of the
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1399 current function \(or class) or which defines the function \(or
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1400 class). This is to provide for remote scripts, eg, Zope's 'Script
28918
9287278916e3 Allow for multiple parens around pdb prompt for (new) nested debugging
Ken Manheimer <klm@digicool.com>
parents: 28149
diff changeset
1401 (Python)' - put a _copy_ of the script in a buffer named for the
9287278916e3 Allow for multiple parens around pdb prompt for (new) nested debugging
Ken Manheimer <klm@digicool.com>
parents: 28149
diff changeset
1402 script, and set to python-mode, and pdbtrack will find it.)"
17416
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
1403 ;; Instead of trying to piece things together from partial text
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
1404 ;; (which can be almost useless depending on Emacs version), we
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
1405 ;; monitor to the point where we have the next pdb prompt, and then
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
1406 ;; check all text from comint-last-input-end to process-mark.
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
1407 ;;
28139
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1408 ;; Also, we're very conservative about clearing the overlay arrow,
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1409 ;; to minimize residue. This means, for instance, that executing
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1410 ;; other pdb commands wipe out the highlight. You can always do a
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1411 ;; 'where' (aka 'w') command to reveal the overlay arrow.
17416
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
1412 (let* ((origbuf (current-buffer))
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
1413 (currproc (get-buffer-process origbuf)))
28139
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1414
17416
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
1415 (if (not (and currproc py-pdbtrack-do-tracking-p))
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
1416 (py-pdbtrack-overlay-arrow nil)
28139
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1417
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1418 (let* ((procmark (process-mark currproc))
17416
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
1419 (block (buffer-substring (max comint-last-input-end
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
1420 (- procmark
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
1421 py-pdbtrack-track-range))
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
1422 procmark))
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1423 target target_fname target_lineno target_buffer)
28139
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1424
17416
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
1425 (if (not (string-match (concat py-pdbtrack-input-prompt "$") block))
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
1426 (py-pdbtrack-overlay-arrow nil)
28139
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1427
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1428 (setq target (py-pdbtrack-get-source-buffer block))
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1429
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1430 (if (stringp target)
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1431 (message "pdbtrack: %s" target)
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1432
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1433 (setq target_lineno (car target))
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1434 (setq target_buffer (cadr target))
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1435 (setq target_fname (buffer-file-name target_buffer))
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1436 (switch-to-buffer-other-window target_buffer)
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1437 (goto-line target_lineno)
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1438 (message "pdbtrack: line %s, file %s" target_lineno target_fname)
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1439 (py-pdbtrack-overlay-arrow t)
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1440 (pop-to-buffer origbuf t)
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1441
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1442 )))))
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1443 )
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1444
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1445 (defun py-pdbtrack-get-source-buffer (block)
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1446 "Return line number and buffer of code indicated by block's traceback text.
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1447
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1448 We look first to visit the file indicated in the trace.
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1449
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1450 Failing that, we look for the most recently visited python-mode buffer
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1451 with the same name or having the named function.
28139
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1452
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1453 If we're unable find the source code we return a string describing the
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1454 problem as best as we can determine."
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1455
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1456 (if (not (string-match py-pdbtrack-stack-entry-regexp block))
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1457
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1458 "Traceback cue not found"
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1459
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1460 (let* ((filename (match-string 1 block))
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1461 (lineno (string-to-int (match-string 2 block)))
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1462 (funcname (match-string 3 block))
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1463 funcbuffer)
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1464
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1465 (cond ((file-exists-p filename)
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1466 (list lineno (find-file-noselect filename)))
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1467
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1468 ((setq funcbuffer (py-pdbtrack-grub-for-buffer funcname lineno))
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1469 (if (string-match "/Script (Python)$" filename)
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1470 ;; Add in number of lines for leading '##' comments:
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1471 (setq lineno
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1472 (+ lineno
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1473 (save-excursion
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1474 (set-buffer funcbuffer)
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1475 (count-lines
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1476 (point-min)
28140
f9db9dc456ab Guard advancing past leading meta-comments.
Ken Manheimer <klm@digicool.com>
parents: 28139
diff changeset
1477 (max (point-min)
f9db9dc456ab Guard advancing past leading meta-comments.
Ken Manheimer <klm@digicool.com>
parents: 28139
diff changeset
1478 (string-match "^\\([^#]\\|#[^#]\\|#$\\)"
f9db9dc456ab Guard advancing past leading meta-comments.
Ken Manheimer <klm@digicool.com>
parents: 28139
diff changeset
1479 (buffer-substring (point-min)
29518
05fb51d07ada Remove short-circuitying grubbing by using last grubbed buffer. It's
Ken Manheimer <klm@digicool.com>
parents: 28919
diff changeset
1480 (point-max)))
28140
f9db9dc456ab Guard advancing past leading meta-comments.
Ken Manheimer <klm@digicool.com>
parents: 28139
diff changeset
1481 ))))))
28139
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1482 (list lineno funcbuffer))
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1483
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1484 ((= (elt filename 0) ?\<)
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1485 (format "(Non-file source: '%s')" filename))
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1486
28918
9287278916e3 Allow for multiple parens around pdb prompt for (new) nested debugging
Ken Manheimer <klm@digicool.com>
parents: 28149
diff changeset
1487 (t (format "Not found: %s(), %s" funcname filename)))
28139
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1488 )
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1489 )
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1490 )
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1491
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1492 (defun py-pdbtrack-grub-for-buffer (funcname lineno)
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1493 "Find most recent buffer itself named or having function funcname.
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1494
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1495 We walk the buffer-list history for python-mode buffers that are
28149
95abf3fc2b2d py-pdbtrack-grub-for-buffer(): Rectified some logic errors i
Ken Manheimer <klm@digicool.com>
parents: 28140
diff changeset
1496 named for funcname or define a function funcname."
28139
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1497 (let ((buffers (buffer-list))
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1498 buf
28139
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1499 got)
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1500 (while (and buffers (not got))
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1501 (setq buf (car buffers)
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1502 buffers (cdr buffers))
28149
95abf3fc2b2d py-pdbtrack-grub-for-buffer(): Rectified some logic errors i
Ken Manheimer <klm@digicool.com>
parents: 28140
diff changeset
1503 (if (and (save-excursion (set-buffer buf)
95abf3fc2b2d py-pdbtrack-grub-for-buffer(): Rectified some logic errors i
Ken Manheimer <klm@digicool.com>
parents: 28140
diff changeset
1504 (string= major-mode "python-mode"))
95abf3fc2b2d py-pdbtrack-grub-for-buffer(): Rectified some logic errors i
Ken Manheimer <klm@digicool.com>
parents: 28140
diff changeset
1505 (or (string-match funcname (buffer-name buf))
28139
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1506 (string-match (concat "^\\s-*\\(def\\|class\\)\\s-+"
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1507 funcname "\\s-*(")
29518
05fb51d07ada Remove short-circuitying grubbing by using last grubbed buffer. It's
Ken Manheimer <klm@digicool.com>
parents: 28919
diff changeset
1508 (save-excursion
05fb51d07ada Remove short-circuitying grubbing by using last grubbed buffer. It's
Ken Manheimer <klm@digicool.com>
parents: 28919
diff changeset
1509 (set-buffer buf)
05fb51d07ada Remove short-circuitying grubbing by using last grubbed buffer. It's
Ken Manheimer <klm@digicool.com>
parents: 28919
diff changeset
1510 (buffer-substring (point-min)
05fb51d07ada Remove short-circuitying grubbing by using last grubbed buffer. It's
Ken Manheimer <klm@digicool.com>
parents: 28919
diff changeset
1511 (point-max))))))
28139
b20a3685d23e Enhanced pdbtrack to provide for source code that's not findable by
Ken Manheimer <klm@digicool.com>
parents: 26968
diff changeset
1512 (setq got buf)))
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1513 got))
17416
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
1514
6663
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1515 (defun py-postprocess-output-buffer (buf)
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1516 "Highlight exceptions found in BUF.
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1517 If an exception occurred return t, otherwise return nil. BUF must exist."
7743
269a327d6305 (py-postprocess-output-buffer): Return t if an exception was found,
Barry Warsaw <barry@python.org>
parents: 7742
diff changeset
1518 (let (line file bol err-p)
6731
21656204dd4f (py-jump-on-exception): Variable which if t, means that if an
Barry Warsaw <barry@python.org>
parents: 6730
diff changeset
1519 (save-excursion
21656204dd4f (py-jump-on-exception): Variable which if t, means that if an
Barry Warsaw <barry@python.org>
parents: 6730
diff changeset
1520 (set-buffer buf)
21656204dd4f (py-jump-on-exception): Variable which if t, means that if an
Barry Warsaw <barry@python.org>
parents: 6730
diff changeset
1521 (beginning-of-buffer)
21656204dd4f (py-jump-on-exception): Variable which if t, means that if an
Barry Warsaw <barry@python.org>
parents: 6730
diff changeset
1522 (while (re-search-forward py-traceback-line-re nil t)
21656204dd4f (py-jump-on-exception): Variable which if t, means that if an
Barry Warsaw <barry@python.org>
parents: 6730
diff changeset
1523 (setq file (match-string 1)
21656204dd4f (py-jump-on-exception): Variable which if t, means that if an
Barry Warsaw <barry@python.org>
parents: 6730
diff changeset
1524 line (string-to-int (match-string 2))
21656204dd4f (py-jump-on-exception): Variable which if t, means that if an
Barry Warsaw <barry@python.org>
parents: 6730
diff changeset
1525 bol (py-point 'bol))
7743
269a327d6305 (py-postprocess-output-buffer): Return t if an exception was found,
Barry Warsaw <barry@python.org>
parents: 7742
diff changeset
1526 (py-highlight-line bol (py-point 'eol) file line)))
269a327d6305 (py-postprocess-output-buffer): Return t if an exception was found,
Barry Warsaw <barry@python.org>
parents: 7742
diff changeset
1527 (when (and py-jump-on-exception line)
269a327d6305 (py-postprocess-output-buffer): Return t if an exception was found,
Barry Warsaw <barry@python.org>
parents: 7742
diff changeset
1528 (beep)
269a327d6305 (py-postprocess-output-buffer): Return t if an exception was found,
Barry Warsaw <barry@python.org>
parents: 7742
diff changeset
1529 (py-jump-to-exception file line)
269a327d6305 (py-postprocess-output-buffer): Return t if an exception was found,
Barry Warsaw <barry@python.org>
parents: 7742
diff changeset
1530 (setq err-p t))
269a327d6305 (py-postprocess-output-buffer): Return t if an exception was found,
Barry Warsaw <barry@python.org>
parents: 7742
diff changeset
1531 err-p))
6663
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1532
6731
21656204dd4f (py-jump-on-exception): Variable which if t, means that if an
Barry Warsaw <barry@python.org>
parents: 6730
diff changeset
1533
6555
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1534
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1535 ;;; Subprocess commands
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1536
6663
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1537 ;; only used when (memq 'broken-temp-names py-emacs-features)
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1538 (defvar py-serial-number 0)
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1539 (defvar py-exception-buffer nil)
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1540 (defconst py-output-buffer "*Python Output*")
7950
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
1541 (make-variable-buffer-local 'py-output-buffer)
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
1542
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1543 ;; for toggling between CPython and Jython
10207
29d1d3b08ca7 (py-default-interpreter): New variable which selects whether CPython
Barry Warsaw <barry@python.org>
parents: 9927
diff changeset
1544 (defvar py-which-shell nil)
7950
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
1545 (defvar py-which-args py-python-command-args)
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
1546 (defvar py-which-bufname "Python")
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
1547 (make-variable-buffer-local 'py-which-shell)
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
1548 (make-variable-buffer-local 'py-which-args)
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
1549 (make-variable-buffer-local 'py-which-bufname)
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
1550
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
1551 (defun py-toggle-shells (arg)
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1552 "Toggles between the CPython and Jython shells.
11146
f62e465c4d01 (python-mode): Set which interpreter (CPython or JPython) to use the
Barry Warsaw <barry@python.org>
parents: 11144
diff changeset
1553
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1554 With positive argument ARG (interactively \\[universal-argument]),
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1555 uses the CPython shell, with negative ARG uses the Jython shell, and
11146
f62e465c4d01 (python-mode): Set which interpreter (CPython or JPython) to use the
Barry Warsaw <barry@python.org>
parents: 11144
diff changeset
1556 with a zero argument, toggles the shell.
f62e465c4d01 (python-mode): Set which interpreter (CPython or JPython) to use the
Barry Warsaw <barry@python.org>
parents: 11144
diff changeset
1557
f62e465c4d01 (python-mode): Set which interpreter (CPython or JPython) to use the
Barry Warsaw <barry@python.org>
parents: 11144
diff changeset
1558 Programmatically, ARG can also be one of the symbols `cpython' or
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1559 `jython', equivalent to positive arg and negative arg respectively."
7950
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
1560 (interactive "P")
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
1561 ;; default is to toggle
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
1562 (if (null arg)
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
1563 (setq arg 0))
11146
f62e465c4d01 (python-mode): Set which interpreter (CPython or JPython) to use the
Barry Warsaw <barry@python.org>
parents: 11144
diff changeset
1564 ;; preprocess arg
f62e465c4d01 (python-mode): Set which interpreter (CPython or JPython) to use the
Barry Warsaw <barry@python.org>
parents: 11144
diff changeset
1565 (cond
f62e465c4d01 (python-mode): Set which interpreter (CPython or JPython) to use the
Barry Warsaw <barry@python.org>
parents: 11144
diff changeset
1566 ((equal arg 0)
f62e465c4d01 (python-mode): Set which interpreter (CPython or JPython) to use the
Barry Warsaw <barry@python.org>
parents: 11144
diff changeset
1567 ;; toggle
f62e465c4d01 (python-mode): Set which interpreter (CPython or JPython) to use the
Barry Warsaw <barry@python.org>
parents: 11144
diff changeset
1568 (if (string-equal py-which-bufname "Python")
f62e465c4d01 (python-mode): Set which interpreter (CPython or JPython) to use the
Barry Warsaw <barry@python.org>
parents: 11144
diff changeset
1569 (setq arg -1)
f62e465c4d01 (python-mode): Set which interpreter (CPython or JPython) to use the
Barry Warsaw <barry@python.org>
parents: 11144
diff changeset
1570 (setq arg 1)))
f62e465c4d01 (python-mode): Set which interpreter (CPython or JPython) to use the
Barry Warsaw <barry@python.org>
parents: 11144
diff changeset
1571 ((equal arg 'cpython) (setq arg 1))
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1572 ((equal arg 'jython) (setq arg -1)))
7950
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
1573 (let (msg)
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
1574 (cond
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
1575 ((< 0 arg)
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
1576 ;; set to CPython
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
1577 (setq py-which-shell py-python-command
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
1578 py-which-args py-python-command-args
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
1579 py-which-bufname "Python"
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1580 msg "CPython")
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1581 (if (string-equal py-which-bufname "Jython")
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1582 (setq mode-name "Python")))
7950
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
1583 ((> 0 arg)
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1584 (setq py-which-shell py-jython-command
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1585 py-which-args py-jython-command-args
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1586 py-which-bufname "Jython"
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1587 msg "Jython")
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1588 (if (string-equal py-which-bufname "Python")
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1589 (setq mode-name "Jython")))
7950
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
1590 )
7952
72d9961540d8 (py-toggle-shells): Added a message in the minibuf.
Barry Warsaw <barry@python.org>
parents: 7950
diff changeset
1591 (message "Using the %s shell" msg)
7950
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
1592 (setq py-output-buffer (format "*%s Output*" py-which-bufname))))
6663
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1593
6555
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1594 ;;;###autoload
10208
a86fe1f3cf4e (py-shell): Added optional argprompt, which will prompt for additional
Barry Warsaw <barry@python.org>
parents: 10207
diff changeset
1595 (defun py-shell (&optional argprompt)
6555
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1596 "Start an interactive Python interpreter in another window.
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1597 This is like Shell mode, except that Python is running in the window
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1598 instead of a shell. See the `Interactive Shell' and `Shell Mode'
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1599 sections of the Emacs manual for details, especially for the key
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1600 bindings active in the `*Python*' buffer.
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1601
10208
a86fe1f3cf4e (py-shell): Added optional argprompt, which will prompt for additional
Barry Warsaw <barry@python.org>
parents: 10207
diff changeset
1602 With optional \\[universal-argument], the user is prompted for the
a86fe1f3cf4e (py-shell): Added optional argprompt, which will prompt for additional
Barry Warsaw <barry@python.org>
parents: 10207
diff changeset
1603 flags to pass to the Python interpreter. This has no effect when this
a86fe1f3cf4e (py-shell): Added optional argprompt, which will prompt for additional
Barry Warsaw <barry@python.org>
parents: 10207
diff changeset
1604 command is used to switch to an existing process, only when a new
a86fe1f3cf4e (py-shell): Added optional argprompt, which will prompt for additional
Barry Warsaw <barry@python.org>
parents: 10207
diff changeset
1605 process is started. If you use this, you will probably want to ensure
a86fe1f3cf4e (py-shell): Added optional argprompt, which will prompt for additional
Barry Warsaw <barry@python.org>
parents: 10207
diff changeset
1606 that the current arguments are retained (they will be included in the
a86fe1f3cf4e (py-shell): Added optional argprompt, which will prompt for additional
Barry Warsaw <barry@python.org>
parents: 10207
diff changeset
1607 prompt). This argument is ignored when this function is called
a86fe1f3cf4e (py-shell): Added optional argprompt, which will prompt for additional
Barry Warsaw <barry@python.org>
parents: 10207
diff changeset
1608 programmatically, or when running in Emacs 19.34 or older.
a86fe1f3cf4e (py-shell): Added optional argprompt, which will prompt for additional
Barry Warsaw <barry@python.org>
parents: 10207
diff changeset
1609
7950
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
1610 Note: You can toggle between using the CPython interpreter and the
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1611 Jython interpreter by hitting \\[py-toggle-shells]. This toggles
7950
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
1612 buffer local variables which control whether all your subshell
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1613 interactions happen to the `*Jython*' or `*Python*' buffers (the
7950
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
1614 latter is the name used for the CPython buffer).
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
1615
6555
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1616 Warning: Don't use an interactive Python if you change sys.ps1 or
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1617 sys.ps2 from their default values, or if you're running code that
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1618 prints `>>> ' or `... ' at the start of a line. `python-mode' can't
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1619 distinguish your output from Python's output, and assumes that `>>> '
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1620 at the start of a line is a prompt from Python. Similarly, the Emacs
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1621 Shell mode code assumes that both `>>> ' and `... ' at the start of a
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1622 line are Python prompts. Bad things can happen if you fool either
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1623 mode.
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1624
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1625 Warning: If you do any editing *in* the process buffer *while* the
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1626 buffer is accepting output from Python, do NOT attempt to `undo' the
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1627 changes. Some of the output (nowhere near the parts you changed!) may
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1628 be lost if you do. This appears to be an Emacs bug, an unfortunate
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1629 interaction between undo and process filters; the same problem exists in
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1630 non-Python process buffers using the default (Emacs-supplied) process
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1631 filter."
10208
a86fe1f3cf4e (py-shell): Added optional argprompt, which will prompt for additional
Barry Warsaw <barry@python.org>
parents: 10207
diff changeset
1632 (interactive "P")
11186
24c5bc6bfcaa (py-shell): Set the default shell if not set yet. It's sometimes
Barry Warsaw <barry@python.org>
parents: 11147
diff changeset
1633 ;; Set the default shell if not already set
24c5bc6bfcaa (py-shell): Set the default shell if not set yet. It's sometimes
Barry Warsaw <barry@python.org>
parents: 11147
diff changeset
1634 (when (null py-which-shell)
24c5bc6bfcaa (py-shell): Set the default shell if not set yet. It's sometimes
Barry Warsaw <barry@python.org>
parents: 11147
diff changeset
1635 (py-toggle-shells py-default-interpreter))
10208
a86fe1f3cf4e (py-shell): Added optional argprompt, which will prompt for additional
Barry Warsaw <barry@python.org>
parents: 10207
diff changeset
1636 (let ((args py-which-args))
a86fe1f3cf4e (py-shell): Added optional argprompt, which will prompt for additional
Barry Warsaw <barry@python.org>
parents: 10207
diff changeset
1637 (when (and argprompt
a86fe1f3cf4e (py-shell): Added optional argprompt, which will prompt for additional
Barry Warsaw <barry@python.org>
parents: 10207
diff changeset
1638 (interactive-p)
a86fe1f3cf4e (py-shell): Added optional argprompt, which will prompt for additional
Barry Warsaw <barry@python.org>
parents: 10207
diff changeset
1639 (fboundp 'split-string))
a86fe1f3cf4e (py-shell): Added optional argprompt, which will prompt for additional
Barry Warsaw <barry@python.org>
parents: 10207
diff changeset
1640 ;; TBD: Perhaps force "-i" in the final list?
a86fe1f3cf4e (py-shell): Added optional argprompt, which will prompt for additional
Barry Warsaw <barry@python.org>
parents: 10207
diff changeset
1641 (setq args (split-string
a86fe1f3cf4e (py-shell): Added optional argprompt, which will prompt for additional
Barry Warsaw <barry@python.org>
parents: 10207
diff changeset
1642 (read-string (concat py-which-bufname
a86fe1f3cf4e (py-shell): Added optional argprompt, which will prompt for additional
Barry Warsaw <barry@python.org>
parents: 10207
diff changeset
1643 " arguments: ")
a86fe1f3cf4e (py-shell): Added optional argprompt, which will prompt for additional
Barry Warsaw <barry@python.org>
parents: 10207
diff changeset
1644 (concat
a86fe1f3cf4e (py-shell): Added optional argprompt, which will prompt for additional
Barry Warsaw <barry@python.org>
parents: 10207
diff changeset
1645 (mapconcat 'identity py-which-args " ") " ")
a86fe1f3cf4e (py-shell): Added optional argprompt, which will prompt for additional
Barry Warsaw <barry@python.org>
parents: 10207
diff changeset
1646 ))))
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1647 (if (not (equal (buffer-name) "*Python*"))
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1648 (switch-to-buffer-other-window
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1649 (apply 'make-comint py-which-bufname py-which-shell nil args))
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1650 (apply 'make-comint py-which-bufname py-which-shell nil args))
10208
a86fe1f3cf4e (py-shell): Added optional argprompt, which will prompt for additional
Barry Warsaw <barry@python.org>
parents: 10207
diff changeset
1651 (make-local-variable 'comint-prompt-regexp)
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1652 (setq comint-prompt-regexp (concat py-shell-input-prompt-1-regexp "\\|"
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1653 py-shell-input-prompt-2-regexp "\\|"
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1654 "^([Pp]db) "))
10208
a86fe1f3cf4e (py-shell): Added optional argprompt, which will prompt for additional
Barry Warsaw <barry@python.org>
parents: 10207
diff changeset
1655 (add-hook 'comint-output-filter-functions
a86fe1f3cf4e (py-shell): Added optional argprompt, which will prompt for additional
Barry Warsaw <barry@python.org>
parents: 10207
diff changeset
1656 'py-comint-output-filter-function)
17416
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
1657 ;; pdbtrack
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
1658 (add-hook 'comint-output-filter-functions 'py-pdbtrack-track-stack-file)
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
1659 (setq py-pdbtrack-do-tracking-p t)
10208
a86fe1f3cf4e (py-shell): Added optional argprompt, which will prompt for additional
Barry Warsaw <barry@python.org>
parents: 10207
diff changeset
1660 (set-syntax-table py-mode-syntax-table)
a86fe1f3cf4e (py-shell): Added optional argprompt, which will prompt for additional
Barry Warsaw <barry@python.org>
parents: 10207
diff changeset
1661 (use-local-map py-shell-map)
23270
f970588e89b1 (py-shell-hook): A new hook variable, run at the end of py-shell.
Barry Warsaw <barry@python.org>
parents: 23230
diff changeset
1662 (run-hooks 'py-shell-hook)
10208
a86fe1f3cf4e (py-shell): Added optional argprompt, which will prompt for additional
Barry Warsaw <barry@python.org>
parents: 10207
diff changeset
1663 ))
6555
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1664
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1665 (defun py-clear-queue ()
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1666 "Clear the queue of temporary files waiting to execute."
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1667 (interactive)
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1668 (let ((n (length py-file-queue)))
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1669 (mapcar 'delete-file py-file-queue)
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1670 (setq py-file-queue nil)
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1671 (message "%d pending files de-queued." n)))
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1672
8378
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1673
6555
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1674 (defun py-execute-region (start end &optional async)
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1675 "Execute the region in a Python interpreter.
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1676
6555
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1677 The region is first copied into a temporary file (in the directory
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1678 `py-temp-directory'). If there is no Python interpreter shell
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1679 running, this file is executed synchronously using
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1680 `shell-command-on-region'. If the program is long running, use
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1681 \\[universal-argument] to run the command asynchronously in its own
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1682 buffer.
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1683
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1684 When this function is used programmatically, arguments START and END
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1685 specify the region to execute, and optional third argument ASYNC, if
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1686 non-nil, specifies to run the command asynchronously in its own
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1687 buffer.
6555
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1688
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1689 If the Python interpreter shell is running, the region is execfile()'d
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1690 in that shell. If you try to execute regions too quickly,
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1691 `python-mode' will queue them up and execute them one at a time when
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1692 it sees a `>>> ' prompt from Python. Each time this happens, the
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1693 process buffer is popped into a window (if it's not already in some
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1694 window) so you can see it, and a comment of the form
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1695
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1696 \t## working on region in file <name>...
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1697
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1698 is inserted at the end. See also the command `py-clear-queue'."
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1699 (interactive "r\nP")
23275
d47290dd2d57 (py-execute-region): Alexander Schmolck points out that leading
Barry Warsaw <barry@python.org>
parents: 23271
diff changeset
1700 ;; Skip ahead to the first non-blank line
9491
a3bcf1b36551 (py-execute-region): Patch by Hunter Kelly so that execution uses the
Barry Warsaw <barry@python.org>
parents: 9458
diff changeset
1701 (let* ((proc (get-process py-which-bufname))
6562
53835043528c (py-emacs-features): Test for working make-temp-name, which is broken
Barry Warsaw <barry@python.org>
parents: 6560
diff changeset
1702 (temp (if (memq 'broken-temp-names py-emacs-features)
8888
9a075a2edb1f (py-execute-region): When temp-names are broken (Emacs 19.34), a
Barry Warsaw <barry@python.org>
parents: 8629
diff changeset
1703 (let
9a075a2edb1f (py-execute-region): When temp-names are broken (Emacs 19.34), a
Barry Warsaw <barry@python.org>
parents: 8629
diff changeset
1704 ((sn py-serial-number)
9a075a2edb1f (py-execute-region): When temp-names are broken (Emacs 19.34), a
Barry Warsaw <barry@python.org>
parents: 8629
diff changeset
1705 (pid (and (fboundp 'emacs-pid) (emacs-pid))))
9a075a2edb1f (py-execute-region): When temp-names are broken (Emacs 19.34), a
Barry Warsaw <barry@python.org>
parents: 8629
diff changeset
1706 (setq py-serial-number (1+ py-serial-number))
9a075a2edb1f (py-execute-region): When temp-names are broken (Emacs 19.34), a
Barry Warsaw <barry@python.org>
parents: 8629
diff changeset
1707 (if pid
9a075a2edb1f (py-execute-region): When temp-names are broken (Emacs 19.34), a
Barry Warsaw <barry@python.org>
parents: 8629
diff changeset
1708 (format "python-%d-%d" sn pid)
9a075a2edb1f (py-execute-region): When temp-names are broken (Emacs 19.34), a
Barry Warsaw <barry@python.org>
parents: 8629
diff changeset
1709 (format "python-%d" sn)))
7481
cca39d719aba (py-execute-region): Simplified calculation of temporary file name.
Barry Warsaw <barry@python.org>
parents: 7480
diff changeset
1710 (make-temp-name "python-")))
23222
ab4fa78afddf (py-execute-region): If you ran this without having visited a
Barry Warsaw <barry@python.org>
parents: 22524
diff changeset
1711 (file (concat (expand-file-name temp py-temp-directory) ".py"))
12736
d2573dbf6852 (py-execute-region): Based on suggestions by Francois Pinard and Skip
Barry Warsaw <barry@python.org>
parents: 11186
diff changeset
1712 (cur (current-buffer))
23222
ab4fa78afddf (py-execute-region): If you ran this without having visited a
Barry Warsaw <barry@python.org>
parents: 22524
diff changeset
1713 (buf (get-buffer-create file))
ab4fa78afddf (py-execute-region): If you ran this without having visited a
Barry Warsaw <barry@python.org>
parents: 22524
diff changeset
1714 shell)
12736
d2573dbf6852 (py-execute-region): Based on suggestions by Francois Pinard and Skip
Barry Warsaw <barry@python.org>
parents: 11186
diff changeset
1715 ;; Write the contents of the buffer, watching out for indented regions.
d2573dbf6852 (py-execute-region): Based on suggestions by Francois Pinard and Skip
Barry Warsaw <barry@python.org>
parents: 11186
diff changeset
1716 (save-excursion
d2573dbf6852 (py-execute-region): Based on suggestions by Francois Pinard and Skip
Barry Warsaw <barry@python.org>
parents: 11186
diff changeset
1717 (goto-char start)
23423
c375c5b26631 (py-execute-region): Do the blank line skipping inside the
Barry Warsaw <barry@python.org>
parents: 23323
diff changeset
1718 (beginning-of-line)
c375c5b26631 (py-execute-region): Do the blank line skipping inside the
Barry Warsaw <barry@python.org>
parents: 23323
diff changeset
1719 (while (and (looking-at "\\s *$")
c375c5b26631 (py-execute-region): Do the blank line skipping inside the
Barry Warsaw <barry@python.org>
parents: 23323
diff changeset
1720 (< (point) end))
c375c5b26631 (py-execute-region): Do the blank line skipping inside the
Barry Warsaw <barry@python.org>
parents: 23323
diff changeset
1721 (forward-line 1))
c375c5b26631 (py-execute-region): Do the blank line skipping inside the
Barry Warsaw <barry@python.org>
parents: 23323
diff changeset
1722 (setq start (point))
c375c5b26631 (py-execute-region): Do the blank line skipping inside the
Barry Warsaw <barry@python.org>
parents: 23323
diff changeset
1723 (or (< start end)
c375c5b26631 (py-execute-region): Do the blank line skipping inside the
Barry Warsaw <barry@python.org>
parents: 23323
diff changeset
1724 (error "Region is empty"))
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1725 (setq py-line-number-offset (count-lines 1 start))
12994
01ce89fc745f (py-execute-region): Make sure the new temporary buffer is current for
Barry Warsaw <barry@python.org>
parents: 12736
diff changeset
1726 (let ((needs-if (/= (py-point 'bol) (py-point 'boi))))
12736
d2573dbf6852 (py-execute-region): Based on suggestions by Francois Pinard and Skip
Barry Warsaw <barry@python.org>
parents: 11186
diff changeset
1727 (set-buffer buf)
23222
ab4fa78afddf (py-execute-region): If you ran this without having visited a
Barry Warsaw <barry@python.org>
parents: 22524
diff changeset
1728 (python-mode)
12994
01ce89fc745f (py-execute-region): Make sure the new temporary buffer is current for
Barry Warsaw <barry@python.org>
parents: 12736
diff changeset
1729 (when needs-if
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1730 (insert "if 1:\n")
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1731 (setq py-line-number-offset (- py-line-number-offset 1)))
23223
f5aeeaaf0397 (py-execute-region): If the line at the beginning of the region is a
Barry Warsaw <barry@python.org>
parents: 23222
diff changeset
1732 (insert-buffer-substring cur start end)
f5aeeaaf0397 (py-execute-region): If the line at the beginning of the region is a
Barry Warsaw <barry@python.org>
parents: 23222
diff changeset
1733 ;; Set the shell either to the #! line command, or to the
f5aeeaaf0397 (py-execute-region): If the line at the beginning of the region is a
Barry Warsaw <barry@python.org>
parents: 23222
diff changeset
1734 ;; py-which-shell buffer local variable.
23277
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1735 (setq shell (or (py-choose-shell-by-shebang)
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1736 (py-choose-shell-by-import)
314e08e8090f SF patch #510288 by Kevin J. Butler, mod'd by Barry. This provides
Barry Warsaw <barry@python.org>
parents: 23275
diff changeset
1737 py-which-shell))))
6555
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1738 (cond
8370
f2b0859fece3 #Documentation and comment typos patch given by Michael Ernst. More
Barry Warsaw <barry@python.org>
parents: 8070
diff changeset
1739 ;; always run the code in its own asynchronous subprocess
6555
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1740 (async
12736
d2573dbf6852 (py-execute-region): Based on suggestions by Francois Pinard and Skip
Barry Warsaw <barry@python.org>
parents: 11186
diff changeset
1741 ;; User explicitly wants this to run in its own async subprocess
d2573dbf6852 (py-execute-region): Based on suggestions by Francois Pinard and Skip
Barry Warsaw <barry@python.org>
parents: 11186
diff changeset
1742 (save-excursion
d2573dbf6852 (py-execute-region): Based on suggestions by Francois Pinard and Skip
Barry Warsaw <barry@python.org>
parents: 11186
diff changeset
1743 (set-buffer buf)
d2573dbf6852 (py-execute-region): Based on suggestions by Francois Pinard and Skip
Barry Warsaw <barry@python.org>
parents: 11186
diff changeset
1744 (write-region (point-min) (point-max) file nil 'nomsg))
9503
fec862301d6e (py-execute-region): Hack around the different behavior and switch
Barry Warsaw <barry@python.org>
parents: 9491
diff changeset
1745 (let* ((buf (generate-new-buffer-name py-output-buffer))
fec862301d6e (py-execute-region): Hack around the different behavior and switch
Barry Warsaw <barry@python.org>
parents: 9491
diff changeset
1746 ;; TBD: a horrible hack, but why create new Custom variables?
fec862301d6e (py-execute-region): Hack around the different behavior and switch
Barry Warsaw <barry@python.org>
parents: 9491
diff changeset
1747 (arg (if (string-equal py-which-bufname "Python")
fec862301d6e (py-execute-region): Hack around the different behavior and switch
Barry Warsaw <barry@python.org>
parents: 9491
diff changeset
1748 "-u" "")))
23222
ab4fa78afddf (py-execute-region): If you ran this without having visited a
Barry Warsaw <barry@python.org>
parents: 22524
diff changeset
1749 (start-process py-which-bufname buf shell arg file)
6555
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1750 (pop-to-buffer buf)
6663
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1751 (py-postprocess-output-buffer buf)
12736
d2573dbf6852 (py-execute-region): Based on suggestions by Francois Pinard and Skip
Barry Warsaw <barry@python.org>
parents: 11186
diff changeset
1752 ;; TBD: clean up the temporary file!
6555
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1753 ))
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1754 ;; if the Python interpreter shell is running, queue it up for
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1755 ;; execution there.
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1756 (proc
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1757 ;; use the existing python shell
12736
d2573dbf6852 (py-execute-region): Based on suggestions by Francois Pinard and Skip
Barry Warsaw <barry@python.org>
parents: 11186
diff changeset
1758 (save-excursion
d2573dbf6852 (py-execute-region): Based on suggestions by Francois Pinard and Skip
Barry Warsaw <barry@python.org>
parents: 11186
diff changeset
1759 (set-buffer buf)
d2573dbf6852 (py-execute-region): Based on suggestions by Francois Pinard and Skip
Barry Warsaw <barry@python.org>
parents: 11186
diff changeset
1760 (write-region (point-min) (point-max) file nil 'nomsg))
6555
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1761 (if (not py-file-queue)
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1762 (py-execute-file proc file)
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1763 (message "File %s queued for execution" file))
9025
3df5b9d8335b (py-process-filter): Deleted this function. In order to fix
Barry Warsaw <barry@python.org>
parents: 9005
diff changeset
1764 (setq py-file-queue (append py-file-queue (list file)))
6663
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1765 (setq py-exception-buffer (cons file (current-buffer))))
6555
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1766 (t
23223
f5aeeaaf0397 (py-execute-region): If the line at the beginning of the region is a
Barry Warsaw <barry@python.org>
parents: 23222
diff changeset
1767 ;; TBD: a horrible hack, but why create new Custom variables?
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1768 (let ((cmd (concat py-which-shell (if (string-equal py-which-bufname
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1769 "Jython")
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1770 " -" ""))))
9503
fec862301d6e (py-execute-region): Hack around the different behavior and switch
Barry Warsaw <barry@python.org>
parents: 9491
diff changeset
1771 ;; otherwise either run it synchronously in a subprocess
12736
d2573dbf6852 (py-execute-region): Based on suggestions by Francois Pinard and Skip
Barry Warsaw <barry@python.org>
parents: 11186
diff changeset
1772 (save-excursion
d2573dbf6852 (py-execute-region): Based on suggestions by Francois Pinard and Skip
Barry Warsaw <barry@python.org>
parents: 11186
diff changeset
1773 (set-buffer buf)
d2573dbf6852 (py-execute-region): Based on suggestions by Francois Pinard and Skip
Barry Warsaw <barry@python.org>
parents: 11186
diff changeset
1774 (shell-command-on-region (point-min) (point-max)
d2573dbf6852 (py-execute-region): Based on suggestions by Francois Pinard and Skip
Barry Warsaw <barry@python.org>
parents: 11186
diff changeset
1775 cmd py-output-buffer))
9503
fec862301d6e (py-execute-region): Hack around the different behavior and switch
Barry Warsaw <barry@python.org>
parents: 9491
diff changeset
1776 ;; shell-command-on-region kills the output buffer if it never
fec862301d6e (py-execute-region): Hack around the different behavior and switch
Barry Warsaw <barry@python.org>
parents: 9491
diff changeset
1777 ;; existed and there's no output from the command
fec862301d6e (py-execute-region): Hack around the different behavior and switch
Barry Warsaw <barry@python.org>
parents: 9491
diff changeset
1778 (if (not (get-buffer py-output-buffer))
fec862301d6e (py-execute-region): Hack around the different behavior and switch
Barry Warsaw <barry@python.org>
parents: 9491
diff changeset
1779 (message "No output.")
fec862301d6e (py-execute-region): Hack around the different behavior and switch
Barry Warsaw <barry@python.org>
parents: 9491
diff changeset
1780 (setq py-exception-buffer (current-buffer))
fec862301d6e (py-execute-region): Hack around the different behavior and switch
Barry Warsaw <barry@python.org>
parents: 9491
diff changeset
1781 (let ((err-p (py-postprocess-output-buffer py-output-buffer)))
fec862301d6e (py-execute-region): Hack around the different behavior and switch
Barry Warsaw <barry@python.org>
parents: 9491
diff changeset
1782 (pop-to-buffer py-output-buffer)
fec862301d6e (py-execute-region): Hack around the different behavior and switch
Barry Warsaw <barry@python.org>
parents: 9491
diff changeset
1783 (if err-p
fec862301d6e (py-execute-region): Hack around the different behavior and switch
Barry Warsaw <barry@python.org>
parents: 9491
diff changeset
1784 (pop-to-buffer py-exception-buffer)))
12736
d2573dbf6852 (py-execute-region): Based on suggestions by Francois Pinard and Skip
Barry Warsaw <barry@python.org>
parents: 11186
diff changeset
1785 ))
23229
2b47d0dcfa66 Some contributions and ideas by Alexander Schmolck: add a keybinding
Barry Warsaw <barry@python.org>
parents: 23224
diff changeset
1786 ))
16715
3e9396ac4ba0 (py-execute-region): This one's easy... kill the temporary file's
Barry Warsaw <barry@python.org>
parents: 15668
diff changeset
1787 ;; Clean up after ourselves.
3e9396ac4ba0 (py-execute-region): This one's easy... kill the temporary file's
Barry Warsaw <barry@python.org>
parents: 15668
diff changeset
1788 (kill-buffer buf)))
6555
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1789
8378
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1790
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1791 ;; Code execution commands
6555
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1792 (defun py-execute-buffer (&optional async)
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1793 "Send the contents of the buffer to a Python interpreter.
7142
aff1e7b1f523 (py-master-file): New buffer-local variable which can be set in the
Barry Warsaw <barry@python.org>
parents: 6836
diff changeset
1794 If the file local variable `py-master-file' is non-nil, execute the
aff1e7b1f523 (py-master-file): New buffer-local variable which can be set in the
Barry Warsaw <barry@python.org>
parents: 6836
diff changeset
1795 named file instead of the buffer's file.
aff1e7b1f523 (py-master-file): New buffer-local variable which can be set in the
Barry Warsaw <barry@python.org>
parents: 6836
diff changeset
1796
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1797 If there is a *Python* process buffer it is used. If a clipping
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1798 restriction is in effect, only the accessible portion of the buffer is
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1799 sent. A trailing newline will be supplied if needed.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1800
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1801 See the `\\[py-execute-region]' docs for an account of some
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1802 subtleties, including the use of the optional ASYNC argument."
6555
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1803 (interactive "P")
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1804 (let ((old-buffer (current-buffer)))
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1805 (if py-master-file
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1806 (let* ((filename (expand-file-name py-master-file))
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1807 (buffer (or (get-file-buffer filename)
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1808 (find-file-noselect filename))))
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1809 (set-buffer buffer)))
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1810 (py-execute-region (point-min) (point-max) async)
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1811 (pop-to-buffer old-buffer)))
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1812
8378
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1813 (defun py-execute-import-or-reload (&optional async)
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1814 "Import the current buffer's file in a Python interpreter.
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1815
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1816 If the file has already been imported, then do reload instead to get
8629
239492b34f68 (py-beginning-of-def-or-class, py-end-of-def-or-class,
Barry Warsaw <barry@python.org>
parents: 8628
diff changeset
1817 the latest version.
239492b34f68 (py-beginning-of-def-or-class, py-end-of-def-or-class,
Barry Warsaw <barry@python.org>
parents: 8628
diff changeset
1818
239492b34f68 (py-beginning-of-def-or-class, py-end-of-def-or-class,
Barry Warsaw <barry@python.org>
parents: 8628
diff changeset
1819 If the file's name does not end in \".py\", then do execfile instead.
239492b34f68 (py-beginning-of-def-or-class, py-end-of-def-or-class,
Barry Warsaw <barry@python.org>
parents: 8628
diff changeset
1820
239492b34f68 (py-beginning-of-def-or-class, py-end-of-def-or-class,
Barry Warsaw <barry@python.org>
parents: 8628
diff changeset
1821 If the current buffer is not visiting a file, do `py-execute-buffer'
239492b34f68 (py-beginning-of-def-or-class, py-end-of-def-or-class,
Barry Warsaw <barry@python.org>
parents: 8628
diff changeset
1822 instead.
239492b34f68 (py-beginning-of-def-or-class, py-end-of-def-or-class,
Barry Warsaw <barry@python.org>
parents: 8628
diff changeset
1823
239492b34f68 (py-beginning-of-def-or-class, py-end-of-def-or-class,
Barry Warsaw <barry@python.org>
parents: 8628
diff changeset
1824 If the file local variable `py-master-file' is non-nil, import or
239492b34f68 (py-beginning-of-def-or-class, py-end-of-def-or-class,
Barry Warsaw <barry@python.org>
parents: 8628
diff changeset
1825 reload the named file instead of the buffer's file. The file may be
239492b34f68 (py-beginning-of-def-or-class, py-end-of-def-or-class,
Barry Warsaw <barry@python.org>
parents: 8628
diff changeset
1826 saved based on the value of `py-execute-import-or-reload-save-p'.
8378
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1827
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1828 See the `\\[py-execute-region]' docs for an account of some
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1829 subtleties, including the use of the optional ASYNC argument.
8378
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1830
8629
239492b34f68 (py-beginning-of-def-or-class, py-end-of-def-or-class,
Barry Warsaw <barry@python.org>
parents: 8628
diff changeset
1831 This may be preferable to `\\[py-execute-buffer]' because:
8378
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1832
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1833 - Definitions stay in their module rather than appearing at top
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1834 level, where they would clutter the global namespace and not affect
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1835 uses of qualified names (MODULE.NAME).
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1836
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1837 - The Python debugger gets line number information about the functions."
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1838 (interactive "P")
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1839 ;; Check file local variable py-master-file
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1840 (if py-master-file
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1841 (let* ((filename (expand-file-name py-master-file))
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1842 (buffer (or (get-file-buffer filename)
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1843 (find-file-noselect filename))))
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1844 (set-buffer buffer)))
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1845 (let ((file (buffer-file-name (current-buffer))))
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1846 (if file
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1847 (progn
8381
822e0812f20c (py-ask-about-save): New variable used in
Barry Warsaw <barry@python.org>
parents: 8380
diff changeset
1848 ;; Maybe save some buffers
822e0812f20c (py-ask-about-save): New variable used in
Barry Warsaw <barry@python.org>
parents: 8380
diff changeset
1849 (save-some-buffers (not py-ask-about-save) nil)
8378
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1850 (py-execute-string
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1851 (if (string-match "\\.py$" file)
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1852 (let ((f (file-name-sans-extension
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1853 (file-name-nondirectory file))))
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1854 (format "if globals().has_key('%s'):\n reload(%s)\nelse:\n import %s\n"
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1855 f f f))
9141
881b86398c20 (py-execute-file, py-execute-import-or-reload): Use a Python `raw'
Barry Warsaw <barry@python.org>
parents: 9136
diff changeset
1856 (format "execfile(r'%s')\n" file))
8378
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1857 async))
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1858 ;; else
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1859 (py-execute-buffer async))))
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1860
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1861
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1862 (defun py-execute-def-or-class (&optional async)
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1863 "Send the current function or class definition to a Python interpreter.
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1864
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1865 If there is a *Python* process buffer it is used.
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1866
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1867 See the `\\[py-execute-region]' docs for an account of some
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1868 subtleties, including the use of the optional ASYNC argument."
8378
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1869 (interactive "P")
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1870 (save-excursion
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1871 (py-mark-def-or-class)
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1872 ;; mark is before point
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1873 (py-execute-region (mark) (point) async)))
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1874
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1875
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1876 (defun py-execute-string (string &optional async)
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1877 "Send the argument STRING to a Python interpreter.
8378
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1878
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1879 If there is a *Python* process buffer it is used.
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1880
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1881 See the `\\[py-execute-region]' docs for an account of some
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1882 subtleties, including the use of the optional ASYNC argument."
8378
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1883 (interactive "sExecute Python command: ")
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1884 (save-excursion
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1885 (set-buffer (get-buffer-create
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1886 (generate-new-buffer-name " *Python Command*")))
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1887 (insert string)
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1888 (py-execute-region (point-min) (point-max) async)))
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1889
6663
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1890
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1891
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1892 (defun py-jump-to-exception (file line)
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1893 "Jump to the Python code in FILE at LINE."
6663
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1894 (let ((buffer (cond ((string-equal file "<stdin>")
8371
a65930f5cddb More ME patches:
Barry Warsaw <barry@python.org>
parents: 8370
diff changeset
1895 (if (consp py-exception-buffer)
a65930f5cddb More ME patches:
Barry Warsaw <barry@python.org>
parents: 8370
diff changeset
1896 (cdr py-exception-buffer)
a65930f5cddb More ME patches:
Barry Warsaw <barry@python.org>
parents: 8370
diff changeset
1897 py-exception-buffer))
6663
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1898 ((and (consp py-exception-buffer)
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1899 (string-equal file (car py-exception-buffer)))
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1900 (cdr py-exception-buffer))
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1901 ((py-safe (find-file-noselect file)))
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1902 ;; could not figure out what file the exception
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1903 ;; is pointing to, so prompt for it
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1904 (t (find-file (read-file-name "Exception file: "
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1905 nil
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1906 file t))))))
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1907 ;; Fiddle about with line number
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1908 (setq line (+ py-line-number-offset line))
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
1909
6663
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1910 (pop-to-buffer buffer)
8371
a65930f5cddb More ME patches:
Barry Warsaw <barry@python.org>
parents: 8370
diff changeset
1911 ;; Force Python mode
8378
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1912 (if (not (eq major-mode 'python-mode))
8371
a65930f5cddb More ME patches:
Barry Warsaw <barry@python.org>
parents: 8370
diff changeset
1913 (python-mode))
6663
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1914 (goto-line line)
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1915 (message "Jumping to exception in file %s on line %d" file line)))
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1916
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1917 (defun py-mouseto-exception (event)
8924
0954ad4acdfd (py-compute-indentation): Changes to the `t' condition which affect
Barry Warsaw <barry@python.org>
parents: 8911
diff changeset
1918 "Jump to the code which caused the Python exception at EVENT.
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1919 EVENT is usually a mouse click."
6663
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1920 (interactive "e")
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1921 (cond
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1922 ((fboundp 'event-point)
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1923 ;; XEmacs
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1924 (let* ((point (event-point event))
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1925 (buffer (event-buffer event))
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1926 (e (and point buffer (extent-at point buffer 'py-exc-info)))
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1927 (info (and e (extent-property e 'py-exc-info))))
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1928 (message "Event point: %d, info: %s" point info)
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1929 (and info
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1930 (py-jump-to-exception (car info) (cdr info)))
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1931 ))
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1932 ;; Emacs -- Please port this!
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1933 ))
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1934
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1935 (defun py-goto-exception ()
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1936 "Go to the line indicated by the traceback."
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1937 (interactive)
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1938 (let (file line)
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1939 (save-excursion
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1940 (beginning-of-line)
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1941 (if (looking-at py-traceback-line-re)
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1942 (setq file (match-string 1)
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1943 line (string-to-int (match-string 2)))))
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1944 (if (not file)
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1945 (error "Not on a traceback line"))
6663
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1946 (py-jump-to-exception file line)))
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1947
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1948 (defun py-find-next-exception (start buffer searchdir errwhere)
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1949 "Find the next Python exception and jump to the code that caused it.
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1950 START is the buffer position in BUFFER from which to begin searching
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1951 for an exception. SEARCHDIR is a function, either
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1952 `re-search-backward' or `re-search-forward' indicating the direction
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1953 to search. ERRWHERE is used in an error message if the limit (top or
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1954 bottom) of the trackback stack is encountered."
6663
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1955 (let (file line)
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1956 (save-excursion
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1957 (set-buffer buffer)
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1958 (goto-char (py-point start))
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1959 (if (funcall searchdir py-traceback-line-re nil t)
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1960 (setq file (match-string 1)
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1961 line (string-to-int (match-string 2)))))
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1962 (if (and file line)
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1963 (py-jump-to-exception file line)
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1964 (error "%s of traceback" errwhere))))
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1965
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1966 (defun py-down-exception (&optional bottom)
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1967 "Go to the next line down in the traceback.
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1968 With \\[univeral-argument] (programmatically, optional argument
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1969 BOTTOM), jump to the bottom (innermost) exception in the exception
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1970 stack."
6663
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1971 (interactive "P")
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1972 (let* ((proc (get-process "Python"))
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1973 (buffer (if proc "*Python*" py-output-buffer)))
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1974 (if bottom
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1975 (py-find-next-exception 'eob buffer 're-search-backward "Bottom")
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1976 (py-find-next-exception 'eol buffer 're-search-forward "Bottom"))))
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1977
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1978 (defun py-up-exception (&optional top)
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1979 "Go to the previous line up in the traceback.
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1980 With \\[universal-argument] (programmatically, optional argument TOP)
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1981 jump to the top (outermost) exception in the exception stack."
6663
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1982 (interactive "P")
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1983 (let* ((proc (get-process "Python"))
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1984 (buffer (if proc "*Python*" py-output-buffer)))
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1985 (if top
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1986 (py-find-next-exception 'bob buffer 're-search-forward "Top")
6683
cb889b678053 (py-traceback-line-re): Relaxation of regexp to catch SyntaxErrors.
Barry Warsaw <barry@python.org>
parents: 6679
diff changeset
1987 (py-find-next-exception 'bol buffer 're-search-backward "Top"))))
6663
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1988
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
1989
6556
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
1990 ;; Electric deletion
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
1991 (defun py-electric-backspace (arg)
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1992 "Delete preceding character or levels of indentation.
6556
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
1993 Deletion is performed by calling the function in `py-backspace-function'
4764
88714fbf9a06 (py-delete-function): new variable
Barry Warsaw <barry@python.org>
parents: 4763
diff changeset
1994 with a single argument (the number of characters to delete).
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1995
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1996 If point is at the leftmost column, delete the preceding newline.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1997
6556
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
1998 Otherwise, if point is at the leftmost non-whitespace character of a
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
1999 line that is neither a continuation line nor a non-indenting comment
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
2000 line, or if point is at the end of a blank line, this command reduces
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
2001 the indentation to match that of the line that opened the current
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
2002 block of code. The line that opened the block is displayed in the
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2003 echo area to help you keep track of where you are. With
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2004 \\[universal-argument] dedents that many blocks (but not past column
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2005 zero).
6556
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
2006
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
2007 Otherwise the preceding character is deleted, converting a tab to
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
2008 spaces if needed so that only a single column position is deleted.
10877
2669ac7cd76a (py-electric-backspace): I'm not sure this function should be special
Barry Warsaw <barry@python.org>
parents: 10876
diff changeset
2009 \\[universal-argument] specifies how many characters to delete;
2669ac7cd76a (py-electric-backspace): I'm not sure this function should be special
Barry Warsaw <barry@python.org>
parents: 10876
diff changeset
2010 default is 1.
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2011
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2012 When used programmatically, argument ARG specifies the number of
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2013 blocks to dedent, or the number of characters to delete, as indicated
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2014 above."
3744
ffdf1f06cf8b (py-delete-char): Obey numeric argument.
Barry Warsaw <barry@python.org>
parents: 3743
diff changeset
2015 (interactive "*p")
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2016 (if (or (/= (current-indentation) (current-column))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2017 (bolp)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2018 (py-continuation-line-p)
10877
2669ac7cd76a (py-electric-backspace): I'm not sure this function should be special
Barry Warsaw <barry@python.org>
parents: 10876
diff changeset
2019 ; (not py-honor-comment-indentation)
2669ac7cd76a (py-electric-backspace): I'm not sure this function should be special
Barry Warsaw <barry@python.org>
parents: 10876
diff changeset
2020 ; (looking-at "#[^ \t\n]") ; non-indenting #
2669ac7cd76a (py-electric-backspace): I'm not sure this function should be special
Barry Warsaw <barry@python.org>
parents: 10876
diff changeset
2021 )
6556
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
2022 (funcall py-backspace-function arg)
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2023 ;; else indent the same as the colon line that opened the block
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2024 ;; force non-blank so py-goto-block-up doesn't ignore it
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2025 (insert-char ?* 1)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2026 (backward-char)
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2027 (let ((base-indent 0) ; indentation of base line
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2028 (base-text "") ; and text of base line
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2029 (base-found-p nil))
3744
ffdf1f06cf8b (py-delete-char): Obey numeric argument.
Barry Warsaw <barry@python.org>
parents: 3743
diff changeset
2030 (save-excursion
6556
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
2031 (while (< 0 arg)
3744
ffdf1f06cf8b (py-delete-char): Obey numeric argument.
Barry Warsaw <barry@python.org>
parents: 3743
diff changeset
2032 (condition-case nil ; in case no enclosing block
ffdf1f06cf8b (py-delete-char): Obey numeric argument.
Barry Warsaw <barry@python.org>
parents: 3743
diff changeset
2033 (progn
ffdf1f06cf8b (py-delete-char): Obey numeric argument.
Barry Warsaw <barry@python.org>
parents: 3743
diff changeset
2034 (py-goto-block-up 'no-mark)
ffdf1f06cf8b (py-delete-char): Obey numeric argument.
Barry Warsaw <barry@python.org>
parents: 3743
diff changeset
2035 (setq base-indent (current-indentation)
ffdf1f06cf8b (py-delete-char): Obey numeric argument.
Barry Warsaw <barry@python.org>
parents: 3743
diff changeset
2036 base-text (py-suck-up-leading-text)
ffdf1f06cf8b (py-delete-char): Obey numeric argument.
Barry Warsaw <barry@python.org>
parents: 3743
diff changeset
2037 base-found-p t))
ffdf1f06cf8b (py-delete-char): Obey numeric argument.
Barry Warsaw <barry@python.org>
parents: 3743
diff changeset
2038 (error nil))
6556
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
2039 (setq arg (1- arg))))
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2040 (delete-char 1) ; toss the dummy character
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2041 (delete-horizontal-space)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2042 (indent-to base-indent)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2043 (if base-found-p
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2044 (message "Closes block: %s" base-text)))))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2045
6556
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
2046
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
2047 (defun py-electric-delete (arg)
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2048 "Delete preceding or following character or levels of whitespace.
6556
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
2049
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
2050 The behavior of this function depends on the variable
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
2051 `delete-key-deletes-forward'. If this variable is nil (or does not
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2052 exist, as in older Emacsen and non-XEmacs versions), then this
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2053 function behaves identically to \\[c-electric-backspace].
6556
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
2054
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
2055 If `delete-key-deletes-forward' is non-nil and is supported in your
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
2056 Emacs, then deletion occurs in the forward direction, by calling the
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2057 function in `py-delete-function'.
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2058
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2059 \\[universal-argument] (programmatically, argument ARG) specifies the
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2060 number of characters to delete (default is 1)."
6556
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
2061 (interactive "*p")
9897
7bdef4bedd5c (py-electric-delete): Implement the XEmacs 21 blessed way of checking
Barry Warsaw <barry@python.org>
parents: 9827
diff changeset
2062 (if (or (and (fboundp 'delete-forward-p) ;XEmacs 21
7bdef4bedd5c (py-electric-delete): Implement the XEmacs 21 blessed way of checking
Barry Warsaw <barry@python.org>
parents: 9827
diff changeset
2063 (delete-forward-p))
7bdef4bedd5c (py-electric-delete): Implement the XEmacs 21 blessed way of checking
Barry Warsaw <barry@python.org>
parents: 9827
diff changeset
2064 (and (boundp 'delete-key-deletes-forward) ;XEmacs 20
7bdef4bedd5c (py-electric-delete): Implement the XEmacs 21 blessed way of checking
Barry Warsaw <barry@python.org>
parents: 9827
diff changeset
2065 delete-key-deletes-forward))
6556
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
2066 (funcall py-delete-function arg)
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
2067 (py-electric-backspace arg)))
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
2068
2513
56e25114d438 (py-delete-char): must have 'supersede value for 'delete-selection and
Barry Warsaw <barry@python.org>
parents: 2499
diff changeset
2069 ;; required for pending-del and delsel modes
30033
7058dcf733d4 make pending-delete/delete-selection mode work with py-electric-colon
Skip Montanaro <skip@pobox.com>
parents: 30031
diff changeset
2070 (put 'py-electric-colon 'delete-selection t) ;delsel
7058dcf733d4 make pending-delete/delete-selection mode work with py-electric-colon
Skip Montanaro <skip@pobox.com>
parents: 30031
diff changeset
2071 (put 'py-electric-colon 'pending-delete t) ;pending-del
6556
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
2072 (put 'py-electric-backspace 'delete-selection 'supersede) ;delsel
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
2073 (put 'py-electric-backspace 'pending-delete 'supersede) ;pending-del
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
2074 (put 'py-electric-delete 'delete-selection 'supersede) ;delsel
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
2075 (put 'py-electric-delete 'pending-delete 'supersede) ;pending-del
2513
56e25114d438 (py-delete-char): must have 'supersede value for 'delete-selection and
Barry Warsaw <barry@python.org>
parents: 2499
diff changeset
2076
6556
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
2077
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
2078
4479
2343803318e4 (py-indent-line): take an optional universal argument which says to
Barry Warsaw <barry@python.org>
parents: 4346
diff changeset
2079 (defun py-indent-line (&optional arg)
2343803318e4 (py-indent-line): take an optional universal argument which says to
Barry Warsaw <barry@python.org>
parents: 4346
diff changeset
2080 "Fix the indentation of the current line according to Python rules.
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2081 With \\[universal-argument] (programmatically, the optional argument
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2082 ARG non-nil), ignore dedenting rules for block closing statements
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2083 (e.g. return, raise, break, continue, pass)
4479
2343803318e4 (py-indent-line): take an optional universal argument which says to
Barry Warsaw <barry@python.org>
parents: 4346
diff changeset
2084
2343803318e4 (py-indent-line): take an optional universal argument which says to
Barry Warsaw <barry@python.org>
parents: 4346
diff changeset
2085 This function is normally bound to `indent-line-function' so
2343803318e4 (py-indent-line): take an optional universal argument which says to
Barry Warsaw <barry@python.org>
parents: 4346
diff changeset
2086 \\[indent-for-tab-command] will call it."
2343803318e4 (py-indent-line): take an optional universal argument which says to
Barry Warsaw <barry@python.org>
parents: 4346
diff changeset
2087 (interactive "P")
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2088 (let* ((ci (current-indentation))
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2089 (move-to-indentation-p (<= (current-column) ci))
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
2090 (need (py-compute-indentation (not arg)))
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
2091 (cc (current-column)))
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
2092 ;; dedent out a level if previous command was the same unless we're in
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
2093 ;; column 1
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
2094 (if (and (equal last-command this-command)
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
2095 (/= cc 0))
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
2096 (progn
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
2097 (beginning-of-line)
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
2098 (delete-horizontal-space)
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
2099 (indent-to (* (/ (- cc 1) py-indent-offset) py-indent-offset)))
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
2100 (progn
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
2101 ;; see if we need to dedent
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
2102 (if (py-outdent-p)
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
2103 (setq need (- need py-indent-offset)))
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
2104 (if (or py-tab-always-indent
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
2105 move-to-indentation-p)
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
2106 (progn (if (/= ci need)
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
2107 (save-excursion
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
2108 (beginning-of-line)
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
2109 (delete-horizontal-space)
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
2110 (indent-to need)))
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
2111 (if move-to-indentation-p (back-to-indentation)))
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
2112 (insert-tab))))))
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2113
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2114 (defun py-newline-and-indent ()
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2115 "Strives to act like the Emacs `newline-and-indent'.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2116 This is just `strives to' because correct indentation can't be computed
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2117 from scratch for Python code. In general, deletes the whitespace before
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2118 point, inserts a newline, and takes an educated guess as to how you want
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2119 the new line indented."
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2120 (interactive)
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2121 (let ((ci (current-indentation)))
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2122 (if (< ci (current-column)) ; if point beyond indentation
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2123 (newline-and-indent)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2124 ;; else try to act like newline-and-indent "normally" acts
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2125 (beginning-of-line)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2126 (insert-char ?\n 1)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2127 (move-to-column ci))))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2128
4479
2343803318e4 (py-indent-line): take an optional universal argument which says to
Barry Warsaw <barry@python.org>
parents: 4346
diff changeset
2129 (defun py-compute-indentation (honor-block-close-p)
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2130 "Compute Python indentation.
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2131 When HONOR-BLOCK-CLOSE-P is non-nil, statements such as `return',
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2132 `raise', `break', `continue', and `pass' force one level of
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2133 dedenting."
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2134 (save-excursion
7262
c09907104092 (py-compute-indentation): Several changes made to improve navigation
Barry Warsaw <barry@python.org>
parents: 7201
diff changeset
2135 (beginning-of-line)
6663
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
2136 (let* ((bod (py-point 'bod))
6678
de2f8f494ae3 (py-compute-indentation): Check for multiline stringness and
Barry Warsaw <barry@python.org>
parents: 6677
diff changeset
2137 (pps (parse-partial-sexp bod (point)))
9639
da1dd3e54b7a (py-goto-beginning-of-tqs): Finds the beginning of the triple quoted
Barry Warsaw <barry@python.org>
parents: 9503
diff changeset
2138 (boipps (parse-partial-sexp bod (py-point 'boi)))
da1dd3e54b7a (py-goto-beginning-of-tqs): Finds the beginning of the triple quoted
Barry Warsaw <barry@python.org>
parents: 9503
diff changeset
2139 placeholder)
3114
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2140 (cond
6663
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
2141 ;; are we inside a multi-line string or comment?
6678
de2f8f494ae3 (py-compute-indentation): Check for multiline stringness and
Barry Warsaw <barry@python.org>
parents: 6677
diff changeset
2142 ((or (and (nth 3 pps) (nth 3 boipps))
de2f8f494ae3 (py-compute-indentation): Check for multiline stringness and
Barry Warsaw <barry@python.org>
parents: 6677
diff changeset
2143 (and (nth 4 pps) (nth 4 boipps)))
3114
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2144 (save-excursion
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2145 (if (not py-align-multiline-strings-p) 0
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2146 ;; skip back over blank & non-indenting comment lines
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2147 ;; note: will skip a blank or non-indenting comment line
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2148 ;; that happens to be a continuation line too
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2149 (re-search-backward "^[ \t]*\\([^ \t\n#]\\|#[ \t\n]\\)" nil 'move)
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2150 (back-to-indentation)
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2151 (current-column))))
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2152 ;; are we on a continuation line?
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2153 ((py-continuation-line-p)
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2154 (let ((startpos (point))
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2155 (open-bracket-pos (py-nesting-level))
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
2156 endpos searching found state cind cline)
3114
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2157 (if open-bracket-pos
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2158 (progn
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
2159 (setq endpos (py-point 'bol))
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
2160 (py-goto-initial-line)
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
2161 (setq cind (current-indentation))
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
2162 (setq cline cind)
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
2163 (dolist (bp
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
2164 (nth 9 (save-excursion
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
2165 (parse-partial-sexp (point) endpos)))
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
2166 cind)
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
2167 (if (search-forward "\n" bp t) (setq cline cind))
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
2168 (goto-char (1+ bp))
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
2169 (skip-chars-forward " \t")
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
2170 (setq cind (if (memq (following-char) '(?\n ?# ?\\))
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
2171 (+ cline py-indent-offset)
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
2172 (current-column)))))
3114
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2173 ;; else on backslash continuation line
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2174 (forward-line -1)
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2175 (if (py-continuation-line-p) ; on at least 3rd line in block
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2176 (current-indentation) ; so just continue the pattern
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2177 ;; else started on 2nd line in block, so indent more.
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2178 ;; if base line is an assignment with a start on a RHS,
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2179 ;; indent to 2 beyond the leftmost "="; else skip first
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2180 ;; chunk of non-whitespace characters on base line, + 1 more
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2181 ;; column
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2182 (end-of-line)
18150
9ce8a995bf12 (py-continuation-offset): New variable which controls how much to
Barry Warsaw <barry@python.org>
parents: 17422
diff changeset
2183 (setq endpos (point)
9ce8a995bf12 (py-continuation-offset): New variable which controls how much to
Barry Warsaw <barry@python.org>
parents: 17422
diff changeset
2184 searching t)
3114
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2185 (back-to-indentation)
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2186 (setq startpos (point))
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2187 ;; look at all "=" from left to right, stopping at first
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2188 ;; one not nested in a list or string
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2189 (while searching
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2190 (skip-chars-forward "^=" endpos)
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2191 (if (= (point) endpos)
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2192 (setq searching nil)
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2193 (forward-char 1)
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2194 (setq state (parse-partial-sexp startpos (point)))
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2195 (if (and (zerop (car state)) ; not in a bracket
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2196 (null (nth 3 state))) ; & not in a string
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2197 (progn
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2198 (setq searching nil) ; done searching in any case
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2199 (setq found
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2200 (not (or
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2201 (eq (following-char) ?=)
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2202 (memq (char-after (- (point) 2))
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2203 '(?< ?> ?!)))))))))
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2204 (if (or (not found) ; not an assignment
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2205 (looking-at "[ \t]*\\\\")) ; <=><spaces><backslash>
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2206 (progn
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2207 (goto-char startpos)
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2208 (skip-chars-forward "^ \t\n")))
18412
a29bef457ed8 (py-continuation-offset): Update docstring to describe that this
Barry Warsaw <barry@python.org>
parents: 18156
diff changeset
2209 ;; if this is a continuation for a block opening
a29bef457ed8 (py-continuation-offset): Update docstring to describe that this
Barry Warsaw <barry@python.org>
parents: 18156
diff changeset
2210 ;; statement, add some extra offset.
a29bef457ed8 (py-continuation-offset): Update docstring to describe that this
Barry Warsaw <barry@python.org>
parents: 18156
diff changeset
2211 (+ (current-column) (if (py-statement-opens-block-p)
a29bef457ed8 (py-continuation-offset): Update docstring to describe that this
Barry Warsaw <barry@python.org>
parents: 18156
diff changeset
2212 py-continuation-offset 0)
a29bef457ed8 (py-continuation-offset): Update docstring to describe that this
Barry Warsaw <barry@python.org>
parents: 18156
diff changeset
2213 1)
18150
9ce8a995bf12 (py-continuation-offset): New variable which controls how much to
Barry Warsaw <barry@python.org>
parents: 17422
diff changeset
2214 ))))
3114
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2215
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2216 ;; not on a continuation line
3919
f487793d6018 (py-mode): comment-start is now "# " so indent-for-comment does the
Barry Warsaw <barry@python.org>
parents: 3905
diff changeset
2217 ((bobp) (current-indentation))
3114
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2218
3919
f487793d6018 (py-mode): comment-start is now "# " so indent-for-comment does the
Barry Warsaw <barry@python.org>
parents: 3905
diff changeset
2219 ;; Dfn: "Indenting comment line". A line containing only a
f487793d6018 (py-mode): comment-start is now "# " so indent-for-comment does the
Barry Warsaw <barry@python.org>
parents: 3905
diff changeset
2220 ;; comment, but which is treated like a statement for
f487793d6018 (py-mode): comment-start is now "# " so indent-for-comment does the
Barry Warsaw <barry@python.org>
parents: 3905
diff changeset
2221 ;; indentation calculation purposes. Such lines are only
f487793d6018 (py-mode): comment-start is now "# " so indent-for-comment does the
Barry Warsaw <barry@python.org>
parents: 3905
diff changeset
2222 ;; treated specially by the mode; they are not treated
f487793d6018 (py-mode): comment-start is now "# " so indent-for-comment does the
Barry Warsaw <barry@python.org>
parents: 3905
diff changeset
2223 ;; specially by the Python interpreter.
f487793d6018 (py-mode): comment-start is now "# " so indent-for-comment does the
Barry Warsaw <barry@python.org>
parents: 3905
diff changeset
2224
f487793d6018 (py-mode): comment-start is now "# " so indent-for-comment does the
Barry Warsaw <barry@python.org>
parents: 3905
diff changeset
2225 ;; The rules for indenting comment lines are a line where:
f487793d6018 (py-mode): comment-start is now "# " so indent-for-comment does the
Barry Warsaw <barry@python.org>
parents: 3905
diff changeset
2226 ;; - the first non-whitespace character is `#', and
f487793d6018 (py-mode): comment-start is now "# " so indent-for-comment does the
Barry Warsaw <barry@python.org>
parents: 3905
diff changeset
2227 ;; - the character following the `#' is whitespace, and
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2228 ;; - the line is dedented with respect to (i.e. to the left
3919
f487793d6018 (py-mode): comment-start is now "# " so indent-for-comment does the
Barry Warsaw <barry@python.org>
parents: 3905
diff changeset
2229 ;; of) the indentation of the preceding non-blank line.
f487793d6018 (py-mode): comment-start is now "# " so indent-for-comment does the
Barry Warsaw <barry@python.org>
parents: 3905
diff changeset
2230
f487793d6018 (py-mode): comment-start is now "# " so indent-for-comment does the
Barry Warsaw <barry@python.org>
parents: 3905
diff changeset
2231 ;; The first non-blank line following an indenting comment
f487793d6018 (py-mode): comment-start is now "# " so indent-for-comment does the
Barry Warsaw <barry@python.org>
parents: 3905
diff changeset
2232 ;; line is given the same amount of indentation as the
f487793d6018 (py-mode): comment-start is now "# " so indent-for-comment does the
Barry Warsaw <barry@python.org>
parents: 3905
diff changeset
2233 ;; indenting comment line.
f487793d6018 (py-mode): comment-start is now "# " so indent-for-comment does the
Barry Warsaw <barry@python.org>
parents: 3905
diff changeset
2234
f487793d6018 (py-mode): comment-start is now "# " so indent-for-comment does the
Barry Warsaw <barry@python.org>
parents: 3905
diff changeset
2235 ;; All other comment-only lines are ignored for indentation
f487793d6018 (py-mode): comment-start is now "# " so indent-for-comment does the
Barry Warsaw <barry@python.org>
parents: 3905
diff changeset
2236 ;; purposes.
f487793d6018 (py-mode): comment-start is now "# " so indent-for-comment does the
Barry Warsaw <barry@python.org>
parents: 3905
diff changeset
2237
f487793d6018 (py-mode): comment-start is now "# " so indent-for-comment does the
Barry Warsaw <barry@python.org>
parents: 3905
diff changeset
2238 ;; Are we looking at a comment-only line which is *not* an
8370
f2b0859fece3 #Documentation and comment typos patch given by Michael Ernst. More
Barry Warsaw <barry@python.org>
parents: 8070
diff changeset
2239 ;; indenting comment line? If so, we assume that it's been
3919
f487793d6018 (py-mode): comment-start is now "# " so indent-for-comment does the
Barry Warsaw <barry@python.org>
parents: 3905
diff changeset
2240 ;; placed at the desired indentation, so leave it alone.
f487793d6018 (py-mode): comment-start is now "# " so indent-for-comment does the
Barry Warsaw <barry@python.org>
parents: 3905
diff changeset
2241 ;; Indenting comment lines are aligned as statements down
f487793d6018 (py-mode): comment-start is now "# " so indent-for-comment does the
Barry Warsaw <barry@python.org>
parents: 3905
diff changeset
2242 ;; below.
f487793d6018 (py-mode): comment-start is now "# " so indent-for-comment does the
Barry Warsaw <barry@python.org>
parents: 3905
diff changeset
2243 ((and (looking-at "[ \t]*#[^ \t\n]")
f487793d6018 (py-mode): comment-start is now "# " so indent-for-comment does the
Barry Warsaw <barry@python.org>
parents: 3905
diff changeset
2244 ;; NOTE: this test will not be performed in older Emacsen
f487793d6018 (py-mode): comment-start is now "# " so indent-for-comment does the
Barry Warsaw <barry@python.org>
parents: 3905
diff changeset
2245 (fboundp 'forward-comment)
f487793d6018 (py-mode): comment-start is now "# " so indent-for-comment does the
Barry Warsaw <barry@python.org>
parents: 3905
diff changeset
2246 (<= (current-indentation)
f487793d6018 (py-mode): comment-start is now "# " so indent-for-comment does the
Barry Warsaw <barry@python.org>
parents: 3905
diff changeset
2247 (save-excursion
f487793d6018 (py-mode): comment-start is now "# " so indent-for-comment does the
Barry Warsaw <barry@python.org>
parents: 3905
diff changeset
2248 (forward-comment (- (point-max)))
f487793d6018 (py-mode): comment-start is now "# " so indent-for-comment does the
Barry Warsaw <barry@python.org>
parents: 3905
diff changeset
2249 (current-indentation))))
3114
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2250 (current-indentation))
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2251
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2252 ;; else indentation based on that of the statement that
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2253 ;; precedes us; use the first line of that statement to
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2254 ;; establish the base, in case the user forced a non-std
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2255 ;; indentation for the continuation lines (if any)
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2256 (t
3093
b3a8013cb4fa (py-compute-indentation): when inside a comment, indent to under the
Barry Warsaw <barry@python.org>
parents: 2799
diff changeset
2257 ;; skip back over blank & non-indenting comment lines note:
b3a8013cb4fa (py-compute-indentation): when inside a comment, indent to under the
Barry Warsaw <barry@python.org>
parents: 2799
diff changeset
2258 ;; will skip a blank or non-indenting comment line that
3426
6402be2689c5 (py-compute-indentation): fix skipping backwards over comments by
Barry Warsaw <barry@python.org>
parents: 3348
diff changeset
2259 ;; happens to be a continuation line too. use fast Emacs 19
6402be2689c5 (py-compute-indentation): fix skipping backwards over comments by
Barry Warsaw <barry@python.org>
parents: 3348
diff changeset
2260 ;; function if it's there.
3434
529f4d9cbe3d (py-honor-comment-indentation, py-compute-indentation): allow other
Barry Warsaw <barry@python.org>
parents: 3429
diff changeset
2261 (if (and (eq py-honor-comment-indentation nil)
3429
da86b3b54363 (py-honor-comment-indentation): new variable.
Barry Warsaw <barry@python.org>
parents: 3428
diff changeset
2262 (fboundp 'forward-comment))
3426
6402be2689c5 (py-compute-indentation): fix skipping backwards over comments by
Barry Warsaw <barry@python.org>
parents: 3348
diff changeset
2263 (forward-comment (- (point-max)))
9136
e1b710e30acf (py-block-comment-prefix): Remove trailing space. Also explain that
Barry Warsaw <barry@python.org>
parents: 9106
diff changeset
2264 (let ((prefix-re (concat py-block-comment-prefix "[ \t]*"))
e1b710e30acf (py-block-comment-prefix): Remove trailing space. Also explain that
Barry Warsaw <barry@python.org>
parents: 9106
diff changeset
2265 done)
3434
529f4d9cbe3d (py-honor-comment-indentation, py-compute-indentation): allow other
Barry Warsaw <barry@python.org>
parents: 3429
diff changeset
2266 (while (not done)
8924
0954ad4acdfd (py-compute-indentation): Changes to the `t' condition which affect
Barry Warsaw <barry@python.org>
parents: 8911
diff changeset
2267 (re-search-backward "^[ \t]*\\([^ \t\n#]\\|#\\)" nil 'move)
0954ad4acdfd (py-compute-indentation): Changes to the `t' condition which affect
Barry Warsaw <barry@python.org>
parents: 8911
diff changeset
2268 (setq done (or (bobp)
0954ad4acdfd (py-compute-indentation): Changes to the `t' condition which affect
Barry Warsaw <barry@python.org>
parents: 8911
diff changeset
2269 (and (eq py-honor-comment-indentation t)
0954ad4acdfd (py-compute-indentation): Changes to the `t' condition which affect
Barry Warsaw <barry@python.org>
parents: 8911
diff changeset
2270 (save-excursion
0954ad4acdfd (py-compute-indentation): Changes to the `t' condition which affect
Barry Warsaw <barry@python.org>
parents: 8911
diff changeset
2271 (back-to-indentation)
9136
e1b710e30acf (py-block-comment-prefix): Remove trailing space. Also explain that
Barry Warsaw <barry@python.org>
parents: 9106
diff changeset
2272 (not (looking-at prefix-re))
8924
0954ad4acdfd (py-compute-indentation): Changes to the `t' condition which affect
Barry Warsaw <barry@python.org>
parents: 8911
diff changeset
2273 ))
0954ad4acdfd (py-compute-indentation): Changes to the `t' condition which affect
Barry Warsaw <barry@python.org>
parents: 8911
diff changeset
2274 (and (not (eq py-honor-comment-indentation t))
0954ad4acdfd (py-compute-indentation): Changes to the `t' condition which affect
Barry Warsaw <barry@python.org>
parents: 8911
diff changeset
2275 (save-excursion
0954ad4acdfd (py-compute-indentation): Changes to the `t' condition which affect
Barry Warsaw <barry@python.org>
parents: 8911
diff changeset
2276 (back-to-indentation)
22336
029e4cbd2312 backport bwarsaw's checkin of
Michael W. Hudson <mwh@python.net>
parents: 18415
diff changeset
2277 (and (not (looking-at prefix-re))
029e4cbd2312 backport bwarsaw's checkin of
Michael W. Hudson <mwh@python.net>
parents: 18415
diff changeset
2278 (or (looking-at "[^#]")
029e4cbd2312 backport bwarsaw's checkin of
Michael W. Hudson <mwh@python.net>
parents: 18415
diff changeset
2279 (not (zerop (current-column)))
029e4cbd2312 backport bwarsaw's checkin of
Michael W. Hudson <mwh@python.net>
parents: 18415
diff changeset
2280 ))
029e4cbd2312 backport bwarsaw's checkin of
Michael W. Hudson <mwh@python.net>
parents: 18415
diff changeset
2281 ))
8924
0954ad4acdfd (py-compute-indentation): Changes to the `t' condition which affect
Barry Warsaw <barry@python.org>
parents: 8911
diff changeset
2282 ))
3434
529f4d9cbe3d (py-honor-comment-indentation, py-compute-indentation): allow other
Barry Warsaw <barry@python.org>
parents: 3429
diff changeset
2283 )))
3114
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2284 ;; if we landed inside a string, go to the beginning of that
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2285 ;; string. this handles triple quoted, multi-line spanning
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2286 ;; strings.
9639
da1dd3e54b7a (py-goto-beginning-of-tqs): Finds the beginning of the triple quoted
Barry Warsaw <barry@python.org>
parents: 9503
diff changeset
2287 (py-goto-beginning-of-tqs (nth 3 (parse-partial-sexp bod (point))))
7143
3f0be7de7ca5 (py-compute-indentation): In the most common case, where indentation
Barry Warsaw <barry@python.org>
parents: 7142
diff changeset
2288 ;; now skip backward over continued lines
9639
da1dd3e54b7a (py-goto-beginning-of-tqs): Finds the beginning of the triple quoted
Barry Warsaw <barry@python.org>
parents: 9503
diff changeset
2289 (setq placeholder (point))
3114
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
2290 (py-goto-initial-line)
9639
da1dd3e54b7a (py-goto-beginning-of-tqs): Finds the beginning of the triple quoted
Barry Warsaw <barry@python.org>
parents: 9503
diff changeset
2291 ;; we may *now* have landed in a TQS, so find the beginning of
da1dd3e54b7a (py-goto-beginning-of-tqs): Finds the beginning of the triple quoted
Barry Warsaw <barry@python.org>
parents: 9503
diff changeset
2292 ;; this string.
da1dd3e54b7a (py-goto-beginning-of-tqs): Finds the beginning of the triple quoted
Barry Warsaw <barry@python.org>
parents: 9503
diff changeset
2293 (py-goto-beginning-of-tqs
da1dd3e54b7a (py-goto-beginning-of-tqs): Finds the beginning of the triple quoted
Barry Warsaw <barry@python.org>
parents: 9503
diff changeset
2294 (save-excursion (nth 3 (parse-partial-sexp
da1dd3e54b7a (py-goto-beginning-of-tqs): Finds the beginning of the triple quoted
Barry Warsaw <barry@python.org>
parents: 9503
diff changeset
2295 placeholder (point)))))
3900
cba4ce15a0d5 (py-statement-closes-block-p, py-compute-indentation): Outdent one
Barry Warsaw <barry@python.org>
parents: 3818
diff changeset
2296 (+ (current-indentation)
cba4ce15a0d5 (py-statement-closes-block-p, py-compute-indentation): Outdent one
Barry Warsaw <barry@python.org>
parents: 3818
diff changeset
2297 (if (py-statement-opens-block-p)
cba4ce15a0d5 (py-statement-closes-block-p, py-compute-indentation): Outdent one
Barry Warsaw <barry@python.org>
parents: 3818
diff changeset
2298 py-indent-offset
4479
2343803318e4 (py-indent-line): take an optional universal argument which says to
Barry Warsaw <barry@python.org>
parents: 4346
diff changeset
2299 (if (and honor-block-close-p (py-statement-closes-block-p))
3900
cba4ce15a0d5 (py-statement-closes-block-p, py-compute-indentation): Outdent one
Barry Warsaw <barry@python.org>
parents: 3818
diff changeset
2300 (- py-indent-offset)
cba4ce15a0d5 (py-statement-closes-block-p, py-compute-indentation): Outdent one
Barry Warsaw <barry@python.org>
parents: 3818
diff changeset
2301 0)))
cba4ce15a0d5 (py-statement-closes-block-p, py-compute-indentation): Outdent one
Barry Warsaw <barry@python.org>
parents: 3818
diff changeset
2302 )))))
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2303
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2304 (defun py-guess-indent-offset (&optional global)
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2305 "Guess a good value for, and change, `py-indent-offset'.
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2306
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2307 By default, make a buffer-local copy of `py-indent-offset' with the
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2308 new value, so that other Python buffers are not affected. With
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2309 \\[universal-argument] (programmatically, optional argument GLOBAL),
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2310 change the global value of `py-indent-offset'. This affects all
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2311 Python buffers (that don't have their own buffer-local copy), both
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2312 those currently existing and those created later in the Emacs session.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2313
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2314 Some people use a different value for `py-indent-offset' than you use.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2315 There's no excuse for such foolishness, but sometimes you have to deal
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2316 with their ugly code anyway. This function examines the file and sets
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2317 `py-indent-offset' to what it thinks it was when they created the
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2318 mess.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2319
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2320 Specifically, it searches forward from the statement containing point,
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2321 looking for a line that opens a block of code. `py-indent-offset' is
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2322 set to the difference in indentation between that line and the Python
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2323 statement following it. If the search doesn't succeed going forward,
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2324 it's tried again going backward."
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2325 (interactive "P") ; raw prefix arg
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2326 (let (new-value
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2327 (start (point))
7725
663367ca13f8 (py-in-literal, py-fast-in-literal): New functions (mostly) stolen
Barry Warsaw <barry@python.org>
parents: 7724
diff changeset
2328 (restart (point))
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2329 (found nil)
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2330 colon-indent)
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2331 (py-goto-initial-line)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2332 (while (not (or found (eobp)))
7725
663367ca13f8 (py-in-literal, py-fast-in-literal): New functions (mostly) stolen
Barry Warsaw <barry@python.org>
parents: 7724
diff changeset
2333 (when (and (re-search-forward ":[ \t]*\\($\\|[#\\]\\)" nil 'move)
663367ca13f8 (py-in-literal, py-fast-in-literal): New functions (mostly) stolen
Barry Warsaw <barry@python.org>
parents: 7724
diff changeset
2334 (not (py-in-literal restart)))
663367ca13f8 (py-in-literal, py-fast-in-literal): New functions (mostly) stolen
Barry Warsaw <barry@python.org>
parents: 7724
diff changeset
2335 (setq restart (point))
663367ca13f8 (py-in-literal, py-fast-in-literal): New functions (mostly) stolen
Barry Warsaw <barry@python.org>
parents: 7724
diff changeset
2336 (py-goto-initial-line)
663367ca13f8 (py-in-literal, py-fast-in-literal): New functions (mostly) stolen
Barry Warsaw <barry@python.org>
parents: 7724
diff changeset
2337 (if (py-statement-opens-block-p)
663367ca13f8 (py-in-literal, py-fast-in-literal): New functions (mostly) stolen
Barry Warsaw <barry@python.org>
parents: 7724
diff changeset
2338 (setq found t)
663367ca13f8 (py-in-literal, py-fast-in-literal): New functions (mostly) stolen
Barry Warsaw <barry@python.org>
parents: 7724
diff changeset
2339 (goto-char restart))))
663367ca13f8 (py-in-literal, py-fast-in-literal): New functions (mostly) stolen
Barry Warsaw <barry@python.org>
parents: 7724
diff changeset
2340 (unless found
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2341 (goto-char start)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2342 (py-goto-initial-line)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2343 (while (not (or found (bobp)))
7725
663367ca13f8 (py-in-literal, py-fast-in-literal): New functions (mostly) stolen
Barry Warsaw <barry@python.org>
parents: 7724
diff changeset
2344 (setq found (and
663367ca13f8 (py-in-literal, py-fast-in-literal): New functions (mostly) stolen
Barry Warsaw <barry@python.org>
parents: 7724
diff changeset
2345 (re-search-backward ":[ \t]*\\($\\|[#\\]\\)" nil 'move)
663367ca13f8 (py-in-literal, py-fast-in-literal): New functions (mostly) stolen
Barry Warsaw <barry@python.org>
parents: 7724
diff changeset
2346 (or (py-goto-initial-line) t) ; always true -- side effect
663367ca13f8 (py-in-literal, py-fast-in-literal): New functions (mostly) stolen
Barry Warsaw <barry@python.org>
parents: 7724
diff changeset
2347 (py-statement-opens-block-p)))))
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2348 (setq colon-indent (current-indentation)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2349 found (and found (zerop (py-next-statement 1)))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2350 new-value (- (current-indentation) colon-indent))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2351 (goto-char start)
7725
663367ca13f8 (py-in-literal, py-fast-in-literal): New functions (mostly) stolen
Barry Warsaw <barry@python.org>
parents: 7724
diff changeset
2352 (if (not found)
663367ca13f8 (py-in-literal, py-fast-in-literal): New functions (mostly) stolen
Barry Warsaw <barry@python.org>
parents: 7724
diff changeset
2353 (error "Sorry, couldn't guess a value for py-indent-offset")
663367ca13f8 (py-in-literal, py-fast-in-literal): New functions (mostly) stolen
Barry Warsaw <barry@python.org>
parents: 7724
diff changeset
2354 (funcall (if global 'kill-local-variable 'make-local-variable)
663367ca13f8 (py-in-literal, py-fast-in-literal): New functions (mostly) stolen
Barry Warsaw <barry@python.org>
parents: 7724
diff changeset
2355 'py-indent-offset)
663367ca13f8 (py-in-literal, py-fast-in-literal): New functions (mostly) stolen
Barry Warsaw <barry@python.org>
parents: 7724
diff changeset
2356 (setq py-indent-offset new-value)
9142
98dc675d0913 (py-guess-indent-offset): Only print message about py-indent-offset
Barry Warsaw <barry@python.org>
parents: 9141
diff changeset
2357 (or noninteractive
98dc675d0913 (py-guess-indent-offset): Only print message about py-indent-offset
Barry Warsaw <barry@python.org>
parents: 9141
diff changeset
2358 (message "%s value of py-indent-offset set to %d"
98dc675d0913 (py-guess-indent-offset): Only print message about py-indent-offset
Barry Warsaw <barry@python.org>
parents: 9141
diff changeset
2359 (if global "Global" "Local")
98dc675d0913 (py-guess-indent-offset): Only print message about py-indent-offset
Barry Warsaw <barry@python.org>
parents: 9141
diff changeset
2360 py-indent-offset)))
7725
663367ca13f8 (py-in-literal, py-fast-in-literal): New functions (mostly) stolen
Barry Warsaw <barry@python.org>
parents: 7724
diff changeset
2361 ))
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2362
8628
aea6841ab898 (py-comment-indent-function): A replacement for
Barry Warsaw <barry@python.org>
parents: 8381
diff changeset
2363 (defun py-comment-indent-function ()
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2364 "Python version of `comment-indent-function'."
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2365 ;; This is required when filladapt is turned off. Without it, when
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2366 ;; filladapt is not used, comments which start in column zero
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2367 ;; cascade one character to the right
8628
aea6841ab898 (py-comment-indent-function): A replacement for
Barry Warsaw <barry@python.org>
parents: 8381
diff changeset
2368 (save-excursion
aea6841ab898 (py-comment-indent-function): A replacement for
Barry Warsaw <barry@python.org>
parents: 8381
diff changeset
2369 (beginning-of-line)
aea6841ab898 (py-comment-indent-function): A replacement for
Barry Warsaw <barry@python.org>
parents: 8381
diff changeset
2370 (let ((eol (py-point 'eol)))
aea6841ab898 (py-comment-indent-function): A replacement for
Barry Warsaw <barry@python.org>
parents: 8381
diff changeset
2371 (and comment-start-skip
aea6841ab898 (py-comment-indent-function): A replacement for
Barry Warsaw <barry@python.org>
parents: 8381
diff changeset
2372 (re-search-forward comment-start-skip eol t)
aea6841ab898 (py-comment-indent-function): A replacement for
Barry Warsaw <barry@python.org>
parents: 8381
diff changeset
2373 (setq eol (match-beginning 0)))
aea6841ab898 (py-comment-indent-function): A replacement for
Barry Warsaw <barry@python.org>
parents: 8381
diff changeset
2374 (goto-char eol)
aea6841ab898 (py-comment-indent-function): A replacement for
Barry Warsaw <barry@python.org>
parents: 8381
diff changeset
2375 (skip-chars-backward " \t")
aea6841ab898 (py-comment-indent-function): A replacement for
Barry Warsaw <barry@python.org>
parents: 8381
diff changeset
2376 (max comment-column (+ (current-column) (if (bolp) 0 1)))
aea6841ab898 (py-comment-indent-function): A replacement for
Barry Warsaw <barry@python.org>
parents: 8381
diff changeset
2377 )))
aea6841ab898 (py-comment-indent-function): A replacement for
Barry Warsaw <barry@python.org>
parents: 8381
diff changeset
2378
9905
6cf01eab05a3 (py-narrow-to-defun): New command (bound to C-x n d) which mimics the
Barry Warsaw <barry@python.org>
parents: 9897
diff changeset
2379 (defun py-narrow-to-defun (&optional class)
6cf01eab05a3 (py-narrow-to-defun): New command (bound to C-x n d) which mimics the
Barry Warsaw <barry@python.org>
parents: 9897
diff changeset
2380 "Make text outside current defun invisible.
6cf01eab05a3 (py-narrow-to-defun): New command (bound to C-x n d) which mimics the
Barry Warsaw <barry@python.org>
parents: 9897
diff changeset
2381 The defun visible is the one that contains point or follows point.
6cf01eab05a3 (py-narrow-to-defun): New command (bound to C-x n d) which mimics the
Barry Warsaw <barry@python.org>
parents: 9897
diff changeset
2382 Optional CLASS is passed directly to `py-beginning-of-def-or-class'."
6cf01eab05a3 (py-narrow-to-defun): New command (bound to C-x n d) which mimics the
Barry Warsaw <barry@python.org>
parents: 9897
diff changeset
2383 (interactive "P")
6cf01eab05a3 (py-narrow-to-defun): New command (bound to C-x n d) which mimics the
Barry Warsaw <barry@python.org>
parents: 9897
diff changeset
2384 (save-excursion
6cf01eab05a3 (py-narrow-to-defun): New command (bound to C-x n d) which mimics the
Barry Warsaw <barry@python.org>
parents: 9897
diff changeset
2385 (widen)
6cf01eab05a3 (py-narrow-to-defun): New command (bound to C-x n d) which mimics the
Barry Warsaw <barry@python.org>
parents: 9897
diff changeset
2386 (py-end-of-def-or-class class)
6cf01eab05a3 (py-narrow-to-defun): New command (bound to C-x n d) which mimics the
Barry Warsaw <barry@python.org>
parents: 9897
diff changeset
2387 (let ((end (point)))
6cf01eab05a3 (py-narrow-to-defun): New command (bound to C-x n d) which mimics the
Barry Warsaw <barry@python.org>
parents: 9897
diff changeset
2388 (py-beginning-of-def-or-class class)
6cf01eab05a3 (py-narrow-to-defun): New command (bound to C-x n d) which mimics the
Barry Warsaw <barry@python.org>
parents: 9897
diff changeset
2389 (narrow-to-region (point) end))))
6cf01eab05a3 (py-narrow-to-defun): New command (bound to C-x n d) which mimics the
Barry Warsaw <barry@python.org>
parents: 9897
diff changeset
2390
8628
aea6841ab898 (py-comment-indent-function): A replacement for
Barry Warsaw <barry@python.org>
parents: 8381
diff changeset
2391
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2392 (defun py-shift-region (start end count)
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2393 "Indent lines from START to END by COUNT spaces."
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2394 (save-excursion
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2395 (goto-char end)
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2396 (beginning-of-line)
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2397 (setq end (point))
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2398 (goto-char start)
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2399 (beginning-of-line)
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2400 (setq start (point))
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2401 (indent-rigidly start end count)))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2402
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2403 (defun py-shift-region-left (start end &optional count)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2404 "Shift region of Python code to the left.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2405 The lines from the line containing the start of the current region up
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2406 to (but not including) the line containing the end of the region are
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2407 shifted to the left, by `py-indent-offset' columns.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2408
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2409 If a prefix argument is given, the region is instead shifted by that
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2410 many columns. With no active region, dedent only the current line.
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2411 You cannot dedent the region if any line is already at column zero."
3743
b207876df29a (py-shift-region-left, py-shift-region-right, py-indent-right,
Barry Warsaw <barry@python.org>
parents: 3488
diff changeset
2412 (interactive
b207876df29a (py-shift-region-left, py-shift-region-right, py-indent-right,
Barry Warsaw <barry@python.org>
parents: 3488
diff changeset
2413 (let ((p (point))
b207876df29a (py-shift-region-left, py-shift-region-right, py-indent-right,
Barry Warsaw <barry@python.org>
parents: 3488
diff changeset
2414 (m (mark))
b207876df29a (py-shift-region-left, py-shift-region-right, py-indent-right,
Barry Warsaw <barry@python.org>
parents: 3488
diff changeset
2415 (arg current-prefix-arg))
b207876df29a (py-shift-region-left, py-shift-region-right, py-indent-right,
Barry Warsaw <barry@python.org>
parents: 3488
diff changeset
2416 (if m
b207876df29a (py-shift-region-left, py-shift-region-right, py-indent-right,
Barry Warsaw <barry@python.org>
parents: 3488
diff changeset
2417 (list (min p m) (max p m) arg)
b207876df29a (py-shift-region-left, py-shift-region-right, py-indent-right,
Barry Warsaw <barry@python.org>
parents: 3488
diff changeset
2418 (list p (save-excursion (forward-line 1) (point)) arg))))
b207876df29a (py-shift-region-left, py-shift-region-right, py-indent-right,
Barry Warsaw <barry@python.org>
parents: 3488
diff changeset
2419 ;; if any line is at column zero, don't shift the region
b207876df29a (py-shift-region-left, py-shift-region-right, py-indent-right,
Barry Warsaw <barry@python.org>
parents: 3488
diff changeset
2420 (save-excursion
b207876df29a (py-shift-region-left, py-shift-region-right, py-indent-right,
Barry Warsaw <barry@python.org>
parents: 3488
diff changeset
2421 (goto-char start)
b207876df29a (py-shift-region-left, py-shift-region-right, py-indent-right,
Barry Warsaw <barry@python.org>
parents: 3488
diff changeset
2422 (while (< (point) end)
b207876df29a (py-shift-region-left, py-shift-region-right, py-indent-right,
Barry Warsaw <barry@python.org>
parents: 3488
diff changeset
2423 (back-to-indentation)
3796
ec6963c3741c (py-shift-region-left): When checking for left edged code, watch for
Barry Warsaw <barry@python.org>
parents: 3747
diff changeset
2424 (if (and (zerop (current-column))
ec6963c3741c (py-shift-region-left): When checking for left edged code, watch for
Barry Warsaw <barry@python.org>
parents: 3747
diff changeset
2425 (not (looking-at "\\s *$")))
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2426 (error "Region is at left edge"))
3743
b207876df29a (py-shift-region-left, py-shift-region-right, py-indent-right,
Barry Warsaw <barry@python.org>
parents: 3488
diff changeset
2427 (forward-line 1)))
b207876df29a (py-shift-region-left, py-shift-region-right, py-indent-right,
Barry Warsaw <barry@python.org>
parents: 3488
diff changeset
2428 (py-shift-region start end (- (prefix-numeric-value
b207876df29a (py-shift-region-left, py-shift-region-right, py-indent-right,
Barry Warsaw <barry@python.org>
parents: 3488
diff changeset
2429 (or count py-indent-offset))))
b207876df29a (py-shift-region-left, py-shift-region-right, py-indent-right,
Barry Warsaw <barry@python.org>
parents: 3488
diff changeset
2430 (py-keep-region-active))
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2431
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2432 (defun py-shift-region-right (start end &optional count)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2433 "Shift region of Python code to the right.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2434 The lines from the line containing the start of the current region up
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2435 to (but not including) the line containing the end of the region are
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2436 shifted to the right, by `py-indent-offset' columns.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2437
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2438 If a prefix argument is given, the region is instead shifted by that
3743
b207876df29a (py-shift-region-left, py-shift-region-right, py-indent-right,
Barry Warsaw <barry@python.org>
parents: 3488
diff changeset
2439 many columns. With no active region, indent only the current line."
b207876df29a (py-shift-region-left, py-shift-region-right, py-indent-right,
Barry Warsaw <barry@python.org>
parents: 3488
diff changeset
2440 (interactive
b207876df29a (py-shift-region-left, py-shift-region-right, py-indent-right,
Barry Warsaw <barry@python.org>
parents: 3488
diff changeset
2441 (let ((p (point))
b207876df29a (py-shift-region-left, py-shift-region-right, py-indent-right,
Barry Warsaw <barry@python.org>
parents: 3488
diff changeset
2442 (m (mark))
b207876df29a (py-shift-region-left, py-shift-region-right, py-indent-right,
Barry Warsaw <barry@python.org>
parents: 3488
diff changeset
2443 (arg current-prefix-arg))
b207876df29a (py-shift-region-left, py-shift-region-right, py-indent-right,
Barry Warsaw <barry@python.org>
parents: 3488
diff changeset
2444 (if m
b207876df29a (py-shift-region-left, py-shift-region-right, py-indent-right,
Barry Warsaw <barry@python.org>
parents: 3488
diff changeset
2445 (list (min p m) (max p m) arg)
b207876df29a (py-shift-region-left, py-shift-region-right, py-indent-right,
Barry Warsaw <barry@python.org>
parents: 3488
diff changeset
2446 (list p (save-excursion (forward-line 1) (point)) arg))))
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2447 (py-shift-region start end (prefix-numeric-value
3743
b207876df29a (py-shift-region-left, py-shift-region-right, py-indent-right,
Barry Warsaw <barry@python.org>
parents: 3488
diff changeset
2448 (or count py-indent-offset)))
b207876df29a (py-shift-region-left, py-shift-region-right, py-indent-right,
Barry Warsaw <barry@python.org>
parents: 3488
diff changeset
2449 (py-keep-region-active))
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2450
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2451 (defun py-indent-region (start end &optional indent-offset)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2452 "Reindent a region of Python code.
3445
07977bf0d997 (py-comment-region): obsoleted by comment-region
Barry Warsaw <barry@python.org>
parents: 3436
diff changeset
2453
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2454 The lines from the line containing the start of the current region up
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2455 to (but not including) the line containing the end of the region are
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2456 reindented. If the first line of the region has a non-whitespace
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2457 character in the first column, the first line is left alone and the
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2458 rest of the region is reindented with respect to it. Else the entire
3445
07977bf0d997 (py-comment-region): obsoleted by comment-region
Barry Warsaw <barry@python.org>
parents: 3436
diff changeset
2459 region is reindented with respect to the (closest code or indenting
07977bf0d997 (py-comment-region): obsoleted by comment-region
Barry Warsaw <barry@python.org>
parents: 3436
diff changeset
2460 comment) statement immediately preceding the region.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2461
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2462 This is useful when code blocks are moved or yanked, when enclosing
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2463 control structures are introduced or removed, or to reformat code
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2464 using a new value for the indentation offset.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2465
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2466 If a numeric prefix argument is given, it will be used as the value of
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2467 the indentation offset. Else the value of `py-indent-offset' will be
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2468 used.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2469
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2470 Warning: The region must be consistently indented before this function
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2471 is called! This function does not compute proper indentation from
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2472 scratch (that's impossible in Python), it merely adjusts the existing
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2473 indentation to be correct in context.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2474
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2475 Warning: This function really has no idea what to do with
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2476 non-indenting comment lines, and shifts them as if they were indenting
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2477 comment lines. Fixing this appears to require telepathy.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2478
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2479 Special cases: whitespace is deleted from blank lines; continuation
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2480 lines are shifted by the same amount their initial line was shifted,
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2481 in order to preserve their relative indentation with respect to their
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2482 initial line; and comment lines beginning in column 1 are ignored."
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2483 (interactive "*r\nP") ; region; raw prefix arg
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2484 (save-excursion
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2485 (goto-char end) (beginning-of-line) (setq end (point-marker))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2486 (goto-char start) (beginning-of-line)
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2487 (let ((py-indent-offset (prefix-numeric-value
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2488 (or indent-offset py-indent-offset)))
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2489 (indents '(-1)) ; stack of active indent levels
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2490 (target-column 0) ; column to which to indent
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2491 (base-shifted-by 0) ; amount last base line was shifted
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2492 (indent-base (if (looking-at "[ \t\n]")
4479
2343803318e4 (py-indent-line): take an optional universal argument which says to
Barry Warsaw <barry@python.org>
parents: 4346
diff changeset
2493 (py-compute-indentation t)
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2494 0))
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2495 ci)
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2496 (while (< (point) end)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2497 (setq ci (current-indentation))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2498 ;; figure out appropriate target column
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2499 (cond
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2500 ((or (eq (following-char) ?#) ; comment in column 1
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2501 (looking-at "[ \t]*$")) ; entirely blank
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2502 (setq target-column 0))
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2503 ((py-continuation-line-p) ; shift relative to base line
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2504 (setq target-column (+ ci base-shifted-by)))
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2505 (t ; new base line
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2506 (if (> ci (car indents)) ; going deeper; push it
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2507 (setq indents (cons ci indents))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2508 ;; else we should have seen this indent before
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2509 (setq indents (memq ci indents)) ; pop deeper indents
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2510 (if (null indents)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2511 (error "Bad indentation in region, at line %d"
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2512 (save-restriction
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2513 (widen)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2514 (1+ (count-lines 1 (point)))))))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2515 (setq target-column (+ indent-base
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2516 (* py-indent-offset
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2517 (- (length indents) 2))))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2518 (setq base-shifted-by (- target-column ci))))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2519 ;; shift as needed
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2520 (if (/= ci target-column)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2521 (progn
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2522 (delete-horizontal-space)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2523 (indent-to target-column)))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2524 (forward-line 1))))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2525 (set-marker end nil))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2526
3919
f487793d6018 (py-mode): comment-start is now "# " so indent-for-comment does the
Barry Warsaw <barry@python.org>
parents: 3905
diff changeset
2527 (defun py-comment-region (beg end &optional arg)
f487793d6018 (py-mode): comment-start is now "# " so indent-for-comment does the
Barry Warsaw <barry@python.org>
parents: 3905
diff changeset
2528 "Like `comment-region' but uses double hash (`#') comment starter."
f487793d6018 (py-mode): comment-start is now "# " so indent-for-comment does the
Barry Warsaw <barry@python.org>
parents: 3905
diff changeset
2529 (interactive "r\nP")
3926
1da168185e4e #updated comments
Barry Warsaw <barry@python.org>
parents: 3925
diff changeset
2530 (let ((comment-start py-block-comment-prefix))
3919
f487793d6018 (py-mode): comment-start is now "# " so indent-for-comment does the
Barry Warsaw <barry@python.org>
parents: 3905
diff changeset
2531 (comment-region beg end arg)))
f487793d6018 (py-mode): comment-start is now "# " so indent-for-comment does the
Barry Warsaw <barry@python.org>
parents: 3905
diff changeset
2532
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2533
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2534 ;; Functions for moving point
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2535 (defun py-previous-statement (count)
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2536 "Go to the start of the COUNTth preceding Python statement.
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2537 By default, goes to the previous statement. If there is no such
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2538 statement, goes to the first statement. Return count of statements
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2539 left to move. `Statements' do not include blank, comment, or
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2540 continuation lines."
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2541 (interactive "p") ; numeric prefix arg
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2542 (if (< count 0) (py-next-statement (- count))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2543 (py-goto-initial-line)
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2544 (let (start)
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2545 (while (and
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2546 (setq start (point)) ; always true -- side effect
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2547 (> count 0)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2548 (zerop (forward-line -1))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2549 (py-goto-statement-at-or-above))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2550 (setq count (1- count)))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2551 (if (> count 0) (goto-char start)))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2552 count))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2553
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2554 (defun py-next-statement (count)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2555 "Go to the start of next Python statement.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2556 If the statement at point is the i'th Python statement, goes to the
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2557 start of statement i+COUNT. If there is no such statement, goes to the
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2558 last statement. Returns count of statements left to move. `Statements'
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2559 do not include blank, comment, or continuation lines."
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2560 (interactive "p") ; numeric prefix arg
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2561 (if (< count 0) (py-previous-statement (- count))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2562 (beginning-of-line)
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2563 (let (start)
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2564 (while (and
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2565 (setq start (point)) ; always true -- side effect
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2566 (> count 0)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2567 (py-goto-statement-below))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2568 (setq count (1- count)))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2569 (if (> count 0) (goto-char start)))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2570 count))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2571
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2572 (defun py-goto-block-up (&optional nomark)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2573 "Move up to start of current block.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2574 Go to the statement that starts the smallest enclosing block; roughly
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2575 speaking, this will be the closest preceding statement that ends with a
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2576 colon and is indented less than the statement you started on. If
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2577 successful, also sets the mark to the starting point.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2578
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2579 `\\[py-mark-block]' can be used afterward to mark the whole code
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2580 block, if desired.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2581
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2582 If called from a program, the mark will not be set if optional argument
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2583 NOMARK is not nil."
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2584 (interactive)
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2585 (let ((start (point))
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2586 (found nil)
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2587 initial-indent)
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2588 (py-goto-initial-line)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2589 ;; if on blank or non-indenting comment line, use the preceding stmt
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2590 (if (looking-at "[ \t]*\\($\\|#[^ \t\n]\\)")
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2591 (progn
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2592 (py-goto-statement-at-or-above)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2593 (setq found (py-statement-opens-block-p))))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2594 ;; search back for colon line indented less
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2595 (setq initial-indent (current-indentation))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2596 (if (zerop initial-indent)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2597 ;; force fast exit
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2598 (goto-char (point-min)))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2599 (while (not (or found (bobp)))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2600 (setq found
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2601 (and
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2602 (re-search-backward ":[ \t]*\\($\\|[#\\]\\)" nil 'move)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2603 (or (py-goto-initial-line) t) ; always true -- side effect
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2604 (< (current-indentation) initial-indent)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2605 (py-statement-opens-block-p))))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2606 (if found
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2607 (progn
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2608 (or nomark (push-mark start))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2609 (back-to-indentation))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2610 (goto-char start)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2611 (error "Enclosing block not found"))))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2612
8377
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2613 (defun py-beginning-of-def-or-class (&optional class count)
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2614 "Move point to start of `def' or `class'.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2615
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2616 Searches back for the closest preceding `def'. If you supply a prefix
8377
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2617 arg, looks for a `class' instead. The docs below assume the `def'
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2618 case; just substitute `class' for `def' for the other case.
8629
239492b34f68 (py-beginning-of-def-or-class, py-end-of-def-or-class,
Barry Warsaw <barry@python.org>
parents: 8628
diff changeset
2619 Programmatically, if CLASS is `either', then moves to either `class'
239492b34f68 (py-beginning-of-def-or-class, py-end-of-def-or-class,
Barry Warsaw <barry@python.org>
parents: 8628
diff changeset
2620 or `def'.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2621
8377
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2622 When second optional argument is given programmatically, move to the
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2623 COUNTth start of `def'.
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2624
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2625 If point is in a `def' statement already, and after the `d', simply
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2626 moves point to the start of the statement.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2627
8377
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2628 Otherwise (i.e. when point is not in a `def' statement, or at or
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2629 before the `d' of a `def' statement), searches for the closest
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2630 preceding `def' statement, and leaves point at its start. If no such
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2631 statement can be found, leaves point at the start of the buffer.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2632
8377
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2633 Returns t iff a `def' statement is found by these rules.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2634
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2635 Note that doing this command repeatedly will take you closer to the
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2636 start of the buffer each time.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2637
8629
239492b34f68 (py-beginning-of-def-or-class, py-end-of-def-or-class,
Barry Warsaw <barry@python.org>
parents: 8628
diff changeset
2638 To mark the current `def', see `\\[py-mark-def-or-class]'."
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2639 (interactive "P") ; raw prefix arg
9457
54422b46f6d1 #XEmacs 21 now supports Imenu, so I am able to test (and fix) some
Barry Warsaw <barry@python.org>
parents: 9456
diff changeset
2640 (setq count (or count 1))
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2641 (let ((at-or-before-p (<= (current-column) (current-indentation)))
8377
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2642 (start-of-line (goto-char (py-point 'bol)))
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2643 (start-of-stmt (goto-char (py-point 'bos)))
8629
239492b34f68 (py-beginning-of-def-or-class, py-end-of-def-or-class,
Barry Warsaw <barry@python.org>
parents: 8628
diff changeset
2644 (start-re (cond ((eq class 'either) "^[ \t]*\\(class\\|def\\)\\>")
239492b34f68 (py-beginning-of-def-or-class, py-end-of-def-or-class,
Barry Warsaw <barry@python.org>
parents: 8628
diff changeset
2645 (class "^[ \t]*class\\>")
239492b34f68 (py-beginning-of-def-or-class, py-end-of-def-or-class,
Barry Warsaw <barry@python.org>
parents: 8628
diff changeset
2646 (t "^[ \t]*def\\>")))
8377
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2647 )
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2648 ;; searching backward
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2649 (if (and (< 0 count)
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2650 (or (/= start-of-stmt start-of-line)
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2651 (not at-or-before-p)))
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2652 (end-of-line))
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2653 ;; search forward
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2654 (if (and (> 0 count)
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2655 (zerop (current-column))
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2656 (looking-at start-re))
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2657 (end-of-line))
11144
41fcb40e841f (py-beginning-of-def-or-class): Only move to match-beginning if the
Barry Warsaw <barry@python.org>
parents: 10918
diff changeset
2658 (if (re-search-backward start-re nil 'move count)
41fcb40e841f (py-beginning-of-def-or-class): Only move to match-beginning if the
Barry Warsaw <barry@python.org>
parents: 10918
diff changeset
2659 (goto-char (match-beginning 0)))))
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2660
8377
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2661 ;; Backwards compatibility
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2662 (defalias 'beginning-of-python-def-or-class 'py-beginning-of-def-or-class)
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2663
8377
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2664 (defun py-end-of-def-or-class (&optional class count)
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2665 "Move point beyond end of `def' or `class' body.
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2666
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2667 By default, looks for an appropriate `def'. If you supply a prefix
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2668 arg, looks for a `class' instead. The docs below assume the `def'
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2669 case; just substitute `class' for `def' for the other case.
8629
239492b34f68 (py-beginning-of-def-or-class, py-end-of-def-or-class,
Barry Warsaw <barry@python.org>
parents: 8628
diff changeset
2670 Programmatically, if CLASS is `either', then moves to either `class'
239492b34f68 (py-beginning-of-def-or-class, py-end-of-def-or-class,
Barry Warsaw <barry@python.org>
parents: 8628
diff changeset
2671 or `def'.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2672
8377
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2673 When second optional argument is given programmatically, move to the
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2674 COUNTth end of `def'.
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2675
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2676 If point is in a `def' statement already, this is the `def' we use.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2677
8377
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2678 Else, if the `def' found by `\\[py-beginning-of-def-or-class]'
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2679 contains the statement you started on, that's the `def' we use.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2680
8377
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2681 Otherwise, we search forward for the closest following `def', and use that.
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2682
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2683 If a `def' can be found by these rules, point is moved to the start of
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2684 the line immediately following the `def' block, and the position of the
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2685 start of the `def' is returned.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2686
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2687 Else point is moved to the end of the buffer, and nil is returned.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2688
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2689 Note that doing this command repeatedly will take you closer to the
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2690 end of the buffer each time.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2691
8629
239492b34f68 (py-beginning-of-def-or-class, py-end-of-def-or-class,
Barry Warsaw <barry@python.org>
parents: 8628
diff changeset
2692 To mark the current `def', see `\\[py-mark-def-or-class]'."
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2693 (interactive "P") ; raw prefix arg
8377
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2694 (if (and count (/= count 1))
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2695 (py-beginning-of-def-or-class (- 1 count)))
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2696 (let ((start (progn (py-goto-initial-line) (point)))
8629
239492b34f68 (py-beginning-of-def-or-class, py-end-of-def-or-class,
Barry Warsaw <barry@python.org>
parents: 8628
diff changeset
2697 (which (cond ((eq class 'either) "\\(class\\|def\\)")
239492b34f68 (py-beginning-of-def-or-class, py-end-of-def-or-class,
Barry Warsaw <barry@python.org>
parents: 8628
diff changeset
2698 (class "class")
239492b34f68 (py-beginning-of-def-or-class, py-end-of-def-or-class,
Barry Warsaw <barry@python.org>
parents: 8628
diff changeset
2699 (t "def")))
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2700 (state 'not-found))
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2701 ;; move point to start of appropriate def/class
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2702 (if (looking-at (concat "[ \t]*" which "\\>")) ; already on one
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2703 (setq state 'at-beginning)
8377
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2704 ;; else see if py-beginning-of-def-or-class hits container
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2705 (if (and (py-beginning-of-def-or-class class)
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2706 (progn (py-goto-beyond-block)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2707 (> (point) start)))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2708 (setq state 'at-end)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2709 ;; else search forward
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2710 (goto-char start)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2711 (if (re-search-forward (concat "^[ \t]*" which "\\>") nil 'move)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2712 (progn (setq state 'at-beginning)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2713 (beginning-of-line)))))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2714 (cond
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2715 ((eq state 'at-beginning) (py-goto-beyond-block) t)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2716 ((eq state 'at-end) t)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2717 ((eq state 'not-found) nil)
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2718 (t (error "Internal error in `py-end-of-def-or-class'")))))
8377
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2719
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2720 ;; Backwards compabitility
8378
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
2721 (defalias 'end-of-python-def-or-class 'py-end-of-def-or-class)
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2722
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2723
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2724 ;; Functions for marking regions
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2725 (defun py-mark-block (&optional extend just-move)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2726 "Mark following block of lines. With prefix arg, mark structure.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2727 Easier to use than explain. It sets the region to an `interesting'
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2728 block of succeeding lines. If point is on a blank line, it goes down to
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2729 the next non-blank line. That will be the start of the region. The end
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2730 of the region depends on the kind of line at the start:
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2731
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2732 - If a comment, the region will include all succeeding comment lines up
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2733 to (but not including) the next non-comment line (if any).
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2734
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2735 - Else if a prefix arg is given, and the line begins one of these
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2736 structures:
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2737
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2738 if elif else try except finally for while def class
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2739
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2740 the region will be set to the body of the structure, including
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2741 following blocks that `belong' to it, but excluding trailing blank
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2742 and comment lines. E.g., if on a `try' statement, the `try' block
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2743 and all (if any) of the following `except' and `finally' blocks
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2744 that belong to the `try' structure will be in the region. Ditto
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2745 for if/elif/else, for/else and while/else structures, and (a bit
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2746 degenerate, since they're always one-block structures) def and
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2747 class blocks.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2748
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2749 - Else if no prefix argument is given, and the line begins a Python
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2750 block (see list above), and the block is not a `one-liner' (i.e.,
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2751 the statement ends with a colon, not with code), the region will
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2752 include all succeeding lines up to (but not including) the next
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2753 code statement (if any) that's indented no more than the starting
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2754 line, except that trailing blank and comment lines are excluded.
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2755 E.g., if the starting line begins a multi-statement `def'
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2756 structure, the region will be set to the full function definition,
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2757 but without any trailing `noise' lines.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2758
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2759 - Else the region will include all succeeding lines up to (but not
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2760 including) the next blank line, or code or indenting-comment line
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2761 indented strictly less than the starting line. Trailing indenting
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2762 comment lines are included in this case, but not trailing blank
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2763 lines.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2764
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2765 A msg identifying the location of the mark is displayed in the echo
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2766 area; or do `\\[exchange-point-and-mark]' to flip down to the end.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2767
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2768 If called from a program, optional argument EXTEND plays the role of
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2769 the prefix arg, and if optional argument JUST-MOVE is not nil, just
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2770 moves to the end of the block (& does not set mark or display a msg)."
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2771 (interactive "P") ; raw prefix arg
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2772 (py-goto-initial-line)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2773 ;; skip over blank lines
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2774 (while (and
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2775 (looking-at "[ \t]*$") ; while blank line
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2776 (not (eobp))) ; & somewhere to go
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2777 (forward-line 1))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2778 (if (eobp)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2779 (error "Hit end of buffer without finding a non-blank stmt"))
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2780 (let ((initial-pos (point))
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2781 (initial-indent (current-indentation))
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2782 last-pos ; position of last stmt in region
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2783 (followers
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2784 '((if elif else) (elif elif else) (else)
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2785 (try except finally) (except except) (finally)
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2786 (for else) (while else)
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2787 (def) (class) ) )
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2788 first-symbol next-symbol)
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2789
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2790 (cond
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2791 ;; if comment line, suck up the following comment lines
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2792 ((looking-at "[ \t]*#")
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2793 (re-search-forward "^[ \t]*[^ \t#]" nil 'move) ; look for non-comment
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2794 (re-search-backward "^[ \t]*#") ; and back to last comment in block
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2795 (setq last-pos (point)))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2796
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2797 ;; else if line is a block line and EXTEND given, suck up
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2798 ;; the whole structure
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2799 ((and extend
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2800 (setq first-symbol (py-suck-up-first-keyword) )
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2801 (assq first-symbol followers))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2802 (while (and
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2803 (or (py-goto-beyond-block) t) ; side effect
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2804 (forward-line -1) ; side effect
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2805 (setq last-pos (point)) ; side effect
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2806 (py-goto-statement-below)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2807 (= (current-indentation) initial-indent)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2808 (setq next-symbol (py-suck-up-first-keyword))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2809 (memq next-symbol (cdr (assq first-symbol followers))))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2810 (setq first-symbol next-symbol)))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2811
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2812 ;; else if line *opens* a block, search for next stmt indented <=
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2813 ((py-statement-opens-block-p)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2814 (while (and
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2815 (setq last-pos (point)) ; always true -- side effect
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2816 (py-goto-statement-below)
23530
ecef65e57cc6 (py-goto-statement-below): Watch out for landing in a triple quoted
Barry Warsaw <barry@python.org>
parents: 23423
diff changeset
2817 (> (current-indentation) initial-indent)
ecef65e57cc6 (py-goto-statement-below): Watch out for landing in a triple quoted
Barry Warsaw <barry@python.org>
parents: 23423
diff changeset
2818 )))
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2819
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2820 ;; else plain code line; stop at next blank line, or stmt or
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2821 ;; indenting comment line indented <
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2822 (t
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2823 (while (and
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2824 (setq last-pos (point)) ; always true -- side effect
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2825 (or (py-goto-beyond-final-line) t)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2826 (not (looking-at "[ \t]*$")) ; stop at blank line
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2827 (or
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2828 (>= (current-indentation) initial-indent)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2829 (looking-at "[ \t]*#[^ \t\n]"))) ; ignore non-indenting #
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2830 nil)))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2831
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2832 ;; skip to end of last stmt
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2833 (goto-char last-pos)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2834 (py-goto-beyond-final-line)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2835
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2836 ;; set mark & display
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2837 (if just-move
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2838 () ; just return
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2839 (push-mark (point) 'no-msg)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2840 (forward-line -1)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2841 (message "Mark set after: %s" (py-suck-up-leading-text))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2842 (goto-char initial-pos))))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2843
6559
1a233be5fc17 (mark-python-def-or-class): Renamed to py-mark-def-or-class globally.
Barry Warsaw <barry@python.org>
parents: 6556
diff changeset
2844 (defun py-mark-def-or-class (&optional class)
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2845 "Set region to body of def (or class, with prefix arg) enclosing point.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2846 Pushes the current mark, then point, on the mark ring (all language
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2847 modes do this, but although it's handy it's never documented ...).
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2848
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2849 In most Emacs language modes, this function bears at least a
8377
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2850 hallucinogenic resemblance to `\\[py-end-of-def-or-class]' and
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2851 `\\[py-beginning-of-def-or-class]'.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2852
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2853 And in earlier versions of Python mode, all 3 were tightly connected.
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2854 Turned out that was more confusing than useful: the `goto start' and
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2855 `goto end' commands are usually used to search through a file, and
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2856 people expect them to act a lot like `search backward' and `search
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2857 forward' string-search commands. But because Python `def' and `class'
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2858 can nest to arbitrary levels, finding the smallest def containing
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2859 point cannot be done via a simple backward search: the def containing
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2860 point may not be the closest preceding def, or even the closest
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2861 preceding def that's indented less. The fancy algorithm required is
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2862 appropriate for the usual uses of this `mark' command, but not for the
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2863 `goto' variations.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2864
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2865 So the def marked by this command may not be the one either of the
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2866 `goto' commands find: If point is on a blank or non-indenting comment
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2867 line, moves back to start of the closest preceding code statement or
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2868 indenting comment line. If this is a `def' statement, that's the def
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2869 we use. Else searches for the smallest enclosing `def' block and uses
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2870 that. Else signals an error.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2871
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2872 When an enclosing def is found: The mark is left immediately beyond
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2873 the last line of the def block. Point is left at the start of the
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2874 def, except that: if the def is preceded by a number of comment lines
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2875 followed by (at most) one optional blank line, point is left at the
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2876 start of the comments; else if the def is preceded by a blank line,
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2877 point is left at its start.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2878
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2879 The intent is to mark the containing def/class and its associated
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2880 documentation, to make moving and duplicating functions and classes
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2881 pleasant."
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2882 (interactive "P") ; raw prefix arg
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2883 (let ((start (point))
8629
239492b34f68 (py-beginning-of-def-or-class, py-end-of-def-or-class,
Barry Warsaw <barry@python.org>
parents: 8628
diff changeset
2884 (which (cond ((eq class 'either) "\\(class\\|def\\)")
239492b34f68 (py-beginning-of-def-or-class, py-end-of-def-or-class,
Barry Warsaw <barry@python.org>
parents: 8628
diff changeset
2885 (class "class")
239492b34f68 (py-beginning-of-def-or-class, py-end-of-def-or-class,
Barry Warsaw <barry@python.org>
parents: 8628
diff changeset
2886 (t "def"))))
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2887 (push-mark start)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2888 (if (not (py-go-up-tree-to-keyword which))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2889 (progn (goto-char start)
8629
239492b34f68 (py-beginning-of-def-or-class, py-end-of-def-or-class,
Barry Warsaw <barry@python.org>
parents: 8628
diff changeset
2890 (error "Enclosing %s not found"
239492b34f68 (py-beginning-of-def-or-class, py-end-of-def-or-class,
Barry Warsaw <barry@python.org>
parents: 8628
diff changeset
2891 (if (eq class 'either)
239492b34f68 (py-beginning-of-def-or-class, py-end-of-def-or-class,
Barry Warsaw <barry@python.org>
parents: 8628
diff changeset
2892 "def or class"
239492b34f68 (py-beginning-of-def-or-class, py-end-of-def-or-class,
Barry Warsaw <barry@python.org>
parents: 8628
diff changeset
2893 which)))
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2894 ;; else enclosing def/class found
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2895 (setq start (point))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2896 (py-goto-beyond-block)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2897 (push-mark (point))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2898 (goto-char start)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2899 (if (zerop (forward-line -1)) ; if there is a preceding line
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2900 (progn
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2901 (if (looking-at "[ \t]*$") ; it's blank
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2902 (setq start (point)) ; so reset start point
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2903 (goto-char start)) ; else try again
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2904 (if (zerop (forward-line -1))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2905 (if (looking-at "[ \t]*#") ; a comment
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2906 ;; look back for non-comment line
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2907 ;; tricky: note that the regexp matches a blank
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2908 ;; line, cuz \n is in the 2nd character class
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2909 (and
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2910 (re-search-backward "^[ \t]*[^ \t#]" nil 'move)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2911 (forward-line 1))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2912 ;; no comment, so go back
6669
2f5c8374825c (py-mark-def-or-class): Added an exchange-point-and-mark and a
Barry Warsaw <barry@python.org>
parents: 6668
diff changeset
2913 (goto-char start)))))))
2f5c8374825c (py-mark-def-or-class): Added an exchange-point-and-mark and a
Barry Warsaw <barry@python.org>
parents: 6668
diff changeset
2914 (exchange-point-and-mark)
2f5c8374825c (py-mark-def-or-class): Added an exchange-point-and-mark and a
Barry Warsaw <barry@python.org>
parents: 6668
diff changeset
2915 (py-keep-region-active))
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2916
3811
b9a0434d2cb6 (py-forward-into-nomenclature, py-backward-into-nomenclature): New functions.
Barry Warsaw <barry@python.org>
parents: 3796
diff changeset
2917 ;; ripped from cc-mode
b9a0434d2cb6 (py-forward-into-nomenclature, py-backward-into-nomenclature): New functions.
Barry Warsaw <barry@python.org>
parents: 3796
diff changeset
2918 (defun py-forward-into-nomenclature (&optional arg)
b9a0434d2cb6 (py-forward-into-nomenclature, py-backward-into-nomenclature): New functions.
Barry Warsaw <barry@python.org>
parents: 3796
diff changeset
2919 "Move forward to end of a nomenclature section or word.
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
2920 With \\[universal-argument] (programmatically, optional argument ARG),
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2921 do it that many times.
3811
b9a0434d2cb6 (py-forward-into-nomenclature, py-backward-into-nomenclature): New functions.
Barry Warsaw <barry@python.org>
parents: 3796
diff changeset
2922
b9a0434d2cb6 (py-forward-into-nomenclature, py-backward-into-nomenclature): New functions.
Barry Warsaw <barry@python.org>
parents: 3796
diff changeset
2923 A `nomenclature' is a fancy way of saying AWordWithMixedCaseNotUnderscores."
b9a0434d2cb6 (py-forward-into-nomenclature, py-backward-into-nomenclature): New functions.
Barry Warsaw <barry@python.org>
parents: 3796
diff changeset
2924 (interactive "p")
b9a0434d2cb6 (py-forward-into-nomenclature, py-backward-into-nomenclature): New functions.
Barry Warsaw <barry@python.org>
parents: 3796
diff changeset
2925 (let ((case-fold-search nil))
b9a0434d2cb6 (py-forward-into-nomenclature, py-backward-into-nomenclature): New functions.
Barry Warsaw <barry@python.org>
parents: 3796
diff changeset
2926 (if (> arg 0)
3937
decd13f6629d (py-forward-into-nomenclature): Slightly better regex for stopping on
Barry Warsaw <barry@python.org>
parents: 3934
diff changeset
2927 (re-search-forward
decd13f6629d (py-forward-into-nomenclature): Slightly better regex for stopping on
Barry Warsaw <barry@python.org>
parents: 3934
diff changeset
2928 "\\(\\W\\|[_]\\)*\\([A-Z]*[a-z0-9]*\\)"
decd13f6629d (py-forward-into-nomenclature): Slightly better regex for stopping on
Barry Warsaw <barry@python.org>
parents: 3934
diff changeset
2929 (point-max) t arg)
3811
b9a0434d2cb6 (py-forward-into-nomenclature, py-backward-into-nomenclature): New functions.
Barry Warsaw <barry@python.org>
parents: 3796
diff changeset
2930 (while (and (< arg 0)
b9a0434d2cb6 (py-forward-into-nomenclature, py-backward-into-nomenclature): New functions.
Barry Warsaw <barry@python.org>
parents: 3796
diff changeset
2931 (re-search-backward
3937
decd13f6629d (py-forward-into-nomenclature): Slightly better regex for stopping on
Barry Warsaw <barry@python.org>
parents: 3934
diff changeset
2932 "\\(\\W\\|[a-z0-9]\\)[A-Z]+\\|\\(\\W\\|[_]\\)\\w+"
3811
b9a0434d2cb6 (py-forward-into-nomenclature, py-backward-into-nomenclature): New functions.
Barry Warsaw <barry@python.org>
parents: 3796
diff changeset
2933 (point-min) 0))
b9a0434d2cb6 (py-forward-into-nomenclature, py-backward-into-nomenclature): New functions.
Barry Warsaw <barry@python.org>
parents: 3796
diff changeset
2934 (forward-char 1)
b9a0434d2cb6 (py-forward-into-nomenclature, py-backward-into-nomenclature): New functions.
Barry Warsaw <barry@python.org>
parents: 3796
diff changeset
2935 (setq arg (1+ arg)))))
b9a0434d2cb6 (py-forward-into-nomenclature, py-backward-into-nomenclature): New functions.
Barry Warsaw <barry@python.org>
parents: 3796
diff changeset
2936 (py-keep-region-active))
b9a0434d2cb6 (py-forward-into-nomenclature, py-backward-into-nomenclature): New functions.
Barry Warsaw <barry@python.org>
parents: 3796
diff changeset
2937
b9a0434d2cb6 (py-forward-into-nomenclature, py-backward-into-nomenclature): New functions.
Barry Warsaw <barry@python.org>
parents: 3796
diff changeset
2938 (defun py-backward-into-nomenclature (&optional arg)
b9a0434d2cb6 (py-forward-into-nomenclature, py-backward-into-nomenclature): New functions.
Barry Warsaw <barry@python.org>
parents: 3796
diff changeset
2939 "Move backward to beginning of a nomenclature section or word.
b9a0434d2cb6 (py-forward-into-nomenclature, py-backward-into-nomenclature): New functions.
Barry Warsaw <barry@python.org>
parents: 3796
diff changeset
2940 With optional ARG, move that many times. If ARG is negative, move
b9a0434d2cb6 (py-forward-into-nomenclature, py-backward-into-nomenclature): New functions.
Barry Warsaw <barry@python.org>
parents: 3796
diff changeset
2941 forward.
b9a0434d2cb6 (py-forward-into-nomenclature, py-backward-into-nomenclature): New functions.
Barry Warsaw <barry@python.org>
parents: 3796
diff changeset
2942
b9a0434d2cb6 (py-forward-into-nomenclature, py-backward-into-nomenclature): New functions.
Barry Warsaw <barry@python.org>
parents: 3796
diff changeset
2943 A `nomenclature' is a fancy way of saying AWordWithMixedCaseNotUnderscores."
b9a0434d2cb6 (py-forward-into-nomenclature, py-backward-into-nomenclature): New functions.
Barry Warsaw <barry@python.org>
parents: 3796
diff changeset
2944 (interactive "p")
b9a0434d2cb6 (py-forward-into-nomenclature, py-backward-into-nomenclature): New functions.
Barry Warsaw <barry@python.org>
parents: 3796
diff changeset
2945 (py-forward-into-nomenclature (- arg))
b9a0434d2cb6 (py-forward-into-nomenclature, py-backward-into-nomenclature): New functions.
Barry Warsaw <barry@python.org>
parents: 3796
diff changeset
2946 (py-keep-region-active))
b9a0434d2cb6 (py-forward-into-nomenclature, py-backward-into-nomenclature): New functions.
Barry Warsaw <barry@python.org>
parents: 3796
diff changeset
2947
b9a0434d2cb6 (py-forward-into-nomenclature, py-backward-into-nomenclature): New functions.
Barry Warsaw <barry@python.org>
parents: 3796
diff changeset
2948
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2949
17416
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
2950 ;; pdbtrack functions
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
2951 (defun py-pdbtrack-toggle-stack-tracking (arg)
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
2952 (interactive "P")
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
2953 (if (not (get-buffer-process (current-buffer)))
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
2954 (error "No process associated with buffer '%s'" (current-buffer)))
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
2955 ;; missing or 0 is toggle, >0 turn on, <0 turn off
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
2956 (if (or (not arg)
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
2957 (zerop (setq arg (prefix-numeric-value arg))))
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
2958 (setq py-pdbtrack-do-tracking-p (not py-pdbtrack-do-tracking-p))
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
2959 (setq py-pdbtrack-do-tracking-p (> arg 0)))
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
2960 (message "%sabled Python's pdbtrack"
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
2961 (if py-pdbtrack-do-tracking-p "En" "Dis")))
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
2962
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
2963 (defun turn-on-pdbtrack ()
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
2964 (interactive)
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
2965 (py-pdbtrack-toggle-stack-tracking 1))
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
2966
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
2967 (defun turn-off-pdbtrack ()
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
2968 (interactive)
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
2969 (py-pdbtrack-toggle-stack-tracking 0))
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
2970
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
2971
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
2972
23229
2b47d0dcfa66 Some contributions and ideas by Alexander Schmolck: add a keybinding
Barry Warsaw <barry@python.org>
parents: 23224
diff changeset
2973 ;; Pychecker
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
2974
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
2975 ;; hack for FSF Emacs
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
2976 (unless (fboundp 'read-shell-command)
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
2977 (defalias 'read-shell-command 'read-string))
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
2978
23229
2b47d0dcfa66 Some contributions and ideas by Alexander Schmolck: add a keybinding
Barry Warsaw <barry@python.org>
parents: 23224
diff changeset
2979 (defun py-pychecker-run (command)
2b47d0dcfa66 Some contributions and ideas by Alexander Schmolck: add a keybinding
Barry Warsaw <barry@python.org>
parents: 23224
diff changeset
2980 "*Run pychecker (default on the file currently visited)."
2b47d0dcfa66 Some contributions and ideas by Alexander Schmolck: add a keybinding
Barry Warsaw <barry@python.org>
parents: 23224
diff changeset
2981 (interactive
2b47d0dcfa66 Some contributions and ideas by Alexander Schmolck: add a keybinding
Barry Warsaw <barry@python.org>
parents: 23224
diff changeset
2982 (let ((default
2b47d0dcfa66 Some contributions and ideas by Alexander Schmolck: add a keybinding
Barry Warsaw <barry@python.org>
parents: 23224
diff changeset
2983 (format "%s %s %s" py-pychecker-command
2b47d0dcfa66 Some contributions and ideas by Alexander Schmolck: add a keybinding
Barry Warsaw <barry@python.org>
parents: 23224
diff changeset
2984 (mapconcat 'identity py-pychecker-command-args " ")
25466
1f2b1e684850 (py-pychecker-run): Fix calculation of last command to include the
Barry Warsaw <barry@python.org>
parents: 24288
diff changeset
2985 (buffer-file-name)))
1f2b1e684850 (py-pychecker-run): Fix calculation of last command to include the
Barry Warsaw <barry@python.org>
parents: 24288
diff changeset
2986 (last (when py-pychecker-history
1f2b1e684850 (py-pychecker-run): Fix calculation of last command to include the
Barry Warsaw <barry@python.org>
parents: 24288
diff changeset
2987 (let* ((lastcmd (car py-pychecker-history))
1f2b1e684850 (py-pychecker-run): Fix calculation of last command to include the
Barry Warsaw <barry@python.org>
parents: 24288
diff changeset
2988 (cmd (cdr (reverse (split-string lastcmd))))
1f2b1e684850 (py-pychecker-run): Fix calculation of last command to include the
Barry Warsaw <barry@python.org>
parents: 24288
diff changeset
2989 (newcmd (reverse (cons (buffer-file-name) cmd))))
1f2b1e684850 (py-pychecker-run): Fix calculation of last command to include the
Barry Warsaw <barry@python.org>
parents: 24288
diff changeset
2990 (mapconcat 'identity newcmd " ")))))
23229
2b47d0dcfa66 Some contributions and ideas by Alexander Schmolck: add a keybinding
Barry Warsaw <barry@python.org>
parents: 23224
diff changeset
2991
2b47d0dcfa66 Some contributions and ideas by Alexander Schmolck: add a keybinding
Barry Warsaw <barry@python.org>
parents: 23224
diff changeset
2992 (list
31236
acbc7563a8e7 Sync with python-mode project. Adds two changes:
Skip Montanaro <skip@pobox.com>
parents: 30034
diff changeset
2993 (if (fboundp 'read-shell-command)
acbc7563a8e7 Sync with python-mode project. Adds two changes:
Skip Montanaro <skip@pobox.com>
parents: 30034
diff changeset
2994 (read-shell-command "Run pychecker like this: "
acbc7563a8e7 Sync with python-mode project. Adds two changes:
Skip Montanaro <skip@pobox.com>
parents: 30034
diff changeset
2995 (if last
acbc7563a8e7 Sync with python-mode project. Adds two changes:
Skip Montanaro <skip@pobox.com>
parents: 30034
diff changeset
2996 last
acbc7563a8e7 Sync with python-mode project. Adds two changes:
Skip Montanaro <skip@pobox.com>
parents: 30034
diff changeset
2997 default)
acbc7563a8e7 Sync with python-mode project. Adds two changes:
Skip Montanaro <skip@pobox.com>
parents: 30034
diff changeset
2998 'py-pychecker-history)
acbc7563a8e7 Sync with python-mode project. Adds two changes:
Skip Montanaro <skip@pobox.com>
parents: 30034
diff changeset
2999 (read-string "Run pychecker like this: "
acbc7563a8e7 Sync with python-mode project. Adds two changes:
Skip Montanaro <skip@pobox.com>
parents: 30034
diff changeset
3000 (if last
acbc7563a8e7 Sync with python-mode project. Adds two changes:
Skip Montanaro <skip@pobox.com>
parents: 30034
diff changeset
3001 last
acbc7563a8e7 Sync with python-mode project. Adds two changes:
Skip Montanaro <skip@pobox.com>
parents: 30034
diff changeset
3002 default)
acbc7563a8e7 Sync with python-mode project. Adds two changes:
Skip Montanaro <skip@pobox.com>
parents: 30034
diff changeset
3003 'py-pychecker-history))
acbc7563a8e7 Sync with python-mode project. Adds two changes:
Skip Montanaro <skip@pobox.com>
parents: 30034
diff changeset
3004 )))
23229
2b47d0dcfa66 Some contributions and ideas by Alexander Schmolck: add a keybinding
Barry Warsaw <barry@python.org>
parents: 23224
diff changeset
3005 (save-some-buffers (not py-ask-about-save) nil)
24246
9a58d64f8fc3 (py-pychecker-run): Thomas Heller points out that this function messes
Barry Warsaw <barry@python.org>
parents: 23530
diff changeset
3006 (compile-internal command "No more errors"))
23229
2b47d0dcfa66 Some contributions and ideas by Alexander Schmolck: add a keybinding
Barry Warsaw <barry@python.org>
parents: 23224
diff changeset
3007
2b47d0dcfa66 Some contributions and ideas by Alexander Schmolck: add a keybinding
Barry Warsaw <barry@python.org>
parents: 23224
diff changeset
3008
2b47d0dcfa66 Some contributions and ideas by Alexander Schmolck: add a keybinding
Barry Warsaw <barry@python.org>
parents: 23224
diff changeset
3009
2b47d0dcfa66 Some contributions and ideas by Alexander Schmolck: add a keybinding
Barry Warsaw <barry@python.org>
parents: 23224
diff changeset
3010 ;; pydoc commands. The guts of this function is stolen from XEmacs's
2b47d0dcfa66 Some contributions and ideas by Alexander Schmolck: add a keybinding
Barry Warsaw <barry@python.org>
parents: 23224
diff changeset
3011 ;; symbol-near-point, but without the useless regexp-quote call on the
2b47d0dcfa66 Some contributions and ideas by Alexander Schmolck: add a keybinding
Barry Warsaw <barry@python.org>
parents: 23224
diff changeset
3012 ;; results, nor the interactive bit. Also, we've added the temporary
2b47d0dcfa66 Some contributions and ideas by Alexander Schmolck: add a keybinding
Barry Warsaw <barry@python.org>
parents: 23224
diff changeset
3013 ;; syntax table setting, which Skip originally had broken out into a
2b47d0dcfa66 Some contributions and ideas by Alexander Schmolck: add a keybinding
Barry Warsaw <barry@python.org>
parents: 23224
diff changeset
3014 ;; separate function. Note that Emacs doesn't have the original
2b47d0dcfa66 Some contributions and ideas by Alexander Schmolck: add a keybinding
Barry Warsaw <barry@python.org>
parents: 23224
diff changeset
3015 ;; function.
23224
ed5d75912d60 Skip Montanaro's contribution (slightly mod'd by Barry) to provide a
Barry Warsaw <barry@python.org>
parents: 23223
diff changeset
3016 (defun py-symbol-near-point ()
ed5d75912d60 Skip Montanaro's contribution (slightly mod'd by Barry) to provide a
Barry Warsaw <barry@python.org>
parents: 23223
diff changeset
3017 "Return the first textual item to the nearest point."
ed5d75912d60 Skip Montanaro's contribution (slightly mod'd by Barry) to provide a
Barry Warsaw <barry@python.org>
parents: 23223
diff changeset
3018 ;; alg stolen from etag.el
ed5d75912d60 Skip Montanaro's contribution (slightly mod'd by Barry) to provide a
Barry Warsaw <barry@python.org>
parents: 23223
diff changeset
3019 (save-excursion
ed5d75912d60 Skip Montanaro's contribution (slightly mod'd by Barry) to provide a
Barry Warsaw <barry@python.org>
parents: 23223
diff changeset
3020 (with-syntax-table py-dotted-expression-syntax-table
ed5d75912d60 Skip Montanaro's contribution (slightly mod'd by Barry) to provide a
Barry Warsaw <barry@python.org>
parents: 23223
diff changeset
3021 (if (or (bobp) (not (memq (char-syntax (char-before)) '(?w ?_))))
ed5d75912d60 Skip Montanaro's contribution (slightly mod'd by Barry) to provide a
Barry Warsaw <barry@python.org>
parents: 23223
diff changeset
3022 (while (not (looking-at "\\sw\\|\\s_\\|\\'"))
ed5d75912d60 Skip Montanaro's contribution (slightly mod'd by Barry) to provide a
Barry Warsaw <barry@python.org>
parents: 23223
diff changeset
3023 (forward-char 1)))
ed5d75912d60 Skip Montanaro's contribution (slightly mod'd by Barry) to provide a
Barry Warsaw <barry@python.org>
parents: 23223
diff changeset
3024 (while (looking-at "\\sw\\|\\s_")
ed5d75912d60 Skip Montanaro's contribution (slightly mod'd by Barry) to provide a
Barry Warsaw <barry@python.org>
parents: 23223
diff changeset
3025 (forward-char 1))
ed5d75912d60 Skip Montanaro's contribution (slightly mod'd by Barry) to provide a
Barry Warsaw <barry@python.org>
parents: 23223
diff changeset
3026 (if (re-search-backward "\\sw\\|\\s_" nil t)
ed5d75912d60 Skip Montanaro's contribution (slightly mod'd by Barry) to provide a
Barry Warsaw <barry@python.org>
parents: 23223
diff changeset
3027 (progn (forward-char 1)
ed5d75912d60 Skip Montanaro's contribution (slightly mod'd by Barry) to provide a
Barry Warsaw <barry@python.org>
parents: 23223
diff changeset
3028 (buffer-substring (point)
ed5d75912d60 Skip Montanaro's contribution (slightly mod'd by Barry) to provide a
Barry Warsaw <barry@python.org>
parents: 23223
diff changeset
3029 (progn (forward-sexp -1)
ed5d75912d60 Skip Montanaro's contribution (slightly mod'd by Barry) to provide a
Barry Warsaw <barry@python.org>
parents: 23223
diff changeset
3030 (while (looking-at "\\s'")
ed5d75912d60 Skip Montanaro's contribution (slightly mod'd by Barry) to provide a
Barry Warsaw <barry@python.org>
parents: 23223
diff changeset
3031 (forward-char 1))
ed5d75912d60 Skip Montanaro's contribution (slightly mod'd by Barry) to provide a
Barry Warsaw <barry@python.org>
parents: 23223
diff changeset
3032 (point))))
ed5d75912d60 Skip Montanaro's contribution (slightly mod'd by Barry) to provide a
Barry Warsaw <barry@python.org>
parents: 23223
diff changeset
3033 nil))))
ed5d75912d60 Skip Montanaro's contribution (slightly mod'd by Barry) to provide a
Barry Warsaw <barry@python.org>
parents: 23223
diff changeset
3034
ed5d75912d60 Skip Montanaro's contribution (slightly mod'd by Barry) to provide a
Barry Warsaw <barry@python.org>
parents: 23223
diff changeset
3035 (defun py-help-at-point ()
ed5d75912d60 Skip Montanaro's contribution (slightly mod'd by Barry) to provide a
Barry Warsaw <barry@python.org>
parents: 23223
diff changeset
3036 "Get help from Python based on the symbol nearest point."
ed5d75912d60 Skip Montanaro's contribution (slightly mod'd by Barry) to provide a
Barry Warsaw <barry@python.org>
parents: 23223
diff changeset
3037 (interactive)
ed5d75912d60 Skip Montanaro's contribution (slightly mod'd by Barry) to provide a
Barry Warsaw <barry@python.org>
parents: 23223
diff changeset
3038 (let* ((sym (py-symbol-near-point))
ed5d75912d60 Skip Montanaro's contribution (slightly mod'd by Barry) to provide a
Barry Warsaw <barry@python.org>
parents: 23223
diff changeset
3039 (base (substring sym 0 (or (search "." sym :from-end t) 0)))
ed5d75912d60 Skip Montanaro's contribution (slightly mod'd by Barry) to provide a
Barry Warsaw <barry@python.org>
parents: 23223
diff changeset
3040 cmd)
ed5d75912d60 Skip Montanaro's contribution (slightly mod'd by Barry) to provide a
Barry Warsaw <barry@python.org>
parents: 23223
diff changeset
3041 (if (not (equal base ""))
ed5d75912d60 Skip Montanaro's contribution (slightly mod'd by Barry) to provide a
Barry Warsaw <barry@python.org>
parents: 23223
diff changeset
3042 (setq cmd (concat "import " base "\n")))
ed5d75912d60 Skip Montanaro's contribution (slightly mod'd by Barry) to provide a
Barry Warsaw <barry@python.org>
parents: 23223
diff changeset
3043 (setq cmd (concat "import pydoc\n"
ed5d75912d60 Skip Montanaro's contribution (slightly mod'd by Barry) to provide a
Barry Warsaw <barry@python.org>
parents: 23223
diff changeset
3044 cmd
23230
863125545301 Merge in Skip's last few updates w.r.t. py-help-at-point:
Barry Warsaw <barry@python.org>
parents: 23229
diff changeset
3045 "try: pydoc.help('" sym "')\n"
23224
ed5d75912d60 Skip Montanaro's contribution (slightly mod'd by Barry) to provide a
Barry Warsaw <barry@python.org>
parents: 23223
diff changeset
3046 "except: print 'No help available on:', \"" sym "\""))
ed5d75912d60 Skip Montanaro's contribution (slightly mod'd by Barry) to provide a
Barry Warsaw <barry@python.org>
parents: 23223
diff changeset
3047 (message cmd)
23230
863125545301 Merge in Skip's last few updates w.r.t. py-help-at-point:
Barry Warsaw <barry@python.org>
parents: 23229
diff changeset
3048 (py-execute-string cmd)
863125545301 Merge in Skip's last few updates w.r.t. py-help-at-point:
Barry Warsaw <barry@python.org>
parents: 23229
diff changeset
3049 (set-buffer "*Python Output*")
863125545301 Merge in Skip's last few updates w.r.t. py-help-at-point:
Barry Warsaw <barry@python.org>
parents: 23229
diff changeset
3050 ;; BAW: Should we really be leaving the output buffer in help-mode?
863125545301 Merge in Skip's last few updates w.r.t. py-help-at-point:
Barry Warsaw <barry@python.org>
parents: 23229
diff changeset
3051 (help-mode)))
23224
ed5d75912d60 Skip Montanaro's contribution (slightly mod'd by Barry) to provide a
Barry Warsaw <barry@python.org>
parents: 23223
diff changeset
3052
ed5d75912d60 Skip Montanaro's contribution (slightly mod'd by Barry) to provide a
Barry Warsaw <barry@python.org>
parents: 23223
diff changeset
3053
ed5d75912d60 Skip Montanaro's contribution (slightly mod'd by Barry) to provide a
Barry Warsaw <barry@python.org>
parents: 23223
diff changeset
3054
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3055 ;; Documentation functions
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3056
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3057 ;; dump the long form of the mode blurb; does the usual doc escapes,
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3058 ;; plus lines of the form ^[vc]:name$ to suck variable & command docs
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3059 ;; out of the right places, along with the keys they're on & current
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3060 ;; values
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3061 (defun py-dump-help-string (str)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3062 (with-output-to-temp-buffer "*Help*"
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3063 (let ((locals (buffer-local-variables))
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3064 funckind funcname func funcdoc
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3065 (start 0) mstart end
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3066 keys )
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3067 (while (string-match "^%\\([vc]\\):\\(.+\\)\n" str start)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3068 (setq mstart (match-beginning 0) end (match-end 0)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3069 funckind (substring str (match-beginning 1) (match-end 1))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3070 funcname (substring str (match-beginning 2) (match-end 2))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3071 func (intern funcname))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3072 (princ (substitute-command-keys (substring str start mstart)))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3073 (cond
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3074 ((equal funckind "c") ; command
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3075 (setq funcdoc (documentation func)
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3076 keys (concat
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3077 "Key(s): "
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3078 (mapconcat 'key-description
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3079 (where-is-internal func py-mode-map)
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3080 ", "))))
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3081 ((equal funckind "v") ; variable
4189
03f2c21aecaf (py-dump-help-string): Use documentation-property to get docstring.
Barry Warsaw <barry@python.org>
parents: 4188
diff changeset
3082 (setq funcdoc (documentation-property func 'variable-documentation)
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3083 keys (if (assq func locals)
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3084 (concat
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3085 "Local/Global values: "
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3086 (prin1-to-string (symbol-value func))
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3087 " / "
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3088 (prin1-to-string (default-value func)))
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3089 (concat
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3090 "Value: "
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3091 (prin1-to-string (symbol-value func))))))
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3092 (t ; unexpected
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3093 (error "Error in py-dump-help-string, tag `%s'" funckind)))
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3094 (princ (format "\n-> %s:\t%s\t%s\n\n"
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3095 (if (equal funckind "c") "Command" "Variable")
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3096 funcname keys))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3097 (princ funcdoc)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3098 (terpri)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3099 (setq start end))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3100 (princ (substitute-command-keys (substring str start))))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3101 (print-help-return-message)))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3102
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3103 (defun py-describe-mode ()
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3104 "Dump long form of Python-mode docs."
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3105 (interactive)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3106 (py-dump-help-string "Major mode for editing Python files.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3107 Knows about Python indentation, tokens, comments and continuation lines.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3108 Paragraphs are separated by blank lines only.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3109
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3110 Major sections below begin with the string `@'; specific function and
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3111 variable docs begin with `->'.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3112
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3113 @EXECUTING PYTHON CODE
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3114
8378
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
3115 \\[py-execute-import-or-reload]\timports or reloads the file in the Python interpreter
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3116 \\[py-execute-buffer]\tsends the entire buffer to the Python interpreter
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3117 \\[py-execute-region]\tsends the current region
8378
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
3118 \\[py-execute-def-or-class]\tsends the current function or class definition
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
3119 \\[py-execute-string]\tsends an arbitrary string
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3120 \\[py-shell]\tstarts a Python interpreter window; this will be used by
8378
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
3121 \tsubsequent Python execution commands
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
3122 %c:py-execute-import-or-reload
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3123 %c:py-execute-buffer
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3124 %c:py-execute-region
8378
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
3125 %c:py-execute-def-or-class
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
3126 %c:py-execute-string
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3127 %c:py-shell
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3128
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3129 @VARIABLES
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3130
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3131 py-indent-offset\tindentation increment
3818
3c5ca7727988 (python-mode): Added menu support, requires easymenu.
Barry Warsaw <barry@python.org>
parents: 3813
diff changeset
3132 py-block-comment-prefix\tcomment string used by comment-region
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3133
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3134 py-python-command\tshell command to invoke Python interpreter
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3135 py-temp-directory\tdirectory used for temp files (if needed)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3136
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3137 py-beep-if-tab-change\tring the bell if tab-width is changed
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3138 %v:py-indent-offset
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3139 %v:py-block-comment-prefix
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3140 %v:py-python-command
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3141 %v:py-temp-directory
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3142 %v:py-beep-if-tab-change
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3143
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3144 @KINDS OF LINES
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3145
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3146 Each physical line in the file is either a `continuation line' (the
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3147 preceding line ends with a backslash that's not part of a comment, or
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3148 the paren/bracket/brace nesting level at the start of the line is
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3149 non-zero, or both) or an `initial line' (everything else).
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3150
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3151 An initial line is in turn a `blank line' (contains nothing except
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3152 possibly blanks or tabs), a `comment line' (leftmost non-blank
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3153 character is `#'), or a `code line' (everything else).
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3154
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3155 Comment Lines
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3156
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3157 Although all comment lines are treated alike by Python, Python mode
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3158 recognizes two kinds that act differently with respect to indentation.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3159
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3160 An `indenting comment line' is a comment line with a blank, tab or
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3161 nothing after the initial `#'. The indentation commands (see below)
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3162 treat these exactly as if they were code lines: a line following an
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3163 indenting comment line will be indented like the comment line. All
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3164 other comment lines (those with a non-whitespace character immediately
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3165 following the initial `#') are `non-indenting comment lines', and
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3166 their indentation is ignored by the indentation commands.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3167
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3168 Indenting comment lines are by far the usual case, and should be used
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3169 whenever possible. Non-indenting comment lines are useful in cases
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3170 like these:
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3171
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3172 \ta = b # a very wordy single-line comment that ends up being
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3173 \t #... continued onto another line
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3174
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3175 \tif a == b:
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3176 ##\t\tprint 'panic!' # old code we've `commented out'
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3177 \t\treturn a
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3178
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3179 Since the `#...' and `##' comment lines have a non-whitespace
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3180 character following the initial `#', Python mode ignores them when
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3181 computing the proper indentation for the next line.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3182
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3183 Continuation Lines and Statements
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3184
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3185 The Python-mode commands generally work on statements instead of on
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3186 individual lines, where a `statement' is a comment or blank line, or a
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3187 code line and all of its following continuation lines (if any)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3188 considered as a single logical unit. The commands in this mode
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3189 generally (when it makes sense) automatically move to the start of the
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3190 statement containing point, even if point happens to be in the middle
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3191 of some continuation line.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3192
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3193
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3194 @INDENTATION
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3195
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3196 Primarily for entering new code:
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3197 \t\\[indent-for-tab-command]\t indent line appropriately
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3198 \t\\[py-newline-and-indent]\t insert newline, then indent
6730
9c9a87b5bb17 Removed redundant eval-when-compile.
Barry Warsaw <barry@python.org>
parents: 6726
diff changeset
3199 \t\\[py-electric-backspace]\t reduce indentation, or delete single character
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3200
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3201 Primarily for reindenting existing code:
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3202 \t\\[py-guess-indent-offset]\t guess py-indent-offset from file content; change locally
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3203 \t\\[universal-argument] \\[py-guess-indent-offset]\t ditto, but change globally
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3204
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3205 \t\\[py-indent-region]\t reindent region to match its context
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3206 \t\\[py-shift-region-left]\t shift region left by py-indent-offset
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3207 \t\\[py-shift-region-right]\t shift region right by py-indent-offset
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3208
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3209 Unlike most programming languages, Python uses indentation, and only
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3210 indentation, to specify block structure. Hence the indentation supplied
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3211 automatically by Python-mode is just an educated guess: only you know
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3212 the block structure you intend, so only you can supply correct
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3213 indentation.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3214
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3215 The \\[indent-for-tab-command] and \\[py-newline-and-indent] keys try to suggest plausible indentation, based on
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3216 the indentation of preceding statements. E.g., assuming
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3217 py-indent-offset is 4, after you enter
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3218 \tif a > 0: \\[py-newline-and-indent]
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3219 the cursor will be moved to the position of the `_' (_ is not a
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3220 character in the file, it's just used here to indicate the location of
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3221 the cursor):
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3222 \tif a > 0:
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3223 \t _
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3224 If you then enter `c = d' \\[py-newline-and-indent], the cursor will move
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3225 to
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3226 \tif a > 0:
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3227 \t c = d
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3228 \t _
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3229 Python-mode cannot know whether that's what you intended, or whether
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3230 \tif a > 0:
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3231 \t c = d
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3232 \t_
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3233 was your intent. In general, Python-mode either reproduces the
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3234 indentation of the (closest code or indenting-comment) preceding
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3235 statement, or adds an extra py-indent-offset blanks if the preceding
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3236 statement has `:' as its last significant (non-whitespace and non-
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3237 comment) character. If the suggested indentation is too much, use
6730
9c9a87b5bb17 Removed redundant eval-when-compile.
Barry Warsaw <barry@python.org>
parents: 6726
diff changeset
3238 \\[py-electric-backspace] to reduce it.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3239
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3240 Continuation lines are given extra indentation. If you don't like the
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3241 suggested indentation, change it to something you do like, and Python-
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3242 mode will strive to indent later lines of the statement in the same way.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3243
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3244 If a line is a continuation line by virtue of being in an unclosed
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3245 paren/bracket/brace structure (`list', for short), the suggested
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3246 indentation depends on whether the current line contains the first item
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3247 in the list. If it does, it's indented py-indent-offset columns beyond
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3248 the indentation of the line containing the open bracket. If you don't
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3249 like that, change it by hand. The remaining items in the list will mimic
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3250 whatever indentation you give to the first item.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3251
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3252 If a line is a continuation line because the line preceding it ends with
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3253 a backslash, the third and following lines of the statement inherit their
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3254 indentation from the line preceding them. The indentation of the second
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3255 line in the statement depends on the form of the first (base) line: if
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3256 the base line is an assignment statement with anything more interesting
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3257 than the backslash following the leftmost assigning `=', the second line
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3258 is indented two columns beyond that `='. Else it's indented to two
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3259 columns beyond the leftmost solid chunk of non-whitespace characters on
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3260 the base line.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3261
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3262 Warning: indent-region should not normally be used! It calls \\[indent-for-tab-command]
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3263 repeatedly, and as explained above, \\[indent-for-tab-command] can't guess the block
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3264 structure you intend.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3265 %c:indent-for-tab-command
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3266 %c:py-newline-and-indent
6730
9c9a87b5bb17 Removed redundant eval-when-compile.
Barry Warsaw <barry@python.org>
parents: 6726
diff changeset
3267 %c:py-electric-backspace
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3268
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3269
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3270 The next function may be handy when editing code you didn't write:
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3271 %c:py-guess-indent-offset
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3272
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3273
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3274 The remaining `indent' functions apply to a region of Python code. They
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3275 assume the block structure (equals indentation, in Python) of the region
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3276 is correct, and alter the indentation in various ways while preserving
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3277 the block structure:
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3278 %c:py-indent-region
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3279 %c:py-shift-region-left
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3280 %c:py-shift-region-right
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3281
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3282 @MARKING & MANIPULATING REGIONS OF CODE
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3283
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3284 \\[py-mark-block]\t mark block of lines
6559
1a233be5fc17 (mark-python-def-or-class): Renamed to py-mark-def-or-class globally.
Barry Warsaw <barry@python.org>
parents: 6556
diff changeset
3285 \\[py-mark-def-or-class]\t mark smallest enclosing def
1a233be5fc17 (mark-python-def-or-class): Renamed to py-mark-def-or-class globally.
Barry Warsaw <barry@python.org>
parents: 6556
diff changeset
3286 \\[universal-argument] \\[py-mark-def-or-class]\t mark smallest enclosing class
3818
3c5ca7727988 (python-mode): Added menu support, requires easymenu.
Barry Warsaw <barry@python.org>
parents: 3813
diff changeset
3287 \\[comment-region]\t comment out region of code
3c5ca7727988 (python-mode): Added menu support, requires easymenu.
Barry Warsaw <barry@python.org>
parents: 3813
diff changeset
3288 \\[universal-argument] \\[comment-region]\t uncomment region of code
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3289 %c:py-mark-block
6559
1a233be5fc17 (mark-python-def-or-class): Renamed to py-mark-def-or-class globally.
Barry Warsaw <barry@python.org>
parents: 6556
diff changeset
3290 %c:py-mark-def-or-class
3818
3c5ca7727988 (python-mode): Added menu support, requires easymenu.
Barry Warsaw <barry@python.org>
parents: 3813
diff changeset
3291 %c:comment-region
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3292
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3293 @MOVING POINT
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3294
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3295 \\[py-previous-statement]\t move to statement preceding point
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3296 \\[py-next-statement]\t move to statement following point
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3297 \\[py-goto-block-up]\t move up to start of current block
8377
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
3298 \\[py-beginning-of-def-or-class]\t move to start of def
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
3299 \\[universal-argument] \\[py-beginning-of-def-or-class]\t move to start of class
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
3300 \\[py-end-of-def-or-class]\t move to end of def
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
3301 \\[universal-argument] \\[py-end-of-def-or-class]\t move to end of class
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3302
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3303 The first two move to one statement beyond the statement that contains
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3304 point. A numeric prefix argument tells them to move that many
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3305 statements instead. Blank lines, comment lines, and continuation lines
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3306 do not count as `statements' for these commands. So, e.g., you can go
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3307 to the first code statement in a file by entering
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3308 \t\\[beginning-of-buffer]\t to move to the top of the file
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3309 \t\\[py-next-statement]\t to skip over initial comments and blank lines
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3310 Or do `\\[py-previous-statement]' with a huge prefix argument.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3311 %c:py-previous-statement
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3312 %c:py-next-statement
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3313 %c:py-goto-block-up
8377
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
3314 %c:py-beginning-of-def-or-class
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
3315 %c:py-end-of-def-or-class
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3316
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3317 @LITTLE-KNOWN EMACS COMMANDS PARTICULARLY USEFUL IN PYTHON MODE
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3318
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3319 `\\[indent-new-comment-line]' is handy for entering a multi-line comment.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3320
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3321 `\\[set-selective-display]' with a `small' prefix arg is ideally suited for viewing the
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3322 overall class and def structure of a module.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3323
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3324 `\\[back-to-indentation]' moves point to a line's first non-blank character.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3325
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3326 `\\[indent-relative]' is handy for creating odd indentation.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3327
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3328 @OTHER EMACS HINTS
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3329
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3330 If you don't like the default value of a variable, change its value to
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3331 whatever you do like by putting a `setq' line in your .emacs file.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3332 E.g., to set the indentation increment to 4, put this line in your
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3333 .emacs:
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3334 \t(setq py-indent-offset 4)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3335 To see the value of a variable, do `\\[describe-variable]' and enter the variable
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3336 name at the prompt.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3337
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3338 When entering a key sequence like `C-c C-n', it is not necessary to
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3339 release the CONTROL key after doing the `C-c' part -- it suffices to
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3340 press the CONTROL key, press and release `c' (while still holding down
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3341 CONTROL), press and release `n' (while still holding down CONTROL), &
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3342 then release CONTROL.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3343
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3344 Entering Python mode calls with no arguments the value of the variable
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3345 `python-mode-hook', if that value exists and is not nil; for backward
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3346 compatibility it also tries `py-mode-hook'; see the `Hooks' section of
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3347 the Elisp manual for details.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3348
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3349 Obscure: When python-mode is first loaded, it looks for all bindings
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3350 to newline-and-indent in the global keymap, and shadows them with
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3351 local bindings to py-newline-and-indent."))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3352
23270
f970588e89b1 (py-shell-hook): A new hook variable, run at the end of py-shell.
Barry Warsaw <barry@python.org>
parents: 23230
diff changeset
3353 (require 'info-look)
23323
af499b50a094 Watch out for older XEmacsen for which requiring info-look doesn't
Barry Warsaw <barry@python.org>
parents: 23284
diff changeset
3354 ;; The info-look package does not always provide this function (it
af499b50a094 Watch out for older XEmacsen for which requiring info-look doesn't
Barry Warsaw <barry@python.org>
parents: 23284
diff changeset
3355 ;; appears this is the case with XEmacs 21.1)
af499b50a094 Watch out for older XEmacsen for which requiring info-look doesn't
Barry Warsaw <barry@python.org>
parents: 23284
diff changeset
3356 (when (fboundp 'info-lookup-maybe-add-help)
af499b50a094 Watch out for older XEmacsen for which requiring info-look doesn't
Barry Warsaw <barry@python.org>
parents: 23284
diff changeset
3357 (info-lookup-maybe-add-help
af499b50a094 Watch out for older XEmacsen for which requiring info-look doesn't
Barry Warsaw <barry@python.org>
parents: 23284
diff changeset
3358 :mode 'python-mode
af499b50a094 Watch out for older XEmacsen for which requiring info-look doesn't
Barry Warsaw <barry@python.org>
parents: 23284
diff changeset
3359 :regexp "[a-zA-Z0-9_]+"
af499b50a094 Watch out for older XEmacsen for which requiring info-look doesn't
Barry Warsaw <barry@python.org>
parents: 23284
diff changeset
3360 :doc-spec '(("(python-lib)Module Index")
af499b50a094 Watch out for older XEmacsen for which requiring info-look doesn't
Barry Warsaw <barry@python.org>
parents: 23284
diff changeset
3361 ("(python-lib)Class-Exception-Object Index")
af499b50a094 Watch out for older XEmacsen for which requiring info-look doesn't
Barry Warsaw <barry@python.org>
parents: 23284
diff changeset
3362 ("(python-lib)Function-Method-Variable Index")
af499b50a094 Watch out for older XEmacsen for which requiring info-look doesn't
Barry Warsaw <barry@python.org>
parents: 23284
diff changeset
3363 ("(python-lib)Miscellaneous Index")))
af499b50a094 Watch out for older XEmacsen for which requiring info-look doesn't
Barry Warsaw <barry@python.org>
parents: 23284
diff changeset
3364 )
23270
f970588e89b1 (py-shell-hook): A new hook variable, run at the end of py-shell.
Barry Warsaw <barry@python.org>
parents: 23230
diff changeset
3365
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3366
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3367 ;; Helper functions
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3368 (defvar py-parse-state-re
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3369 (concat
25878
d4cfa4043c09 (py-parse-state-re): Remove the "if" from the regular expression.
Barry Warsaw <barry@python.org>
parents: 25466
diff changeset
3370 "^[ \t]*\\(elif\\|else\\|while\\|def\\|class\\)\\>"
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3371 "\\|"
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3372 "^[^ #\t\n]"))
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3373
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3374 (defun py-parse-state ()
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3375 "Return the parse state at point (see `parse-partial-sexp' docs)."
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3376 (save-excursion
3487
83557153f544 (py-parse-state): make sure we don't land inside a triple-quoted
Barry Warsaw <barry@python.org>
parents: 3480
diff changeset
3377 (let ((here (point))
23222
ab4fa78afddf (py-execute-region): If you ran this without having visited a
Barry Warsaw <barry@python.org>
parents: 22524
diff changeset
3378 pps done)
3487
83557153f544 (py-parse-state): make sure we don't land inside a triple-quoted
Barry Warsaw <barry@python.org>
parents: 3480
diff changeset
3379 (while (not done)
83557153f544 (py-parse-state): make sure we don't land inside a triple-quoted
Barry Warsaw <barry@python.org>
parents: 3480
diff changeset
3380 ;; back up to the first preceding line (if any; else start of
83557153f544 (py-parse-state): make sure we don't land inside a triple-quoted
Barry Warsaw <barry@python.org>
parents: 3480
diff changeset
3381 ;; buffer) that begins with a popular Python keyword, or a
83557153f544 (py-parse-state): make sure we don't land inside a triple-quoted
Barry Warsaw <barry@python.org>
parents: 3480
diff changeset
3382 ;; non- whitespace and non-comment character. These are good
83557153f544 (py-parse-state): make sure we don't land inside a triple-quoted
Barry Warsaw <barry@python.org>
parents: 3480
diff changeset
3383 ;; places to start parsing to see whether where we started is
83557153f544 (py-parse-state): make sure we don't land inside a triple-quoted
Barry Warsaw <barry@python.org>
parents: 3480
diff changeset
3384 ;; at a non-zero nesting level. It may be slow for people who
83557153f544 (py-parse-state): make sure we don't land inside a triple-quoted
Barry Warsaw <barry@python.org>
parents: 3480
diff changeset
3385 ;; write huge code blocks or huge lists ... tough beans.
83557153f544 (py-parse-state): make sure we don't land inside a triple-quoted
Barry Warsaw <barry@python.org>
parents: 3480
diff changeset
3386 (re-search-backward py-parse-state-re nil 'move)
83557153f544 (py-parse-state): make sure we don't land inside a triple-quoted
Barry Warsaw <barry@python.org>
parents: 3480
diff changeset
3387 (beginning-of-line)
7262
c09907104092 (py-compute-indentation): Several changes made to improve navigation
Barry Warsaw <barry@python.org>
parents: 7201
diff changeset
3388 ;; In XEmacs, we have a much better way to test for whether
c09907104092 (py-compute-indentation): Several changes made to improve navigation
Barry Warsaw <barry@python.org>
parents: 7201
diff changeset
3389 ;; we're in a triple-quoted string or not. Emacs does not
8370
f2b0859fece3 #Documentation and comment typos patch given by Michael Ernst. More
Barry Warsaw <barry@python.org>
parents: 8070
diff changeset
3390 ;; have this built-in function, which is its loss because
7262
c09907104092 (py-compute-indentation): Several changes made to improve navigation
Barry Warsaw <barry@python.org>
parents: 7201
diff changeset
3391 ;; without scanning from the beginning of the buffer, there's
c09907104092 (py-compute-indentation): Several changes made to improve navigation
Barry Warsaw <barry@python.org>
parents: 7201
diff changeset
3392 ;; no accurate way to determine this otherwise.
23222
ab4fa78afddf (py-execute-region): If you ran this without having visited a
Barry Warsaw <barry@python.org>
parents: 22524
diff changeset
3393 (save-excursion (setq pps (parse-partial-sexp (point) here)))
ab4fa78afddf (py-execute-region): If you ran this without having visited a
Barry Warsaw <barry@python.org>
parents: 22524
diff changeset
3394 ;; make sure we don't land inside a triple-quoted string
ab4fa78afddf (py-execute-region): If you ran this without having visited a
Barry Warsaw <barry@python.org>
parents: 22524
diff changeset
3395 (setq done (or (not (nth 3 pps))
ab4fa78afddf (py-execute-region): If you ran this without having visited a
Barry Warsaw <barry@python.org>
parents: 22524
diff changeset
3396 (bobp)))
ab4fa78afddf (py-execute-region): If you ran this without having visited a
Barry Warsaw <barry@python.org>
parents: 22524
diff changeset
3397 ;; Just go ahead and short circuit the test back to the
ab4fa78afddf (py-execute-region): If you ran this without having visited a
Barry Warsaw <barry@python.org>
parents: 22524
diff changeset
3398 ;; beginning of the buffer. This will be slow, but not
ab4fa78afddf (py-execute-region): If you ran this without having visited a
Barry Warsaw <barry@python.org>
parents: 22524
diff changeset
3399 ;; nearly as slow as looping through many
ab4fa78afddf (py-execute-region): If you ran this without having visited a
Barry Warsaw <barry@python.org>
parents: 22524
diff changeset
3400 ;; re-search-backwards.
ab4fa78afddf (py-execute-region): If you ran this without having visited a
Barry Warsaw <barry@python.org>
parents: 22524
diff changeset
3401 (if (not done)
ab4fa78afddf (py-execute-region): If you ran this without having visited a
Barry Warsaw <barry@python.org>
parents: 22524
diff changeset
3402 (goto-char (point-min))))
3487
83557153f544 (py-parse-state): make sure we don't land inside a triple-quoted
Barry Warsaw <barry@python.org>
parents: 3480
diff changeset
3403 pps)))
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3404
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3405 (defun py-nesting-level ()
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3406 "Return the buffer position of the last unclosed enclosing list.
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3407 If nesting level is zero, return nil."
7262
c09907104092 (py-compute-indentation): Several changes made to improve navigation
Barry Warsaw <barry@python.org>
parents: 7201
diff changeset
3408 (let ((status (py-parse-state)))
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3409 (if (zerop (car status))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3410 nil ; not in a nest
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3411 (car (cdr status))))) ; char# of open bracket
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3412
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3413 (defun py-backslash-continuation-line-p ()
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3414 "Return t iff preceding line ends with backslash that is not in a comment."
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3415 (save-excursion
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3416 (beginning-of-line)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3417 (and
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3418 ;; use a cheap test first to avoid the regexp if possible
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3419 ;; use 'eq' because char-after may return nil
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3420 (eq (char-after (- (point) 2)) ?\\ )
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3421 ;; make sure; since eq test passed, there is a preceding line
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3422 (forward-line -1) ; always true -- side effect
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3423 (looking-at py-continued-re))))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3424
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3425 (defun py-continuation-line-p ()
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3426 "Return t iff current line is a continuation line."
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3427 (save-excursion
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3428 (beginning-of-line)
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3429 (or (py-backslash-continuation-line-p)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3430 (py-nesting-level))))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3431
9639
da1dd3e54b7a (py-goto-beginning-of-tqs): Finds the beginning of the triple quoted
Barry Warsaw <barry@python.org>
parents: 9503
diff changeset
3432 (defun py-goto-beginning-of-tqs (delim)
da1dd3e54b7a (py-goto-beginning-of-tqs): Finds the beginning of the triple quoted
Barry Warsaw <barry@python.org>
parents: 9503
diff changeset
3433 "Go to the beginning of the triple quoted string we find ourselves in.
da1dd3e54b7a (py-goto-beginning-of-tqs): Finds the beginning of the triple quoted
Barry Warsaw <barry@python.org>
parents: 9503
diff changeset
3434 DELIM is the TQS string delimiter character we're searching backwards
da1dd3e54b7a (py-goto-beginning-of-tqs): Finds the beginning of the triple quoted
Barry Warsaw <barry@python.org>
parents: 9503
diff changeset
3435 for."
15353
f480d52c0760 (py-goto-beginning-of-tqs): When searching backwards for the matching
Barry Warsaw <barry@python.org>
parents: 12994
diff changeset
3436 (let ((skip (and delim (make-string 1 delim)))
f480d52c0760 (py-goto-beginning-of-tqs): When searching backwards for the matching
Barry Warsaw <barry@python.org>
parents: 12994
diff changeset
3437 (continue t))
9639
da1dd3e54b7a (py-goto-beginning-of-tqs): Finds the beginning of the triple quoted
Barry Warsaw <barry@python.org>
parents: 9503
diff changeset
3438 (when skip
da1dd3e54b7a (py-goto-beginning-of-tqs): Finds the beginning of the triple quoted
Barry Warsaw <barry@python.org>
parents: 9503
diff changeset
3439 (save-excursion
15353
f480d52c0760 (py-goto-beginning-of-tqs): When searching backwards for the matching
Barry Warsaw <barry@python.org>
parents: 12994
diff changeset
3440 (while continue
f480d52c0760 (py-goto-beginning-of-tqs): When searching backwards for the matching
Barry Warsaw <barry@python.org>
parents: 12994
diff changeset
3441 (py-safe (search-backward skip))
f480d52c0760 (py-goto-beginning-of-tqs): When searching backwards for the matching
Barry Warsaw <barry@python.org>
parents: 12994
diff changeset
3442 (setq continue (and (not (bobp))
f480d52c0760 (py-goto-beginning-of-tqs): When searching backwards for the matching
Barry Warsaw <barry@python.org>
parents: 12994
diff changeset
3443 (= (char-before) ?\\))))
f480d52c0760 (py-goto-beginning-of-tqs): When searching backwards for the matching
Barry Warsaw <barry@python.org>
parents: 12994
diff changeset
3444 (if (and (= (char-before) delim)
f480d52c0760 (py-goto-beginning-of-tqs): When searching backwards for the matching
Barry Warsaw <barry@python.org>
parents: 12994
diff changeset
3445 (= (char-before (1- (point))) delim))
9639
da1dd3e54b7a (py-goto-beginning-of-tqs): Finds the beginning of the triple quoted
Barry Warsaw <barry@python.org>
parents: 9503
diff changeset
3446 (setq skip (make-string 3 delim))))
da1dd3e54b7a (py-goto-beginning-of-tqs): Finds the beginning of the triple quoted
Barry Warsaw <barry@python.org>
parents: 9503
diff changeset
3447 ;; we're looking at a triple-quoted string
da1dd3e54b7a (py-goto-beginning-of-tqs): Finds the beginning of the triple quoted
Barry Warsaw <barry@python.org>
parents: 9503
diff changeset
3448 (py-safe (search-backward skip)))))
da1dd3e54b7a (py-goto-beginning-of-tqs): Finds the beginning of the triple quoted
Barry Warsaw <barry@python.org>
parents: 9503
diff changeset
3449
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3450 (defun py-goto-initial-line ()
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3451 "Go to the initial line of the current statement.
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3452 Usually this is the line we're on, but if we're on the 2nd or
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3453 following lines of a continuation block, we need to go up to the first
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3454 line of the block."
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3455 ;; Tricky: We want to avoid quadratic-time behavior for long
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3456 ;; continued blocks, whether of the backslash or open-bracket
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3457 ;; varieties, or a mix of the two. The following manages to do that
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3458 ;; in the usual cases.
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3459 ;;
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3460 ;; Also, if we're sitting inside a triple quoted string, this will
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3461 ;; drop us at the line that begins the string.
7151
d339954ea57d (py-goto-initial-line): Shut up the byte compiler.
Barry Warsaw <barry@python.org>
parents: 7150
diff changeset
3462 (let (open-bracket-pos)
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3463 (while (py-continuation-line-p)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3464 (beginning-of-line)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3465 (if (py-backslash-continuation-line-p)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3466 (while (py-backslash-continuation-line-p)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3467 (forward-line -1))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3468 ;; else zip out of nested brackets/braces/parens
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3469 (while (setq open-bracket-pos (py-nesting-level))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3470 (goto-char open-bracket-pos)))))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3471 (beginning-of-line))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3472
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3473 (defun py-goto-beyond-final-line ()
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3474 "Go to the point just beyond the fine line of the current statement.
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3475 Usually this is the start of the next line, but if this is a
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3476 multi-line statement we need to skip over the continuation lines."
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3477 ;; Tricky: Again we need to be clever to avoid quadratic time
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3478 ;; behavior.
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3479 ;;
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3480 ;; XXX: Not quite the right solution, but deals with multi-line doc
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3481 ;; strings
8379
f5ebcc7a5ab2 (py-stringlit-re): Another ME patch to recognize SQTQs and DQTQs
Barry Warsaw <barry@python.org>
parents: 8378
diff changeset
3482 (if (looking-at (concat "[ \t]*\\(" py-stringlit-re "\\)"))
f5ebcc7a5ab2 (py-stringlit-re): Another ME patch to recognize SQTQs and DQTQs
Barry Warsaw <barry@python.org>
parents: 8378
diff changeset
3483 (goto-char (match-end 0)))
f5ebcc7a5ab2 (py-stringlit-re): Another ME patch to recognize SQTQs and DQTQs
Barry Warsaw <barry@python.org>
parents: 8378
diff changeset
3484 ;;
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3485 (forward-line 1)
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3486 (let (state)
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3487 (while (and (py-continuation-line-p)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3488 (not (eobp)))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3489 ;; skip over the backslash flavor
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3490 (while (and (py-backslash-continuation-line-p)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3491 (not (eobp)))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3492 (forward-line 1))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3493 ;; if in nest, zip to the end of the nest
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3494 (setq state (py-parse-state))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3495 (if (and (not (zerop (car state)))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3496 (not (eobp)))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3497 (progn
6544
d28932d676c8 Changes in preparation for integrating into the Python CVS tree.
Barry Warsaw <barry@python.org>
parents: 6232
diff changeset
3498 (parse-partial-sexp (point) (point-max) 0 nil state)
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3499 (forward-line 1))))))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3500
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3501 (defun py-statement-opens-block-p ()
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3502 "Return t iff the current statement opens a block.
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3503 I.e., iff it ends with a colon that is not in a comment. Point should
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3504 be at the start of a statement."
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3505 (save-excursion
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3506 (let ((start (point))
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3507 (finish (progn (py-goto-beyond-final-line) (1- (point))))
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3508 (searching t)
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3509 (answer nil)
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3510 state)
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3511 (goto-char start)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3512 (while searching
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3513 ;; look for a colon with nothing after it except whitespace, and
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3514 ;; maybe a comment
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3515 (if (re-search-forward ":\\([ \t]\\|\\\\\n\\)*\\(#.*\\)?$"
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3516 finish t)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3517 (if (eq (point) finish) ; note: no `else' clause; just
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3518 ; keep searching if we're not at
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3519 ; the end yet
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3520 ;; sure looks like it opens a block -- but it might
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3521 ;; be in a comment
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3522 (progn
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3523 (setq searching nil) ; search is done either way
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3524 (setq state (parse-partial-sexp start
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3525 (match-beginning 0)))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3526 (setq answer (not (nth 4 state)))))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3527 ;; search failed: couldn't find another interesting colon
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3528 (setq searching nil)))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3529 answer)))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3530
3900
cba4ce15a0d5 (py-statement-closes-block-p, py-compute-indentation): Outdent one
Barry Warsaw <barry@python.org>
parents: 3818
diff changeset
3531 (defun py-statement-closes-block-p ()
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3532 "Return t iff the current statement closes a block.
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3533 I.e., if the line starts with `return', `raise', `break', `continue',
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3534 and `pass'. This doesn't catch embedded statements."
3900
cba4ce15a0d5 (py-statement-closes-block-p, py-compute-indentation): Outdent one
Barry Warsaw <barry@python.org>
parents: 3818
diff changeset
3535 (let ((here (point)))
10918
a8a1eb99341c (py-statement-closes-block-p): py-goto-initial-line could leave us in
Barry Warsaw <barry@python.org>
parents: 10877
diff changeset
3536 (py-goto-initial-line)
3900
cba4ce15a0d5 (py-statement-closes-block-p, py-compute-indentation): Outdent one
Barry Warsaw <barry@python.org>
parents: 3818
diff changeset
3537 (back-to-indentation)
cba4ce15a0d5 (py-statement-closes-block-p, py-compute-indentation): Outdent one
Barry Warsaw <barry@python.org>
parents: 3818
diff changeset
3538 (prog1
6544
d28932d676c8 Changes in preparation for integrating into the Python CVS tree.
Barry Warsaw <barry@python.org>
parents: 6232
diff changeset
3539 (looking-at (concat py-block-closing-keywords-re "\\>"))
3900
cba4ce15a0d5 (py-statement-closes-block-p, py-compute-indentation): Outdent one
Barry Warsaw <barry@python.org>
parents: 3818
diff changeset
3540 (goto-char here))))
cba4ce15a0d5 (py-statement-closes-block-p, py-compute-indentation): Outdent one
Barry Warsaw <barry@python.org>
parents: 3818
diff changeset
3541
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3542 (defun py-goto-beyond-block ()
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3543 "Go to point just beyond the final line of block begun by the current line.
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3544 This is the same as where `py-goto-beyond-final-line' goes unless
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3545 we're on colon line, in which case we go to the end of the block.
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3546 Assumes point is at the beginning of the line."
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3547 (if (py-statement-opens-block-p)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3548 (py-mark-block nil 'just-move)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3549 (py-goto-beyond-final-line)))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3550
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3551 (defun py-goto-statement-at-or-above ()
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3552 "Go to the start of the first statement at or preceding point.
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3553 Return t if there is such a statement, otherwise nil. `Statement'
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3554 does not include blank lines, comments, or continuation lines."
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3555 (py-goto-initial-line)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3556 (if (looking-at py-blank-or-comment-re)
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3557 ;; skip back over blank & comment lines
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3558 ;; note: will skip a blank or comment line that happens to be
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3559 ;; a continuation line too
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3560 (if (re-search-backward "^[ \t]*[^ \t#\n]" nil t)
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3561 (progn (py-goto-initial-line) t)
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3562 nil)
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3563 t))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3564
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3565 (defun py-goto-statement-below ()
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3566 "Go to start of the first statement following the statement containing point.
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3567 Return t if there is such a statement, otherwise nil. `Statement'
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3568 does not include blank lines, comments, or continuation lines."
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3569 (beginning-of-line)
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3570 (let ((start (point)))
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3571 (py-goto-beyond-final-line)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3572 (while (and
23530
ecef65e57cc6 (py-goto-statement-below): Watch out for landing in a triple quoted
Barry Warsaw <barry@python.org>
parents: 23423
diff changeset
3573 (or (looking-at py-blank-or-comment-re)
ecef65e57cc6 (py-goto-statement-below): Watch out for landing in a triple quoted
Barry Warsaw <barry@python.org>
parents: 23423
diff changeset
3574 (py-in-literal))
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3575 (not (eobp)))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3576 (forward-line 1))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3577 (if (eobp)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3578 (progn (goto-char start) nil)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3579 t)))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3580
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3581 (defun py-go-up-tree-to-keyword (key)
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3582 "Go to begining of statement starting with KEY, at or preceding point.
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3583
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3584 KEY is a regular expression describing a Python keyword. Skip blank
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3585 lines and non-indenting comments. If the statement found starts with
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3586 KEY, then stop, otherwise go back to first enclosing block starting
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3587 with KEY. If successful, leave point at the start of the KEY line and
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3588 return t. Otherwise, leave point at an undefined place and return nil."
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3589 ;; skip blanks and non-indenting #
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3590 (py-goto-initial-line)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3591 (while (and
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3592 (looking-at "[ \t]*\\($\\|#[^ \t\n]\\)")
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3593 (zerop (forward-line -1))) ; go back
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3594 nil)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3595 (py-goto-initial-line)
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3596 (let* ((re (concat "[ \t]*" key "\\>"))
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3597 (case-fold-search nil) ; let* so looking-at sees this
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3598 (found (looking-at re))
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3599 (dead nil))
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3600 (while (not (or found dead))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3601 (condition-case nil ; in case no enclosing block
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3602 (py-goto-block-up 'no-mark)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3603 (error (setq dead t)))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3604 (or dead (setq found (looking-at re))))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3605 (beginning-of-line)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3606 found))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3607
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3608 (defun py-suck-up-leading-text ()
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3609 "Return string in buffer from start of indentation to end of line.
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3610 Prefix with \"...\" if leading whitespace was skipped."
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3611 (save-excursion
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3612 (back-to-indentation)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3613 (concat
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3614 (if (bolp) "" "...")
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3615 (buffer-substring (point) (progn (end-of-line) (point))))))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3616
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3617 (defun py-suck-up-first-keyword ()
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3618 "Return first keyword on the line as a Lisp symbol.
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3619 `Keyword' is defined (essentially) as the regular expression
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3620 ([a-z]+). Returns nil if none was found."
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3621 (let ((case-fold-search nil))
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3622 (if (looking-at "[ \t]*\\([a-z]+\\)\\>")
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3623 (intern (buffer-substring (match-beginning 1) (match-end 1)))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3624 nil)))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3625
4195
e3f6ada28ed0 I have been increasingly annoyed about the fact that
Barry Warsaw <barry@python.org>
parents: 4194
diff changeset
3626 (defun py-current-defun ()
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3627 "Python value for `add-log-current-defun-function'.
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3628 This tells add-log.el how to find the current function/method/variable."
4195
e3f6ada28ed0 I have been increasingly annoyed about the fact that
Barry Warsaw <barry@python.org>
parents: 4194
diff changeset
3629 (save-excursion
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3630
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3631 ;; Move back to start of the current statement.
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3632
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3633 (py-goto-initial-line)
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3634 (back-to-indentation)
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3635 (while (and (or (looking-at py-blank-or-comment-re)
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3636 (py-in-literal))
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3637 (not (bobp)))
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3638 (backward-to-indentation 1))
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3639 (py-goto-initial-line)
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3640
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3641 (let ((scopes "")
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3642 (sep "")
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3643 dead assignment)
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3644
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3645 ;; Check for an assignment. If this assignment exists inside a
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3646 ;; def, it will be overwritten inside the while loop. If it
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3647 ;; exists at top lever or inside a class, it will be preserved.
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3648
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3649 (when (looking-at "[ \t]*\\([a-zA-Z0-9_]+\\)[ \t]*=")
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3650 (setq scopes (buffer-substring (match-beginning 1) (match-end 1)))
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3651 (setq assignment t)
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3652 (setq sep "."))
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3653
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3654 ;; Prepend the name of each outer socpe (def or class).
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3655
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3656 (while (not dead)
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3657 (if (and (py-go-up-tree-to-keyword "\\(class\\|def\\)")
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3658 (looking-at
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3659 "[ \t]*\\(class\\|def\\)[ \t]*\\([a-zA-Z0-9_]+\\)[ \t]*"))
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3660 (let ((name (buffer-substring (match-beginning 2) (match-end 2))))
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3661 (if (and assignment (looking-at "[ \t]*def"))
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3662 (setq scopes name)
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3663 (setq scopes (concat name sep scopes))
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3664 (setq sep "."))))
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3665 (setq assignment nil)
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3666 (condition-case nil ; Terminate nicely at top level.
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3667 (py-goto-block-up 'no-mark)
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3668 (error (setq dead t))))
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3669 (if (string= scopes "")
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3670 nil
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3671 scopes))))
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3672
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3673
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3674
2799
4a998b1a331f #changed all email address to go through python.org
Barry Warsaw <barry@python.org>
parents: 2798
diff changeset
3675 (defconst py-help-address "python-mode@python.org"
2495
718c65d0e12d (py-mode-map): py-mark-block moved to C-c C-m (was C-c C-b).
Barry Warsaw <barry@python.org>
parents: 2493
diff changeset
3676 "Address accepting submission of bug reports.")
718c65d0e12d (py-mode-map): py-mark-block moved to C-c C-m (was C-c C-b).
Barry Warsaw <barry@python.org>
parents: 2493
diff changeset
3677
718c65d0e12d (py-mode-map): py-mark-block moved to C-c C-m (was C-c C-b).
Barry Warsaw <barry@python.org>
parents: 2493
diff changeset
3678 (defun py-version ()
718c65d0e12d (py-mode-map): py-mark-block moved to C-c C-m (was C-c C-b).
Barry Warsaw <barry@python.org>
parents: 2493
diff changeset
3679 "Echo the current version of `python-mode' in the minibuffer."
718c65d0e12d (py-mode-map): py-mark-block moved to C-c C-m (was C-c C-b).
Barry Warsaw <barry@python.org>
parents: 2493
diff changeset
3680 (interactive)
718c65d0e12d (py-mode-map): py-mark-block moved to C-c C-m (was C-c C-b).
Barry Warsaw <barry@python.org>
parents: 2493
diff changeset
3681 (message "Using `python-mode' version %s" py-version)
718c65d0e12d (py-mode-map): py-mark-block moved to C-c C-m (was C-c C-b).
Barry Warsaw <barry@python.org>
parents: 2493
diff changeset
3682 (py-keep-region-active))
718c65d0e12d (py-mode-map): py-mark-block moved to C-c C-m (was C-c C-b).
Barry Warsaw <barry@python.org>
parents: 2493
diff changeset
3683
718c65d0e12d (py-mode-map): py-mark-block moved to C-c C-m (was C-c C-b).
Barry Warsaw <barry@python.org>
parents: 2493
diff changeset
3684 ;; only works under Emacs 19
718c65d0e12d (py-mode-map): py-mark-block moved to C-c C-m (was C-c C-b).
Barry Warsaw <barry@python.org>
parents: 2493
diff changeset
3685 ;(eval-when-compile
718c65d0e12d (py-mode-map): py-mark-block moved to C-c C-m (was C-c C-b).
Barry Warsaw <barry@python.org>
parents: 2493
diff changeset
3686 ; (require 'reporter))
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3687
2495
718c65d0e12d (py-mode-map): py-mark-block moved to C-c C-m (was C-c C-b).
Barry Warsaw <barry@python.org>
parents: 2493
diff changeset
3688 (defun py-submit-bug-report (enhancement-p)
718c65d0e12d (py-mode-map): py-mark-block moved to C-c C-m (was C-c C-b).
Barry Warsaw <barry@python.org>
parents: 2493
diff changeset
3689 "Submit via mail a bug report on `python-mode'.
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3690 With \\[universal-argument] (programmatically, argument ENHANCEMENT-P
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3691 non-nil) just submit an enhancement request."
2495
718c65d0e12d (py-mode-map): py-mark-block moved to C-c C-m (was C-c C-b).
Barry Warsaw <barry@python.org>
parents: 2493
diff changeset
3692 (interactive
718c65d0e12d (py-mode-map): py-mark-block moved to C-c C-m (was C-c C-b).
Barry Warsaw <barry@python.org>
parents: 2493
diff changeset
3693 (list (not (y-or-n-p
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3694 "Is this a bug report (hit `n' to send other comments)? "))))
2543
1a448dd84edc (py-submit-bug-report): fixed summary querying
Barry Warsaw <barry@python.org>
parents: 2537
diff changeset
3695 (let ((reporter-prompt-for-summary-p (if enhancement-p
1a448dd84edc (py-submit-bug-report): fixed summary querying
Barry Warsaw <barry@python.org>
parents: 2537
diff changeset
3696 "(Very) brief summary: "
1a448dd84edc (py-submit-bug-report): fixed summary querying
Barry Warsaw <barry@python.org>
parents: 2537
diff changeset
3697 t)))
2495
718c65d0e12d (py-mode-map): py-mark-block moved to C-c C-m (was C-c C-b).
Barry Warsaw <barry@python.org>
parents: 2493
diff changeset
3698 (require 'reporter)
718c65d0e12d (py-mode-map): py-mark-block moved to C-c C-m (was C-c C-b).
Barry Warsaw <barry@python.org>
parents: 2493
diff changeset
3699 (reporter-submit-bug-report
718c65d0e12d (py-mode-map): py-mark-block moved to C-c C-m (was C-c C-b).
Barry Warsaw <barry@python.org>
parents: 2493
diff changeset
3700 py-help-address ;address
2543
1a448dd84edc (py-submit-bug-report): fixed summary querying
Barry Warsaw <barry@python.org>
parents: 2537
diff changeset
3701 (concat "python-mode " py-version) ;pkgname
2495
718c65d0e12d (py-mode-map): py-mark-block moved to C-c C-m (was C-c C-b).
Barry Warsaw <barry@python.org>
parents: 2493
diff changeset
3702 ;; varlist
718c65d0e12d (py-mode-map): py-mark-block moved to C-c C-m (was C-c C-b).
Barry Warsaw <barry@python.org>
parents: 2493
diff changeset
3703 (if enhancement-p nil
718c65d0e12d (py-mode-map): py-mark-block moved to C-c C-m (was C-c C-b).
Barry Warsaw <barry@python.org>
parents: 2493
diff changeset
3704 '(py-python-command
718c65d0e12d (py-mode-map): py-mark-block moved to C-c C-m (was C-c C-b).
Barry Warsaw <barry@python.org>
parents: 2493
diff changeset
3705 py-indent-offset
718c65d0e12d (py-mode-map): py-mark-block moved to C-c C-m (was C-c C-b).
Barry Warsaw <barry@python.org>
parents: 2493
diff changeset
3706 py-block-comment-prefix
718c65d0e12d (py-mode-map): py-mark-block moved to C-c C-m (was C-c C-b).
Barry Warsaw <barry@python.org>
parents: 2493
diff changeset
3707 py-temp-directory
718c65d0e12d (py-mode-map): py-mark-block moved to C-c C-m (was C-c C-b).
Barry Warsaw <barry@python.org>
parents: 2493
diff changeset
3708 py-beep-if-tab-change))
718c65d0e12d (py-mode-map): py-mark-block moved to C-c C-m (was C-c C-b).
Barry Warsaw <barry@python.org>
parents: 2493
diff changeset
3709 nil ;pre-hooks
718c65d0e12d (py-mode-map): py-mark-block moved to C-c C-m (was C-c C-b).
Barry Warsaw <barry@python.org>
parents: 2493
diff changeset
3710 nil ;post-hooks
718c65d0e12d (py-mode-map): py-mark-block moved to C-c C-m (was C-c C-b).
Barry Warsaw <barry@python.org>
parents: 2493
diff changeset
3711 "Dear Barry,") ;salutation
718c65d0e12d (py-mode-map): py-mark-block moved to C-c C-m (was C-c C-b).
Barry Warsaw <barry@python.org>
parents: 2493
diff changeset
3712 (if enhancement-p nil
718c65d0e12d (py-mode-map): py-mark-block moved to C-c C-m (was C-c C-b).
Barry Warsaw <barry@python.org>
parents: 2493
diff changeset
3713 (set-mark (point))
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3714 (insert
2495
718c65d0e12d (py-mode-map): py-mark-block moved to C-c C-m (was C-c C-b).
Barry Warsaw <barry@python.org>
parents: 2493
diff changeset
3715 "Please replace this text with a sufficiently large code sample\n\
718c65d0e12d (py-mode-map): py-mark-block moved to C-c C-m (was C-c C-b).
Barry Warsaw <barry@python.org>
parents: 2493
diff changeset
3716 and an exact recipe so that I can reproduce your problem. Failure\n\
718c65d0e12d (py-mode-map): py-mark-block moved to C-c C-m (was C-c C-b).
Barry Warsaw <barry@python.org>
parents: 2493
diff changeset
3717 to do so may mean a greater delay in fixing your bug.\n\n")
718c65d0e12d (py-mode-map): py-mark-block moved to C-c C-m (was C-c C-b).
Barry Warsaw <barry@python.org>
parents: 2493
diff changeset
3718 (exchange-point-and-mark)
718c65d0e12d (py-mode-map): py-mark-block moved to C-c C-m (was C-c C-b).
Barry Warsaw <barry@python.org>
parents: 2493
diff changeset
3719 (py-keep-region-active))))
718c65d0e12d (py-mode-map): py-mark-block moved to C-c C-m (was C-c C-b).
Barry Warsaw <barry@python.org>
parents: 2493
diff changeset
3720
718c65d0e12d (py-mode-map): py-mark-block moved to C-c C-m (was C-c C-b).
Barry Warsaw <barry@python.org>
parents: 2493
diff changeset
3721
6667
089c04d89151 (py-kill-emacs-hook): Simplification.
Barry Warsaw <barry@python.org>
parents: 6663
diff changeset
3722 (defun py-kill-emacs-hook ()
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3723 "Delete files in `py-file-queue'.
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3724 These are Python temporary files awaiting execution."
6667
089c04d89151 (py-kill-emacs-hook): Simplification.
Barry Warsaw <barry@python.org>
parents: 6663
diff changeset
3725 (mapcar #'(lambda (filename)
089c04d89151 (py-kill-emacs-hook): Simplification.
Barry Warsaw <barry@python.org>
parents: 6663
diff changeset
3726 (py-safe (delete-file filename)))
089c04d89151 (py-kill-emacs-hook): Simplification.
Barry Warsaw <barry@python.org>
parents: 6663
diff changeset
3727 py-file-queue))
089c04d89151 (py-kill-emacs-hook): Simplification.
Barry Warsaw <barry@python.org>
parents: 6663
diff changeset
3728
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3729 ;; arrange to kill temp files when Emacs exists
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
3730 (add-hook 'kill-emacs-hook 'py-kill-emacs-hook)
17416
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
3731 (add-hook 'comint-output-filter-functions 'py-pdbtrack-track-stack-file)
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
3732
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
3733 ;; Add a designator to the minor mode strings
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3734 (or (assq 'py-pdbtrack-is-tracking-p minor-mode-alist)
17416
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
3735 (push '(py-pdbtrack-is-tracking-p py-pdbtrack-minor-mode-string)
9dcb4bd65154 intermediate
Barry Warsaw <barry@python.org>
parents: 16764
diff changeset
3736 minor-mode-alist))
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3737
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3738
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3739
26968
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3740 ;;; paragraph and string filling code from Bernhard Herzog
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3741 ;;; see http://mail.python.org/pipermail/python-list/2002-May/103189.html
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3742
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3743 (defun py-fill-comment (&optional justify)
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3744 "Fill the comment paragraph around point"
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3745 (let (;; Non-nil if the current line contains a comment.
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3746 has-comment
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3747
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3748 ;; If has-comment, the appropriate fill-prefix for the comment.
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3749 comment-fill-prefix)
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3750
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3751 ;; Figure out what kind of comment we are looking at.
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3752 (save-excursion
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3753 (beginning-of-line)
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3754 (cond
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3755 ;; A line with nothing but a comment on it?
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3756 ((looking-at "[ \t]*#[# \t]*")
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3757 (setq has-comment t
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3758 comment-fill-prefix (buffer-substring (match-beginning 0)
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3759 (match-end 0))))
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3760
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3761 ;; A line with some code, followed by a comment? Remember that the hash
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3762 ;; which starts the comment shouldn't be part of a string or character.
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3763 ((progn
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3764 (while (not (looking-at "#\\|$"))
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3765 (skip-chars-forward "^#\n\"'\\")
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3766 (cond
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3767 ((eq (char-after (point)) ?\\) (forward-char 2))
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3768 ((memq (char-after (point)) '(?\" ?')) (forward-sexp 1))))
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3769 (looking-at "#+[\t ]*"))
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3770 (setq has-comment t)
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3771 (setq comment-fill-prefix
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3772 (concat (make-string (current-column) ? )
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3773 (buffer-substring (match-beginning 0) (match-end 0)))))))
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3774
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3775 (if (not has-comment)
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3776 (fill-paragraph justify)
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3777
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3778 ;; Narrow to include only the comment, and then fill the region.
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3779 (save-restriction
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3780 (narrow-to-region
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3781
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3782 ;; Find the first line we should include in the region to fill.
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3783 (save-excursion
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3784 (while (and (zerop (forward-line -1))
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3785 (looking-at "^[ \t]*#")))
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3786
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3787 ;; We may have gone to far. Go forward again.
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3788 (or (looking-at "^[ \t]*#")
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3789 (forward-line 1))
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3790 (point))
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3791
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3792 ;; Find the beginning of the first line past the region to fill.
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3793 (save-excursion
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3794 (while (progn (forward-line 1)
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3795 (looking-at "^[ \t]*#")))
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3796 (point)))
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3797
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3798 ;; Lines with only hashes on them can be paragraph boundaries.
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3799 (let ((paragraph-start (concat paragraph-start "\\|[ \t#]*$"))
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3800 (paragraph-separate (concat paragraph-separate "\\|[ \t#]*$"))
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3801 (fill-prefix comment-fill-prefix))
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3802 ;;(message "paragraph-start %S paragraph-separate %S"
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3803 ;;paragraph-start paragraph-separate)
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3804 (fill-paragraph justify))))
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3805 t))
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3806
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3807
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3808 (defun py-fill-string (start &optional justify)
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3809 "Fill the paragraph around (point) in the string starting at start"
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3810 ;; basic strategy: narrow to the string and call the default
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3811 ;; implementation
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3812 (let (;; the start of the string's contents
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3813 string-start
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3814 ;; the end of the string's contents
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3815 string-end
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3816 ;; length of the string's delimiter
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3817 delim-length
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3818 ;; The string delimiter
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3819 delim
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3820 )
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3821
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3822 (save-excursion
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3823 (goto-char start)
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3824 (if (looking-at "\\('''\\|\"\"\"\\|'\\|\"\\)\\\\?\n?")
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3825 (setq string-start (match-end 0)
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3826 delim-length (- (match-end 1) (match-beginning 1))
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3827 delim (buffer-substring-no-properties (match-beginning 1)
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3828 (match-end 1)))
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3829 (error "The parameter start is not the beginning of a python string"))
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3830
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3831 ;; if the string is the first token on a line and doesn't start with
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3832 ;; a newline, fill as if the string starts at the beginning of the
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3833 ;; line. this helps with one line docstrings
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3834 (save-excursion
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3835 (beginning-of-line)
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3836 (and (/= (char-before string-start) ?\n)
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3837 (looking-at (concat "[ \t]*" delim))
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3838 (setq string-start (point))))
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3839
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3840 (forward-sexp (if (= delim-length 3) 2 1))
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3841
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3842 ;; with both triple quoted strings and single/double quoted strings
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3843 ;; we're now directly behind the first char of the end delimiter
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3844 ;; (this doesn't work correctly when the triple quoted string
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3845 ;; contains the quote mark itself). The end of the string's contents
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3846 ;; is one less than point
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3847 (setq string-end (1- (point))))
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3848
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3849 ;; Narrow to the string's contents and fill the current paragraph
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3850 (save-restriction
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3851 (narrow-to-region string-start string-end)
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3852 (let ((ends-with-newline (= (char-before (point-max)) ?\n)))
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3853 (fill-paragraph justify)
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3854 (if (and (not ends-with-newline)
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3855 (= (char-before (point-max)) ?\n))
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3856 ;; the default fill-paragraph implementation has inserted a
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3857 ;; newline at the end. Remove it again.
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3858 (save-excursion
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3859 (goto-char (point-max))
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3860 (delete-char -1)))))
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3861
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3862 ;; return t to indicate that we've done our work
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3863 t))
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3864
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3865 (defun py-fill-paragraph (&optional justify)
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3866 "Like \\[fill-paragraph], but handle Python comments and strings.
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3867 If any of the current line is a comment, fill the comment or the
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3868 paragraph of it that point is in, preserving the comment's indentation
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3869 and initial `#'s.
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3870 If point is inside a string, narrow to that string and fill.
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3871 "
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3872 (interactive "P")
45163
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3873 ;; fill-paragraph will narrow incorrectly
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3874 (save-restriction
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3875 (widen)
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3876 (let* ((bod (py-point 'bod))
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3877 (pps (parse-partial-sexp bod (point))))
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3878 (cond
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3879 ;; are we inside a comment or on a line with only whitespace before
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3880 ;; the comment start?
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3881 ((or (nth 4 pps)
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3882 (save-excursion (beginning-of-line) (looking-at "[ \t]*#")))
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3883 (py-fill-comment justify))
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3884 ;; are we inside a string?
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3885 ((nth 3 pps)
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3886 (py-fill-string (nth 8 pps)))
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3887 ;; are we at the opening quote of a string, or in the indentation?
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3888 ((save-excursion
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3889 (forward-word 1)
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3890 (eq (py-in-literal) 'string))
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3891 (save-excursion
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3892 (py-fill-string (py-point 'boi))))
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3893 ;; are we at or after the closing quote of a string?
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3894 ((save-excursion
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3895 (backward-word 1)
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3896 (eq (py-in-literal) 'string))
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3897 (save-excursion
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3898 (py-fill-string (py-point 'boi))))
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3899 ;; otherwise use the default
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3900 (t
5bda4f76ad92 sync with most recent version from python-mode sf project
Skip Montanaro <skip@pobox.com>
parents: 31236
diff changeset
3901 (fill-paragraph justify))))))
26968
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3902
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3903
bf9e0424237f Bernhard Herzog's paragraph and string-filling code. I've been using it for
Skip Montanaro <skip@pobox.com>
parents: 25878
diff changeset
3904
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3905 (provide 'python-mode)
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3906 ;;; python-mode.el ends here