annotate Misc/python-mode.el @ 8924:0954ad4acdfd legacy-trunk

(py-compute-indentation): Changes to the `t' condition which affect indetnation of normal statements: The regular expression that searches for indenting comment lines has been changed to not require a space/tab after the first `#'. We then explicitly look for py-block-comment-prefix depending on the value of py-honor-comment-indentation. I think this more accurately reflects the documentation for py-honor-comment-indentation.
author Barry Warsaw <barry@python.org>
date Mon, 10 Aug 1998 21:44:37 +0000
parents 9a984276cc56
children be935851dc50
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
7262
c09907104092 (py-compute-indentation): Several changes made to improve navigation
Barry Warsaw <barry@python.org>
parents: 7201
diff changeset
5 ;; Author: 1995-1998 Barry A. Warsaw
2799
4a998b1a331f #changed all email address to go through python.org
Barry Warsaw <barry@python.org>
parents: 2798
diff changeset
6 ;; 1992-1994 Tim Peters
6555
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
7 ;; Maintainer: python-mode@python.org
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
8 ;; Created: Feb 1992
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
9 ;; Keywords: python languages oop
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
10
7796
68e2b0dbbec8 #Oops, I lost the CVS/RCS $Revision$
Barry Warsaw <barry@python.org>
parents: 7777
diff changeset
11 (defconst py-version "$Revision$"
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
12 "`python-mode' version number.")
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
13
2524
6001448fab89 #updated copywrite notice by removing the GPL language according to
Barry Warsaw <barry@python.org>
parents: 2513
diff changeset
14 ;; 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
15 ;; 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
16 ;; 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
17 ;; 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
18 ;; notice and this paragraph appear in all copies.
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
19
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
20 ;;; Commentary:
3925
4bcee63d5bb1 (python-mode): automatically install imenu stuff.
Barry Warsaw <barry@python.org>
parents: 3924
diff changeset
21
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
22 ;; This is a major mode for editing Python programs. It was developed
4066
2c89bf04f834 *** empty log message ***
Barry Warsaw <barry@python.org>
parents: 4000
diff changeset
23 ;; by Tim Peters after an original idea by Michael A. Guravage. Tim
2c89bf04f834 *** empty log message ***
Barry Warsaw <barry@python.org>
parents: 4000
diff changeset
24 ;; subsequently left the net; in 1995, Barry Warsaw inherited the
2c89bf04f834 *** empty log message ***
Barry Warsaw <barry@python.org>
parents: 4000
diff changeset
25 ;; mode and is the current maintainer.
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
26
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
27 ;; COMPATIBILITY:
0255b5ecde10 Update to the Big Comment at the top of the file. It should better
Barry Warsaw <barry@python.org>
parents: 6767
diff changeset
28
0255b5ecde10 Update to the Big Comment at the top of the file. It should better
Barry Warsaw <barry@python.org>
parents: 6767
diff changeset
29 ;; This version of python-mode.el is no longer compatible with Emacs
0255b5ecde10 Update to the Big Comment at the top of the file. It should better
Barry Warsaw <barry@python.org>
parents: 6767
diff changeset
30 ;; 18. For a gabazillion reasons, I highly recommend upgrading to
0255b5ecde10 Update to the Big Comment at the top of the file. It should better
Barry Warsaw <barry@python.org>
parents: 6767
diff changeset
31 ;; X/Emacs 19 or X/Emacs 20. I recommend at least Emacs 19.34 or
0255b5ecde10 Update to the Big Comment at the top of the file. It should better
Barry Warsaw <barry@python.org>
parents: 6767
diff changeset
32 ;; XEmacs 19.15. Any of the v20 X/Emacsen should be fine.
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
33
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
34 ;; NOTE TO FSF EMACS USERS:
6725
283d1ca585d9 Test for an up-to-date Custom library when byte-compiling, and issue
Barry Warsaw <barry@python.org>
parents: 6695
diff changeset
35
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
36 ;; You may need to acquire the Custom library -- this applies to users
0255b5ecde10 Update to the Big Comment at the top of the file. It should better
Barry Warsaw <barry@python.org>
parents: 6767
diff changeset
37 ;; of Emacs 19.34 and NTEmacs based on 19.34, but not to Emacs 20
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 ;; users. You must also byte-compile this file before use -- this
0255b5ecde10 Update to the Big Comment at the top of the file. It should better
Barry Warsaw <barry@python.org>
parents: 6767
diff changeset
39 ;; applies to FSF's Emacs 19.34, 20.x, and NTEmacs based on 19.34.
0255b5ecde10 Update to the Big Comment at the top of the file. It should better
Barry Warsaw <barry@python.org>
parents: 6767
diff changeset
40 ;; None of this applies to XEmacs (although byte compilation is still
0255b5ecde10 Update to the Big Comment at the top of the file. It should better
Barry Warsaw <barry@python.org>
parents: 6767
diff changeset
41 ;; recommended). You will also need to add the following to your
0255b5ecde10 Update to the Big Comment at the top of the file. It should better
Barry Warsaw <barry@python.org>
parents: 6767
diff changeset
42 ;; .emacs file so that the .py files come up in python-mode:
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
43 ;;
6544
d28932d676c8 Changes in preparation for integrating into the Python CVS tree.
Barry Warsaw <barry@python.org>
parents: 6232
diff changeset
44 ;; (autoload 'python-mode "python-mode" "Python editing mode." t)
d28932d676c8 Changes in preparation for integrating into the Python CVS tree.
Barry Warsaw <barry@python.org>
parents: 6232
diff changeset
45 ;; (setq auto-mode-alist
d28932d676c8 Changes in preparation for integrating into the Python CVS tree.
Barry Warsaw <barry@python.org>
parents: 6232
diff changeset
46 ;; (cons '("\\.py$" . python-mode) auto-mode-alist))
d28932d676c8 Changes in preparation for integrating into the Python CVS tree.
Barry Warsaw <barry@python.org>
parents: 6232
diff changeset
47 ;; (setq interpreter-mode-alist
d28932d676c8 Changes in preparation for integrating into the Python CVS tree.
Barry Warsaw <barry@python.org>
parents: 6232
diff changeset
48 ;; (cons '("python" . python-mode) interpreter-mode-alist))
3746
7504884e8a74 (python-font-lock-keywords): added class and def
Barry Warsaw <barry@python.org>
parents: 3745
diff changeset
49 ;;
6544
d28932d676c8 Changes in preparation for integrating into the Python CVS tree.
Barry Warsaw <barry@python.org>
parents: 6232
diff changeset
50 ;; Assuming python-mode.el is on your load-path, it will be invoked
d28932d676c8 Changes in preparation for integrating into the Python CVS tree.
Barry Warsaw <barry@python.org>
parents: 6232
diff changeset
51 ;; when you visit a .py file, or a file with a first line that looks
d28932d676c8 Changes in preparation for integrating into the Python CVS tree.
Barry Warsaw <barry@python.org>
parents: 6232
diff changeset
52 ;; like:
d28932d676c8 Changes in preparation for integrating into the Python CVS tree.
Barry Warsaw <barry@python.org>
parents: 6232
diff changeset
53 ;;
d28932d676c8 Changes in preparation for integrating into the Python CVS tree.
Barry Warsaw <barry@python.org>
parents: 6232
diff changeset
54 ;; #! /usr/bin/env python
d28932d676c8 Changes in preparation for integrating into the Python CVS tree.
Barry Warsaw <barry@python.org>
parents: 6232
diff changeset
55
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
56 ;; NOTE TO XEMACS USERS:
0255b5ecde10 Update to the Big Comment at the top of the file. It should better
Barry Warsaw <barry@python.org>
parents: 6767
diff changeset
57
0255b5ecde10 Update to the Big Comment at the top of the file. It should better
Barry Warsaw <barry@python.org>
parents: 6767
diff changeset
58 ;; An older version of this file was distributed with XEmacs 19.15,
0255b5ecde10 Update to the Big Comment at the top of the file. It should better
Barry Warsaw <barry@python.org>
parents: 6767
diff changeset
59 ;; 19.16 and 20.3. By default, in XEmacs when you visit a .py file,
0255b5ecde10 Update to the Big Comment at the top of the file. It should better
Barry Warsaw <barry@python.org>
parents: 6767
diff changeset
60 ;; the buffer is put in Python mode. Likewise for executable scripts
0255b5ecde10 Update to the Big Comment at the top of the file. It should better
Barry Warsaw <barry@python.org>
parents: 6767
diff changeset
61 ;; with the word `python' on the first line. You shouldn't need to do
0255b5ecde10 Update to the Big Comment at the top of the file. It should better
Barry Warsaw <barry@python.org>
parents: 6767
diff changeset
62 ;; much except make sure this new version is earlier in your
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 ;; load-path, and byte-compile this file.
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
0255b5ecde10 Update to the Big Comment at the top of the file. It should better
Barry Warsaw <barry@python.org>
parents: 6767
diff changeset
65 ;; 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
66
8370
f2b0859fece3 #Documentation and comment typos patch given by Michael Ernst. More
Barry Warsaw <barry@python.org>
parents: 8070
diff changeset
67 ;; Please see <http://www.python.org/emacs/python-mode/> for the
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
68 ;; latest information and compatibility notes.
0255b5ecde10 Update to the Big Comment at the top of the file. It should better
Barry Warsaw <barry@python.org>
parents: 6767
diff changeset
69
0255b5ecde10 Update to the Big Comment at the top of the file. It should better
Barry Warsaw <barry@python.org>
parents: 6767
diff changeset
70 ;; BUG REPORTING:
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
71
6544
d28932d676c8 Changes in preparation for integrating into the Python CVS tree.
Barry Warsaw <barry@python.org>
parents: 6232
diff changeset
72 ;; To submit bug reports, use C-c C-b. Please include a complete, but
d28932d676c8 Changes in preparation for integrating into the Python CVS tree.
Barry Warsaw <barry@python.org>
parents: 6232
diff changeset
73 ;; 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
74 ;; 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
75
d28932d676c8 Changes in preparation for integrating into the Python CVS tree.
Barry Warsaw <barry@python.org>
parents: 6232
diff changeset
76 ;; 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
77 ;; 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
78 ;; 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
79
6767
e97b8237591c Added some links to OO-Browser, given by Harri Pasanen.
Barry Warsaw <barry@python.org>
parents: 6731
diff changeset
80 ;; If you are using XEmacs, you may also want to check out OO-Browser
e97b8237591c Added some links to OO-Browser, given by Harri Pasanen.
Barry Warsaw <barry@python.org>
parents: 6731
diff changeset
81 ;; that comes bundled with it, including documentation in the info
e97b8237591c Added some links to OO-Browser, given by Harri Pasanen.
Barry Warsaw <barry@python.org>
parents: 6731
diff changeset
82 ;; pages. For GNU Emacs you have to install it yourself. To read
e97b8237591c Added some links to OO-Browser, given by Harri Pasanen.
Barry Warsaw <barry@python.org>
parents: 6731
diff changeset
83 ;; more about OO-Browser, follow these links:
e97b8237591c Added some links to OO-Browser, given by Harri Pasanen.
Barry Warsaw <barry@python.org>
parents: 6731
diff changeset
84
e97b8237591c Added some links to OO-Browser, given by Harri Pasanen.
Barry Warsaw <barry@python.org>
parents: 6731
diff changeset
85 ;; http://www.python.org/workshops/1996-06/papers/h.pasanen/oobr_contents.html
e97b8237591c Added some links to OO-Browser, given by Harri Pasanen.
Barry Warsaw <barry@python.org>
parents: 6731
diff changeset
86 ;; http://www.infodock.com/manuals/alt-oobr-cover.html
e97b8237591c Added some links to OO-Browser, given by Harri Pasanen.
Barry Warsaw <barry@python.org>
parents: 6731
diff changeset
87
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
88 ;; You may also want to take a look at Harri Pasanen's "Python Library
0255b5ecde10 Update to the Big Comment at the top of the file. It should better
Barry Warsaw <barry@python.org>
parents: 6767
diff changeset
89 ;; Reference Hot-Key Help System for XEmacs (or PLRHKHSX for short ;),
0255b5ecde10 Update to the Big Comment at the top of the file. It should better
Barry Warsaw <barry@python.org>
parents: 6767
diff changeset
90 ;; version 1.0"
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
91 ;;
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
92 ;; <http://www.iki.fi/hpa/>
0255b5ecde10 Update to the Big Comment at the top of the file. It should better
Barry Warsaw <barry@python.org>
parents: 6767
diff changeset
93
0255b5ecde10 Update to the Big Comment at the top of the file. It should better
Barry Warsaw <barry@python.org>
parents: 6767
diff changeset
94 ;; TO DO LIST:
0255b5ecde10 Update to the Big Comment at the top of the file. It should better
Barry Warsaw <barry@python.org>
parents: 6767
diff changeset
95
0255b5ecde10 Update to the Big Comment at the top of the file. It should better
Barry Warsaw <barry@python.org>
parents: 6767
diff changeset
96 ;; - Better integration with pdb.py and gud-mode for debugging.
2543
1a448dd84edc (py-submit-bug-report): fixed summary querying
Barry Warsaw <barry@python.org>
parents: 2537
diff changeset
97 ;; - Rewrite according to GNU Emacs Lisp standards.
3903
a3f67bb96adc #updated to do list
Barry Warsaw <barry@python.org>
parents: 3901
diff changeset
98 ;; - possibly force indent-tabs-mode == nil, and add a
a3f67bb96adc #updated to do list
Barry Warsaw <barry@python.org>
parents: 3901
diff changeset
99 ;; write-file-hooks that runs untabify on the whole buffer (to work
a3f67bb96adc #updated to do list
Barry Warsaw <barry@python.org>
parents: 3901
diff changeset
100 ;; around potential tab/space mismatch problems). In practice this
a3f67bb96adc #updated to do list
Barry Warsaw <barry@python.org>
parents: 3901
diff changeset
101 ;; hasn't been a problem... yet.
3905
97e7011fb1b1 #comment update
Barry Warsaw <barry@python.org>
parents: 3904
diff changeset
102 ;; - have py-execute-region on indented code act as if the region is
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
103 ;; left justified. Avoids syntax errors.
0255b5ecde10 Update to the Big Comment at the top of the file. It should better
Barry Warsaw <barry@python.org>
parents: 6767
diff changeset
104 ;; - add a py-goto-block-down, bound to C-c C-d
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
105
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
106 ;;; Code:
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
107
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
108 (require 'custom)
6695
b9fcb9a34332 Require 'cl when compiling so that the push macro gets picked in Emacs
Barry Warsaw <barry@python.org>
parents: 6683
diff changeset
109 (eval-when-compile
6725
283d1ca585d9 Test for an up-to-date Custom library when byte-compiling, and issue
Barry Warsaw <barry@python.org>
parents: 6695
diff changeset
110 (require 'cl)
7724
1bb943cd2c23 #minor change to eval-while-compile so that it must both find
Barry Warsaw <barry@python.org>
parents: 7723
diff changeset
111 (if (not (and (condition-case nil
1bb943cd2c23 #minor change to eval-while-compile so that it must both find
Barry Warsaw <barry@python.org>
parents: 7723
diff changeset
112 (require 'custom)
1bb943cd2c23 #minor change to eval-while-compile so that it must both find
Barry Warsaw <barry@python.org>
parents: 7723
diff changeset
113 (error nil))
1bb943cd2c23 #minor change to eval-while-compile so that it must both find
Barry Warsaw <barry@python.org>
parents: 7723
diff changeset
114 ;; Stock Emacs 19.34 has a broken/old Custom library
1bb943cd2c23 #minor change to eval-while-compile so that it must both find
Barry Warsaw <barry@python.org>
parents: 7723
diff changeset
115 ;; that does more harm than good. Fortunately, it is
1bb943cd2c23 #minor change to eval-while-compile so that it must both find
Barry Warsaw <barry@python.org>
parents: 7723
diff changeset
116 ;; missing defcustom
1bb943cd2c23 #minor change to eval-while-compile so that it must both find
Barry Warsaw <barry@python.org>
parents: 7723
diff changeset
117 (fboundp 'defcustom)))
6725
283d1ca585d9 Test for an up-to-date Custom library when byte-compiling, and issue
Barry Warsaw <barry@python.org>
parents: 6695
diff changeset
118 (error "STOP! STOP! STOP! STOP!
283d1ca585d9 Test for an up-to-date Custom library when byte-compiling, and issue
Barry Warsaw <barry@python.org>
parents: 6695
diff changeset
119
283d1ca585d9 Test for an up-to-date Custom library when byte-compiling, and issue
Barry Warsaw <barry@python.org>
parents: 6695
diff changeset
120 The Custom library was not found or is out of date. A more current
283d1ca585d9 Test for an up-to-date Custom library when byte-compiling, and issue
Barry Warsaw <barry@python.org>
parents: 6695
diff changeset
121 version is required. Please download and install the latest version
283d1ca585d9 Test for an up-to-date Custom library when byte-compiling, and issue
Barry Warsaw <barry@python.org>
parents: 6695
diff changeset
122 of the Custom library from:
283d1ca585d9 Test for an up-to-date Custom library when byte-compiling, and issue
Barry Warsaw <barry@python.org>
parents: 6695
diff changeset
123
283d1ca585d9 Test for an up-to-date Custom library when byte-compiling, and issue
Barry Warsaw <barry@python.org>
parents: 6695
diff changeset
124 <http://www.dina.kvl.dk/~abraham/custom/>
283d1ca585d9 Test for an up-to-date Custom library when byte-compiling, and issue
Barry Warsaw <barry@python.org>
parents: 6695
diff changeset
125
283d1ca585d9 Test for an up-to-date Custom library when byte-compiling, and issue
Barry Warsaw <barry@python.org>
parents: 6695
diff changeset
126 See the Python Mode home page for details:
283d1ca585d9 Test for an up-to-date Custom library when byte-compiling, and issue
Barry Warsaw <barry@python.org>
parents: 6695
diff changeset
127
283d1ca585d9 Test for an up-to-date Custom library when byte-compiling, and issue
Barry Warsaw <barry@python.org>
parents: 6695
diff changeset
128 <http://www.python.org/ftp/emacs/>
283d1ca585d9 Test for an up-to-date Custom library when byte-compiling, and issue
Barry Warsaw <barry@python.org>
parents: 6695
diff changeset
129 ")))
283d1ca585d9 Test for an up-to-date Custom library when byte-compiling, and issue
Barry Warsaw <barry@python.org>
parents: 6695
diff changeset
130
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
131
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
132
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
133 ;; user definable variables
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
134 ;; vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
135
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
136 (defgroup python nil
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
137 "Support for the Python programming language, <http://www.python.org/>"
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
138 :group 'languages)
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
139
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
140 (defcustom py-python-command "python"
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
141 "*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
142 :type 'string
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
143 :group 'python)
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
144
7950
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
145 (defcustom py-jpython-command "jpython"
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
146 "*Shell command used to start the JPython interpreter."
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
147 :type 'string
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
148 :group 'python)
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
149
7197
26d07735ba4a (py-python-command-args): New variable, allows user to customize the
Barry Warsaw <barry@python.org>
parents: 7152
diff changeset
150 (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
151 "*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
152 :type '(repeat string)
26d07735ba4a (py-python-command-args): New variable, allows user to customize the
Barry Warsaw <barry@python.org>
parents: 7152
diff changeset
153 :group 'python)
26d07735ba4a (py-python-command-args): New variable, allows user to customize the
Barry Warsaw <barry@python.org>
parents: 7152
diff changeset
154
7950
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
155 (defcustom py-jpython-command-args '("-i")
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
156 "*List of string arguments to be used when starting a JPython shell."
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
157 :type '(repeat string)
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
158 :group 'python)
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
159
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
160 (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
161 "*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
162 `\\[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
163 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
164 :type 'integer
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
165 :group 'python)
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
166
7672
1fb868f25459 (py-smart-indentation): New variable which controls the automagic
Barry Warsaw <barry@python.org>
parents: 7481
diff changeset
167 (defcustom py-smart-indentation t
1fb868f25459 (py-smart-indentation): New variable which controls the automagic
Barry Warsaw <barry@python.org>
parents: 7481
diff changeset
168 "*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
169 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
170 to `python-mode':
1fb868f25459 (py-smart-indentation): New variable which controls the automagic
Barry Warsaw <barry@python.org>
parents: 7481
diff changeset
171
1fb868f25459 (py-smart-indentation): New variable which controls the automagic
Barry Warsaw <barry@python.org>
parents: 7481
diff changeset
172 1. `py-indent-offset' is guess 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
173 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
174 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
175 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
176
7699
96b7c1323d30 (py-smart-indentation): Updated docstring for new policy.
Barry Warsaw <barry@python.org>
parents: 7676
diff changeset
177 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
178 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
179 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
180 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
181 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
182
7676
bdcf708ae4da #(py-smart-indentation): Small fixes for clarity in the docstring.
Barry Warsaw <barry@python.org>
parents: 7675
diff changeset
183 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
184 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
185 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
186 :type 'boolean
1fb868f25459 (py-smart-indentation): New variable which controls the automagic
Barry Warsaw <barry@python.org>
parents: 7481
diff changeset
187 :group 'python)
1fb868f25459 (py-smart-indentation): New variable which controls the automagic
Barry Warsaw <barry@python.org>
parents: 7481
diff changeset
188
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
189 (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
190 "*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
191 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
192 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
193 lines are aligned to column zero."
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
194 :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
195 (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
196 :group 'python)
3114
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
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-block-comment-prefix "## "
3445
07977bf0d997 (py-comment-region): obsoleted by comment-region
Barry Warsaw <barry@python.org>
parents: 3436
diff changeset
199 "*String used by \\[comment-region] to comment out a block of code.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
200 This should follow the convention for non-indenting comment lines so
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
201 that the indentation commands won't get confused (i.e., the string
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
202 should be of the form `#x...' where `x' is not a blank or a tab, and
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
203 `...' is arbitrary)."
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
204 :type 'string
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
205 :group 'python)
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
206
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
207 (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
208 "*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
209
529f4d9cbe3d (py-honor-comment-indentation, py-compute-indentation): allow other
Barry Warsaw <barry@python.org>
parents: 3429
diff changeset
210 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
211 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
212
3434
529f4d9cbe3d (py-honor-comment-indentation, py-compute-indentation): allow other
Barry Warsaw <barry@python.org>
parents: 3429
diff changeset
213 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
214 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
215 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
216 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
217 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
218 purposes.
529f4d9cbe3d (py-honor-comment-indentation, py-compute-indentation): allow other
Barry Warsaw <barry@python.org>
parents: 3429
diff changeset
219
529f4d9cbe3d (py-honor-comment-indentation, py-compute-indentation): allow other
Barry Warsaw <barry@python.org>
parents: 3429
diff changeset
220 When not nil or t, comment lines that begin with a `#' are used as
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
221 indentation hints, unless the comment character is in column zero."
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
222 :type '(choice
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
223 (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
224 (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
225 (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
226 other)
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
227 )
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
228 :group 'python)
3429
da86b3b54363 (py-honor-comment-indentation): new variable.
Barry Warsaw <barry@python.org>
parents: 3428
diff changeset
229
7201
720e9183961e (py-scroll-process-buffer): Default value changed to nil to act more
Barry Warsaw <barry@python.org>
parents: 7198
diff changeset
230 (defcustom py-scroll-process-buffer nil
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
231 "*Scroll Python process buffer as output arrives.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
232 If nil, the Python process buffer acts, with respect to scrolling, like
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
233 Shell-mode buffers normally act. This is surprisingly complicated and
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
234 so won't be explained here; in fact, you can't get the whole story
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
235 without studying the Emacs C code.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
236
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
237 If non-nil, the behavior is different in two respects (which are
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
238 slightly inaccurate in the interest of brevity):
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
239
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
240 - If the buffer is in a window, and you left point at its end, the
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
241 window will scroll as new output arrives, and point will move to the
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
242 buffer's end, even if the window is not the selected window (that
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
243 being the one the cursor is in). The usual behavior for `shell-mode'
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
244 windows is not to scroll, and to leave point where it was, if the
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
245 buffer is in a window other than the selected window.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
246
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
247 - If the buffer is not visible in any window, and you left point at
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
248 its end, the buffer will be popped into a window as soon as more
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
249 output arrives. This is handy if you have a long-running
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
250 computation and don't want to tie up screen area waiting for the
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
251 output. The usual behavior for a `shell-mode' buffer is to stay
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
252 invisible until you explicitly visit it.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
253
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
254 Note the `and if you left point at its end' clauses in both of the
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
255 above: you can `turn off' the special behaviors while output is in
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
256 progress, by visiting the Python buffer and moving point to anywhere
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
257 besides the end. Then the buffer won't scroll, point will remain where
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
258 you leave it, and if you hide the buffer it will stay hidden until you
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
259 visit it again. You can enable and disable the special behaviors as
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
260 often as you like, while output is in progress, by (respectively) moving
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
261 point to, or away from, the end of the buffer.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
262
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
263 Warning: If you expect a large amount of output, you'll probably be
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
264 happier setting this option to nil.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
265
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
266 Obscure: `End of buffer' above should really say `at or beyond the
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
267 process mark', but if you know what that means you didn't need to be
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
268 told <grin>."
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
269 :type 'boolean
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
270 :group 'python)
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
271
5969
5f6a2eadab97 #Fixed two byte-compiler errors
Barry Warsaw <barry@python.org>
parents: 5968
diff changeset
272 (defcustom py-temp-directory
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
273 (let ((ok '(lambda (x)
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
274 (and x
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
275 (setq x (expand-file-name x)) ; always true
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
276 (file-directory-p x)
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
277 (file-writable-p x)
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
278 x))))
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
279 (or (funcall ok (getenv "TMPDIR"))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
280 (funcall ok "/usr/tmp")
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
281 (funcall ok "/tmp")
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
282 (funcall ok ".")
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
283 (error
7480
55c3fd1853ce (py-temp-directory): Minor docstring nit.
Barry Warsaw <barry@python.org>
parents: 7478
diff changeset
284 "Couldn't find a usable temp directory -- set `py-temp-directory'")))
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
285 "*Directory used for temp files created by a *Python* process.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
286 By default, the first directory from this list that exists and that you
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
287 can write into: the value (if any) of the environment variable TMPDIR,
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
288 /usr/tmp, /tmp, or the current directory."
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
289 :type 'string
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
290 :group 'python)
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
291
5969
5f6a2eadab97 #Fixed two byte-compiler errors
Barry Warsaw <barry@python.org>
parents: 5968
diff changeset
292 (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
293 "*Ring the bell if `tab-width' is changed.
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
294 If a comment of the form
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
295
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
296 \t# vi:set tabsize=<number>:
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
297
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
298 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
299 current value of (the general Emacs variable) `tab-width' does not
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
300 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
301 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
302 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
303 :type 'boolean
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
304 :group 'python)
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
305
6731
21656204dd4f (py-jump-on-exception): Variable which if t, means that if an
Barry Warsaw <barry@python.org>
parents: 6730
diff changeset
306 (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
307 "*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
308 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
309 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
310 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
311 :type 'boolean
822e0812f20c (py-ask-about-save): New variable used in
Barry Warsaw <barry@python.org>
parents: 8380
diff changeset
312 :group 'python)
822e0812f20c (py-ask-about-save): New variable used in
Barry Warsaw <barry@python.org>
parents: 8380
diff changeset
313
822e0812f20c (py-ask-about-save): New variable used in
Barry Warsaw <barry@python.org>
parents: 8380
diff changeset
314 (defcustom py-ask-about-save t
822e0812f20c (py-ask-about-save): New variable used in
Barry Warsaw <barry@python.org>
parents: 8380
diff changeset
315 "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
316 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
317 :type 'boolean
822e0812f20c (py-ask-about-save): New variable used in
Barry Warsaw <barry@python.org>
parents: 8380
diff changeset
318 :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
319
6556
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
320 (defcustom py-backspace-function 'backward-delete-char-untabify
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
321 "*Function called by `py-electric-backspace' when deleting backwards."
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
322 :type 'function
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
323 :group 'python)
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
324
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
325 (defcustom py-delete-function 'delete-char
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
326 "*Function called by `py-electric-delete' when deleting forwards."
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
327 :type 'function
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
328 :group 'python)
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
329
7142
aff1e7b1f523 (py-master-file): New buffer-local variable which can be set in the
Barry Warsaw <barry@python.org>
parents: 6836
diff changeset
330 ;; 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
331 (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
332 "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
333 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
334 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
335
aff1e7b1f523 (py-master-file): New buffer-local variable which can be set in the
Barry Warsaw <barry@python.org>
parents: 6836
diff changeset
336 # 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
337 # 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
338 # End:
aff1e7b1f523 (py-master-file): New buffer-local variable which can be set in the
Barry Warsaw <barry@python.org>
parents: 6836
diff changeset
339
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
340 so that typing \\[py-execute-buffer] in that buffer executes the named
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
341 master file instead of the buffer's file. Note that if the file name
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
342 has a relative path, the value of `default-directory' for the buffer
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
343 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
344 (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
345
6556
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
346
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
347
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
348 ;; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
349 ;; 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
350
6562
53835043528c (py-emacs-features): Test for working make-temp-name, which is broken
Barry Warsaw <barry@python.org>
parents: 6560
diff changeset
351 (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
352 (let (features)
53835043528c (py-emacs-features): Test for working make-temp-name, which is broken
Barry Warsaw <barry@python.org>
parents: 6560
diff changeset
353 ;; NTEmacs 19.34.6 has a broken make-temp-name; it always returns
53835043528c (py-emacs-features): Test for working make-temp-name, which is broken
Barry Warsaw <barry@python.org>
parents: 6560
diff changeset
354 ;; the same string.
53835043528c (py-emacs-features): Test for working make-temp-name, which is broken
Barry Warsaw <barry@python.org>
parents: 6560
diff changeset
355 (let ((tmp1 (make-temp-name ""))
53835043528c (py-emacs-features): Test for working make-temp-name, which is broken
Barry Warsaw <barry@python.org>
parents: 6560
diff changeset
356 (tmp2 (make-temp-name "")))
53835043528c (py-emacs-features): Test for working make-temp-name, which is broken
Barry Warsaw <barry@python.org>
parents: 6560
diff changeset
357 (if (string-equal tmp1 tmp2)
53835043528c (py-emacs-features): Test for working make-temp-name, which is broken
Barry Warsaw <barry@python.org>
parents: 6560
diff changeset
358 (push 'broken-temp-names features)))
53835043528c (py-emacs-features): Test for working make-temp-name, which is broken
Barry Warsaw <barry@python.org>
parents: 6560
diff changeset
359 ;; return the features
53835043528c (py-emacs-features): Test for working make-temp-name, which is broken
Barry Warsaw <barry@python.org>
parents: 6560
diff changeset
360 features)
6232
fc5e1e004994 (py-parse-partial-sexp-works-p): Removed as obsolete. All current
Barry Warsaw <barry@python.org>
parents: 5969
diff changeset
361 "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
362 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
363 support for features needed by `python-mode'.")
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
364
5150
4665e2849a4a (python-font-lock-keywords): Use new convention for installing in mode
Barry Warsaw <barry@python.org>
parents: 5075
diff changeset
365 (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
366 (let ((kw1 (mapconcat 'identity
812aad8c05c2 (python-font-lock-keywords): Pick up block introducing keywords with
Barry Warsaw <barry@python.org>
parents: 6563
diff changeset
367 '("and" "assert" "break" "class"
812aad8c05c2 (python-font-lock-keywords): Pick up block introducing keywords with
Barry Warsaw <barry@python.org>
parents: 6563
diff changeset
368 "continue" "def" "del" "elif"
812aad8c05c2 (python-font-lock-keywords): Pick up block introducing keywords with
Barry Warsaw <barry@python.org>
parents: 6563
diff changeset
369 "else" "except" "exec" "for"
812aad8c05c2 (python-font-lock-keywords): Pick up block introducing keywords with
Barry Warsaw <barry@python.org>
parents: 6563
diff changeset
370 "from" "global" "if" "import"
812aad8c05c2 (python-font-lock-keywords): Pick up block introducing keywords with
Barry Warsaw <barry@python.org>
parents: 6563
diff changeset
371 "in" "is" "lambda" "not"
812aad8c05c2 (python-font-lock-keywords): Pick up block introducing keywords with
Barry Warsaw <barry@python.org>
parents: 6563
diff changeset
372 "or" "pass" "print" "raise"
812aad8c05c2 (python-font-lock-keywords): Pick up block introducing keywords with
Barry Warsaw <barry@python.org>
parents: 6563
diff changeset
373 "return" "while"
812aad8c05c2 (python-font-lock-keywords): Pick up block introducing keywords with
Barry Warsaw <barry@python.org>
parents: 6563
diff changeset
374 )
812aad8c05c2 (python-font-lock-keywords): Pick up block introducing keywords with
Barry Warsaw <barry@python.org>
parents: 6563
diff changeset
375 "\\|"))
812aad8c05c2 (python-font-lock-keywords): Pick up block introducing keywords with
Barry Warsaw <barry@python.org>
parents: 6563
diff changeset
376 (kw2 (mapconcat 'identity
812aad8c05c2 (python-font-lock-keywords): Pick up block introducing keywords with
Barry Warsaw <barry@python.org>
parents: 6563
diff changeset
377 '("else:" "except:" "finally:" "try:")
812aad8c05c2 (python-font-lock-keywords): Pick up block introducing keywords with
Barry Warsaw <barry@python.org>
parents: 6563
diff changeset
378 "\\|"))
812aad8c05c2 (python-font-lock-keywords): Pick up block introducing keywords with
Barry Warsaw <barry@python.org>
parents: 6563
diff changeset
379 )
3427
af5ff5231d4a (python-font-lock-keywords): Much improved descrimination between
Barry Warsaw <barry@python.org>
parents: 3426
diff changeset
380 (list
6563
2aa13c0c8f2f (python-font-lock-keywords): Fix for consecutive keyword font locking,
Barry Warsaw <barry@python.org>
parents: 6562
diff changeset
381 ;; keywords
6564
812aad8c05c2 (python-font-lock-keywords): Pick up block introducing keywords with
Barry Warsaw <barry@python.org>
parents: 6563
diff changeset
382 (cons (concat "\\b\\(" kw1 "\\)\\b[ \n\t(]") 1)
812aad8c05c2 (python-font-lock-keywords): Pick up block introducing keywords with
Barry Warsaw <barry@python.org>
parents: 6563
diff changeset
383 ;; 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
384 ;; Yes "except" is in both lists.
812aad8c05c2 (python-font-lock-keywords): Pick up block introducing keywords with
Barry Warsaw <barry@python.org>
parents: 6563
diff changeset
385 (cons (concat "\\b\\(" kw2 "\\)[ \n\t(]") 1)
3427
af5ff5231d4a (python-font-lock-keywords): Much improved descrimination between
Barry Warsaw <barry@python.org>
parents: 3426
diff changeset
386 ;; classes
af5ff5231d4a (python-font-lock-keywords): Much improved descrimination between
Barry Warsaw <barry@python.org>
parents: 3426
diff changeset
387 '("\\bclass[ \t]+\\([a-zA-Z_]+[a-zA-Z0-9_]*\\)"
af5ff5231d4a (python-font-lock-keywords): Much improved descrimination between
Barry Warsaw <barry@python.org>
parents: 3426
diff changeset
388 1 font-lock-type-face)
af5ff5231d4a (python-font-lock-keywords): Much improved descrimination between
Barry Warsaw <barry@python.org>
parents: 3426
diff changeset
389 ;; functions
af5ff5231d4a (python-font-lock-keywords): Much improved descrimination between
Barry Warsaw <barry@python.org>
parents: 3426
diff changeset
390 '("\\bdef[ \t]+\\([a-zA-Z_]+[a-zA-Z0-9_]*\\)"
af5ff5231d4a (python-font-lock-keywords): Much improved descrimination between
Barry Warsaw <barry@python.org>
parents: 3426
diff changeset
391 1 font-lock-function-name-face)
af5ff5231d4a (python-font-lock-keywords): Much improved descrimination between
Barry Warsaw <barry@python.org>
parents: 3426
diff changeset
392 ))
3436
db9f6ede58a7 (python-font-lock-keywords): make it a defconst
Barry Warsaw <barry@python.org>
parents: 3434
diff changeset
393 "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
394 (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
395
2760
1b9e90353529 Added tbd's on python-font-lock-keywords
Barry Warsaw <barry@python.org>
parents: 2711
diff changeset
396
3924
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
397 (defvar imenu-example--python-show-method-args-p nil
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
398 "*Controls echoing of arguments of functions & methods in the imenu buffer.
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
399 When non-nil, arguments are printed.")
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
400
3220
f1cc247fff13 (py-indent-offset): this should be buffer local.
Barry Warsaw <barry@python.org>
parents: 3114
diff changeset
401 (make-variable-buffer-local 'py-indent-offset)
f1cc247fff13 (py-indent-offset): this should be buffer local.
Barry Warsaw <barry@python.org>
parents: 3114
diff changeset
402
6668
98552704b88f (python-mode): Patch to fix Imenu support under Emacs, given by
Barry Warsaw <barry@python.org>
parents: 6667
diff changeset
403 ;; have to bind py-file-queue before installing the kill-emacs-hook
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
404 (defvar py-file-queue nil
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
405 "Queue of Python temp files awaiting execution.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
406 Currently-active file is at the head of the list.")
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
407
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
408
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
409 ;; Constants
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
410
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
411 (defconst py-stringlit-re
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
412 (concat
8379
f5ebcc7a5ab2 (py-stringlit-re): Another ME patch to recognize SQTQs and DQTQs
Barry Warsaw <barry@python.org>
parents: 8378
diff changeset
413 ;; 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
414 ;; 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
415 ;; 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
416 ;;
f5ebcc7a5ab2 (py-stringlit-re): Another ME patch to recognize SQTQs and DQTQs
Barry Warsaw <barry@python.org>
parents: 8378
diff changeset
417 ;; (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
418 ;; 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
419 "[rR]?'''[^']*\\(\\('[^']\\|''[^']\\)[^']*\\)*'''"
f5ebcc7a5ab2 (py-stringlit-re): Another ME patch to recognize SQTQs and DQTQs
Barry Warsaw <barry@python.org>
parents: 8378
diff changeset
420 "\\|"
f5ebcc7a5ab2 (py-stringlit-re): Another ME patch to recognize SQTQs and DQTQs
Barry Warsaw <barry@python.org>
parents: 8378
diff changeset
421 ;; (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
422 ;; 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
423 "[rR]?\"\"\"[^\"]*\\(\\(\"[^\"]\\|\"\"[^\"]\\)[^\"]*\\)*\"\"\""
f5ebcc7a5ab2 (py-stringlit-re): Another ME patch to recognize SQTQs and DQTQs
Barry Warsaw <barry@python.org>
parents: 8378
diff changeset
424 "\\|"
f5ebcc7a5ab2 (py-stringlit-re): Another ME patch to recognize SQTQs and DQTQs
Barry Warsaw <barry@python.org>
parents: 8378
diff changeset
425 "[rR]?'\\([^'\n\\]\\|\\\\.\\)*'" ; single-quoted
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
426 "\\|" ; or
8379
f5ebcc7a5ab2 (py-stringlit-re): Another ME patch to recognize SQTQs and DQTQs
Barry Warsaw <barry@python.org>
parents: 8378
diff changeset
427 "[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
428 )
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
429 "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
430
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
431 (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
432 ;; 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
433 ;; 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
434 (concat
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
435 "\\(" "[^#'\"\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
436 "\\\\$")
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
437 "Regular expression matching Python backslash continuation lines.")
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
438
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
439 (defconst py-blank-or-comment-re "[ \t]*\\($\\|#\\)"
8911
9a984276cc56 #Typos from previous checkin
Barry Warsaw <barry@python.org>
parents: 8910
diff changeset
440 "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
441
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
442 (defconst py-outdent-re
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
443 (concat "\\(" (mapconcat 'identity
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
444 '("else:"
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
445 "except\\(\\s +.*\\)?:"
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
446 "finally:"
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
447 "elif\\s +.*:")
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
448 "\\|")
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
449 "\\)")
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
450 "Regular expression matching statements to be dedented one level.")
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
451
6544
d28932d676c8 Changes in preparation for integrating into the Python CVS tree.
Barry Warsaw <barry@python.org>
parents: 6232
diff changeset
452 (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
453 "\\(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
454 "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
455
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
456 (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
457 (concat
d28932d676c8 Changes in preparation for integrating into the Python CVS tree.
Barry Warsaw <barry@python.org>
parents: 6232
diff changeset
458 "\\("
d28932d676c8 Changes in preparation for integrating into the Python CVS tree.
Barry Warsaw <barry@python.org>
parents: 6232
diff changeset
459 (mapconcat 'identity
d28932d676c8 Changes in preparation for integrating into the Python CVS tree.
Barry Warsaw <barry@python.org>
parents: 6232
diff changeset
460 (list "try:"
d28932d676c8 Changes in preparation for integrating into the Python CVS tree.
Barry Warsaw <barry@python.org>
parents: 6232
diff changeset
461 "except\\(\\s +.*\\)?:"
d28932d676c8 Changes in preparation for integrating into the Python CVS tree.
Barry Warsaw <barry@python.org>
parents: 6232
diff changeset
462 "while\\s +.*:"
d28932d676c8 Changes in preparation for integrating into the Python CVS tree.
Barry Warsaw <barry@python.org>
parents: 6232
diff changeset
463 "for\\s +.*:"
d28932d676c8 Changes in preparation for integrating into the Python CVS tree.
Barry Warsaw <barry@python.org>
parents: 6232
diff changeset
464 "if\\s +.*:"
d28932d676c8 Changes in preparation for integrating into the Python CVS tree.
Barry Warsaw <barry@python.org>
parents: 6232
diff changeset
465 "elif\\s +.*:"
d28932d676c8 Changes in preparation for integrating into the Python CVS tree.
Barry Warsaw <barry@python.org>
parents: 6232
diff changeset
466 (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
467 )
d28932d676c8 Changes in preparation for integrating into the Python CVS tree.
Barry Warsaw <barry@python.org>
parents: 6232
diff changeset
468 "\\|")
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
469 "\\)")
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
470 "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
471
6663
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
472 (defconst py-defun-start-re
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
473 "^\\([ \t]*\\)def[ \t]+\\([a-zA-Z_0-9]+\\)\\|\\(^[a-zA-Z_0-9]+\\)[ \t]*="
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
474 ;; If you change this, you probably have to change py-current-defun
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
475 ;; as well. This is only used by py-current-defun to find the name
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
476 ;; for add-log.el.
8911
9a984276cc56 #Typos from previous checkin
Barry Warsaw <barry@python.org>
parents: 8910
diff changeset
477 "Regular expression matching a function, method, or variable assignment.")
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
478
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
479 (defconst py-class-start-re "^class[ \t]*\\([a-zA-Z_0-9]+\\)"
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
480 ;; If you change this, you probably have to change py-current-defun
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
481 ;; as well. This is only used by py-current-defun to find the name
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
482 ;; for add-log.el.
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
483 "Regular expression for finding a class name.")
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
484
6663
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
485 (defconst 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
486 "[ \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
487 "Regular expression that describes tracebacks.")
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
488
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
489
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
490
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
491 ;; Utilities
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
492
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
493 (defmacro py-safe (&rest body)
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
494 "Safely execute BODY, return nil if an error occurred."
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
495 (` (condition-case nil
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
496 (progn (,@ body))
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
497 (error nil))))
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
498
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
499 (defsubst py-keep-region-active ()
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
500 "Keep the region active in XEmacs."
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
501 ;; Ignore byte-compiler warnings you might see. Also note that
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
502 ;; FSF's Emacs 19 does it differently; its policy doesn't require us
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
503 ;; to take explicit action.
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
504 (and (boundp 'zmacs-region-stays)
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
505 (setq zmacs-region-stays t)))
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
506
6663
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
507 (defsubst py-point (position)
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
508 "Returns the value of point at certain commonly referenced POSITIONs.
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
509 POSITION can be one of the following symbols:
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
510
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
511 bol -- beginning of line
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
512 eol -- end of line
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
513 bod -- beginning of def or class
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
514 eod -- end of def or class
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
515 bob -- beginning of buffer
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
516 eob -- end of buffer
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
517 boi -- back to indentation
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
518 bos -- beginning of statement
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
519
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
520 This function does not modify point or mark."
6663
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
521 (let ((here (point)))
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
522 (cond
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
523 ((eq position 'bol) (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
524 ((eq position 'eol) (end-of-line))
8377
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
525 ((eq position 'bod) (py-beginning-of-def-or-class))
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
526 ((eq position 'eod) (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
527 ;; Kind of funny, I know, but useful for py-up-exception.
6663
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
528 ((eq position 'bob) (beginning-of-buffer))
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
529 ((eq position 'eob) (end-of-buffer))
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
530 ((eq position 'boi) (back-to-indentation))
8377
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
531 ((eq position 'bos) (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
532 (t (error "Unknown buffer position requested: %s" position))
6663
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
533 )
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
534 (prog1
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
535 (point)
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
536 (goto-char here))))
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
537
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
538 (defsubst py-highlight-line (from to file line)
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
539 (cond
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
540 ((fboundp 'make-extent)
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
541 ;; XEmacs
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
542 (let ((e (make-extent from to)))
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
543 (set-extent-property e 'mouse-face 'highlight)
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
544 (set-extent-property e 'py-exc-info (cons file line))
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
545 (set-extent-property e 'keymap 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
546 (t
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
547 ;; 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
548 )
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
549 ))
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
550
7725
663367ca13f8 (py-in-literal, py-fast-in-literal): New functions (mostly) stolen
Barry Warsaw <barry@python.org>
parents: 7724
diff changeset
551 (defun py-in-literal (&optional lim)
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
552 "Return non-nil if point is in a Python literal (a comment or string).
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
553 Optional argument LIM indicates the beginning of the containing form,
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
554 i.e. the limit on how far back to scan."
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
555 ;; This is the version used for non-XEmacs, which has a nicer
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
556 ;; interface.
7725
663367ca13f8 (py-in-literal, py-fast-in-literal): New functions (mostly) stolen
Barry Warsaw <barry@python.org>
parents: 7724
diff changeset
557 ;;
663367ca13f8 (py-in-literal, py-fast-in-literal): New functions (mostly) stolen
Barry Warsaw <barry@python.org>
parents: 7724
diff changeset
558 ;; WARNING: Watch out for infinite recursion.
663367ca13f8 (py-in-literal, py-fast-in-literal): New functions (mostly) stolen
Barry Warsaw <barry@python.org>
parents: 7724
diff changeset
559 (let* ((lim (or lim (c-point 'bod)))
663367ca13f8 (py-in-literal, py-fast-in-literal): New functions (mostly) stolen
Barry Warsaw <barry@python.org>
parents: 7724
diff changeset
560 (state (parse-partial-sexp lim (point))))
663367ca13f8 (py-in-literal, py-fast-in-literal): New functions (mostly) stolen
Barry Warsaw <barry@python.org>
parents: 7724
diff changeset
561 (cond
663367ca13f8 (py-in-literal, py-fast-in-literal): New functions (mostly) stolen
Barry Warsaw <barry@python.org>
parents: 7724
diff changeset
562 ((nth 3 state) 'string)
663367ca13f8 (py-in-literal, py-fast-in-literal): New functions (mostly) stolen
Barry Warsaw <barry@python.org>
parents: 7724
diff changeset
563 ((nth 4 state) 'comment)
663367ca13f8 (py-in-literal, py-fast-in-literal): New functions (mostly) stolen
Barry Warsaw <barry@python.org>
parents: 7724
diff changeset
564 (t nil))))
663367ca13f8 (py-in-literal, py-fast-in-literal): New functions (mostly) stolen
Barry Warsaw <barry@python.org>
parents: 7724
diff changeset
565
663367ca13f8 (py-in-literal, py-fast-in-literal): New functions (mostly) stolen
Barry Warsaw <barry@python.org>
parents: 7724
diff changeset
566 ;; XEmacs has a built-in function that should make this much quicker.
663367ca13f8 (py-in-literal, py-fast-in-literal): New functions (mostly) stolen
Barry Warsaw <barry@python.org>
parents: 7724
diff changeset
567 ;; In this case, lim is ignored
663367ca13f8 (py-in-literal, py-fast-in-literal): New functions (mostly) stolen
Barry Warsaw <barry@python.org>
parents: 7724
diff changeset
568 (defun py-fast-in-literal (&optional lim)
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
569 "Fast version of `py-in-literal', used only by XEmacs.
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
570 Optional LIM is ignored."
7725
663367ca13f8 (py-in-literal, py-fast-in-literal): New functions (mostly) stolen
Barry Warsaw <barry@python.org>
parents: 7724
diff changeset
571 ;; don't have to worry about context == 'block-comment
663367ca13f8 (py-in-literal, py-fast-in-literal): New functions (mostly) stolen
Barry Warsaw <barry@python.org>
parents: 7724
diff changeset
572 (buffer-syntactic-context))
663367ca13f8 (py-in-literal, py-fast-in-literal): New functions (mostly) stolen
Barry Warsaw <barry@python.org>
parents: 7724
diff changeset
573
663367ca13f8 (py-in-literal, py-fast-in-literal): New functions (mostly) stolen
Barry Warsaw <barry@python.org>
parents: 7724
diff changeset
574 (if (fboundp 'buffer-syntactic-context)
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
575 (defalias 'py-in-literal 'py-fast-in-literal))
7725
663367ca13f8 (py-in-literal, py-fast-in-literal): New functions (mostly) stolen
Barry Warsaw <barry@python.org>
parents: 7724
diff changeset
576
663367ca13f8 (py-in-literal, py-fast-in-literal): New functions (mostly) stolen
Barry Warsaw <barry@python.org>
parents: 7724
diff changeset
577
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
578
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
579 ;; Major mode boilerplate
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
580
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
581 ;; define a mode-specific abbrev table for those who use such things
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
582 (defvar python-mode-abbrev-table nil
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
583 "Abbrev table in use in `python-mode' buffers.")
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
584 (define-abbrev-table 'python-mode-abbrev-table nil)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
585
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
586 (defvar python-mode-hook nil
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
587 "*Hook called by `python-mode'.")
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
588
8370
f2b0859fece3 #Documentation and comment typos patch given by Michael Ernst. More
Barry Warsaw <barry@python.org>
parents: 8070
diff changeset
589 ;; 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
590 ;; called py-mode-hook, and was not defvar'd. Deprecate its use.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
591 (and (fboundp 'make-obsolete-variable)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
592 (make-obsolete-variable 'py-mode-hook 'python-mode-hook))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
593
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
594 (defvar py-mode-map ()
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
595 "Keymap used in `python-mode' buffers.")
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
596 (if py-mode-map
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
597 nil
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
598 (setq py-mode-map (make-sparse-keymap))
6556
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
599 ;; electric keys
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
600 (define-key py-mode-map ":" 'py-electric-colon)
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
601 ;; indentation level modifiers
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
602 (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
603 (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
604 (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
605 (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
606 ;; subprocess commands
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
607 (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
608 (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
609 (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
610 (define-key py-mode-map "\C-c|" 'py-execute-region)
8378
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
611 (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
612 (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
613 (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
614 ;; 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
615 ;; several behaviors and it gets disgusting. :-( This logic ripped
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
616 ;; largely from CC Mode.
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
617 ;;
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
618 ;; 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
619 ;; backwards deletion behavior to DEL, which both Delete and
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
620 ;; 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
621 ;; 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
622 ;; this way since the dawn of time.
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
623 (if (not (boundp 'delete-key-deletes-forward))
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
624 (define-key py-mode-map "\177" 'py-electric-backspace)
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
625 ;; However, XEmacs 20 actually achieved enlightenment. It is
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
626 ;; possible to sanely define both backward and forward deletion
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
627 ;; 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
628 ;; 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
629 (define-key py-mode-map [delete] 'py-electric-delete)
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
630 (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
631 ;; 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
632 ;; 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
633 (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
634 (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
635 ;; Miscellaneous
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
636 (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
637 (define-key py-mode-map "\C-c\t" 'py-indent-region)
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
638 (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
639 (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
640 (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
641 (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
642 (define-key py-mode-map "\C-c?" 'py-describe-mode)
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
643 (define-key py-mode-map "\C-c\C-hm" 'py-describe-mode)
8377
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
644 (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
645 (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
646 (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
647 (define-key py-mode-map "\C-c=" 'py-down-exception)
6556
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
648 ;; information
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
649 (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
650 (define-key py-mode-map "\C-c\C-v" 'py-version)
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
651 ;; py-newline-and-indent mappings
7150
b864029a5bc5 (py-mode-map): Add a binding of C-m to py-newline-and-indent. This is
Barry Warsaw <barry@python.org>
parents: 7143
diff changeset
652 (define-key py-mode-map "\n" 'py-newline-and-indent)
b864029a5bc5 (py-mode-map): Add a binding of C-m to py-newline-and-indent. This is
Barry Warsaw <barry@python.org>
parents: 7143
diff changeset
653 (define-key py-mode-map "\C-m" 'py-newline-and-indent)
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
654 ;; shadow global bindings for newline-and-indent w/ the py- version.
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
655 ;; 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
656 ;; 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
657 (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
658 (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
659 (where-is-internal '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
660 )
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
661
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
662 (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
663 "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
664 (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
665 nil
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
666 (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
667 (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
668 (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
669 ;; 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
670 ;; 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
671 (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
672 (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
673 #'(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
674 (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
675 )
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
676
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
677 (defvar py-mode-syntax-table nil
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
678 "Syntax table used in `python-mode' buffers.")
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
679 (if py-mode-syntax-table
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
680 nil
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
681 (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
682 (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
683 (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
684 (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
685 (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
686 (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
687 (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
688 ;; 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
689 (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
690 (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
691 (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
692 (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
693 (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
694 (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
695 (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
696 (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
697 (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
698 (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
699 (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
700 ;; 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
701 ;; 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
702 ;; 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
703 ;; 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
704 ;; 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
705 ;; 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
706 ;; binding M-f and M-b to py-forward-into-nomenclature and
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
707 ;; py-backward-into-nomenclature instead.
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
708 (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
709 ;; 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
710 (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
711 (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
712 ;; backquote is open and close paren
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
713 (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
714 ;; comment delimiters
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
715 (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
716 (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
717 )
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
718
4195
e3f6ada28ed0 I have been increasingly annoyed about the fact that
Barry Warsaw <barry@python.org>
parents: 4194
diff changeset
719
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
720
3818
3c5ca7727988 (python-mode): Added menu support, requires easymenu.
Barry Warsaw <barry@python.org>
parents: 3813
diff changeset
721 ;; 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
722 ;; (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
723 (defvar py-menu nil
61b4cae77f7e (py-menu): Create default value
Barry Warsaw <barry@python.org>
parents: 3937
diff changeset
724 "Menu for Python Mode.
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
725 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
726 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
727
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
728 (and (py-safe (require 'easymenu) t)
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
729 (easy-menu-define
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
730 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
731 '("Python"
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
732 ["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
733 ["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
734 "-"
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
735 ["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
736 ["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
737 ["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
738 "-"
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
739 ["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
740 ["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
741 "-"
8378
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
742 ["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
743 ["Execute buffer" py-execute-buffer t]
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
744 ["Execute region" py-execute-region (mark)]
8378
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
745 ["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
746 ["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
747 ["Start interpreter..." py-shell t]
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
748 "-"
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
749 ["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
750 ["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
751 ["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
752 ["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
753 ["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
754 "-"
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
755 ["Describe mode" py-describe-mode t]
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
756 )))
3818
3c5ca7727988 (python-mode): Added menu support, requires easymenu.
Barry Warsaw <barry@python.org>
parents: 3813
diff changeset
757
3924
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
758
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
759
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
760 ;; imenu definitions, courtesy of Perry A. Stoll <stoll@atr-sw.atr.co.jp>
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
761 (defvar imenu-example--python-class-regexp
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
762 (concat ; <<classes>>
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
763 "\\(" ;
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
764 "^[ \t]*" ; newline and maybe whitespace
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
765 "\\(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
766 ; 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
767 "\\([ \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
768 "[ \t]*:" ; and the final :
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
769 "\\)" ; >>classes<<
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
770 )
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
771 "Regexp for Python classes for use with the imenu package."
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
772 )
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
773
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
774 (defvar imenu-example--python-method-regexp
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
775 (concat ; <<methods and functions>>
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
776 "\\(" ;
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
777 "^[ \t]*" ; new line and maybe whitespace
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
778 "\\(def[ \t]+" ; function definitions start with def
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
779 "\\([a-zA-Z0-9_]+\\)" ; name is here
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
780 ; function arguments...
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
781 "[ \t]*(\\([a-zA-Z0-9_=,\* \t\n]*\\))"
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
782 "\\)" ; end of def
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
783 "[ \t]*:" ; and then the :
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
784 "\\)" ; >>methods and functions<<
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
785 )
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
786 "Regexp for Python methods/functions for use with the imenu package."
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
787 )
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
788
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
789 (defvar imenu-example--python-method-no-arg-parens '(2 8)
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
790 "Indicies into groups of the Python regexp for use with imenu.
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
791
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
792 Using these values will result in smaller imenu lists, as arguments to
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
793 functions are not listed.
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
794
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
795 See the variable `imenu-example--python-show-method-args-p' for more
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
796 information.")
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
797
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
798 (defvar imenu-example--python-method-arg-parens '(2 7)
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
799 "Indicies into groups of the Python regexp for use with imenu.
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
800 Using these values will result in large imenu lists, as arguments to
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
801 functions are listed.
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
802
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
803 See the variable `imenu-example--python-show-method-args-p' for more
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
804 information.")
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
805
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
806 ;; 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
807 ;; 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
808 ;; it.
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
809 (defvar imenu-example--generic-python-expression
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
810 (cons
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
811 (concat
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
812 imenu-example--python-class-regexp
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
813 "\\|" ; or...
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
814 imenu-example--python-method-regexp
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
815 )
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
816 imenu-example--python-method-no-arg-parens)
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
817 "Generic Python expression which may be used directly with imenu.
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
818 Used by setting the variable `imenu-generic-expression' to this value.
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
819 Also, see the function \\[imenu-example--create-python-index] for a
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
820 better alternative for finding the index.")
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
821
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
822 ;; These next two variables are used when searching for the python
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
823 ;; 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
824 ;; generic-python-expression, really.
4194
dfbd6e00dd38 #stylistics
Barry Warsaw <barry@python.org>
parents: 4193
diff changeset
825 (defvar imenu-example--python-generic-regexp nil)
dfbd6e00dd38 #stylistics
Barry Warsaw <barry@python.org>
parents: 4193
diff changeset
826 (defvar imenu-example--python-generic-parens nil)
3924
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
827
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
828
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
829 (defun imenu-example--create-python-index ()
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
830 "Python interface function for imenu package.
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
831 Finds all python classes and functions/methods. Calls function
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
832 \\[imenu-example--create-python-index-engine]. See that function for
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
833 the details of how this works."
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
834 (setq imenu-example--python-generic-regexp
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
835 (car imenu-example--generic-python-expression))
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
836 (setq imenu-example--python-generic-parens
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
837 (if imenu-example--python-show-method-args-p
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
838 imenu-example--python-method-arg-parens
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
839 imenu-example--python-method-no-arg-parens))
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
840 (goto-char (point-min))
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
841 (imenu-example--create-python-index-engine nil))
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
842
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
843 (defun imenu-example--create-python-index-engine (&optional start-indent)
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
844 "Function for finding imenu definitions in Python.
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
845
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
846 Finds all definitions (classes, methods, or functions) in a Python
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
847 file for the imenu package.
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
848
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
849 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
850
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
851 (INDEX-NAME . INDEX-POSITION)
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
852
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
853 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
854 list as in
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
855
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
856 (INDEX-NAME . INDEX-ALIST)
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
857
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
858 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
859 recursively and requires some setup. Rather this is the engine for
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
860 the function \\[imenu-example--create-python-index].
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
861
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
862 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
863 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
864 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
865 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
866 definitions found at the next indentation level. When it finds a
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
867 definition that is less indented then the current level, it retuns the
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
868 alist it has created thus far.
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
869
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
870 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
871 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
872 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
873 of the first definition found."
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
874 (let ((index-alist '())
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
875 (sub-method-alist '())
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
876 looking-p
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
877 def-name prev-name
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
878 cur-indent def-pos
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
879 (class-paren (first imenu-example--python-generic-parens))
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
880 (def-paren (second imenu-example--python-generic-parens)))
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
881 (setq looking-p
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
882 (re-search-forward imenu-example--python-generic-regexp
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
883 (point-max) t))
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
884 (while looking-p
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
885 (save-excursion
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
886 ;; used to set def-name to this value but generic-extract-name is
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
887 ;; new to imenu-1.14. this way it still works with imenu-1.11
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
888 ;;(imenu--generic-extract-name imenu-example--python-generic-parens))
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
889 (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
890 class-paren def-paren)))
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
891 (setq def-name
6670
8e3ee3577d4e (python-mode): Make imenu-create-index-function buffer local.
Barry Warsaw <barry@python.org>
parents: 6669
diff changeset
892 (buffer-substring-no-properties (match-beginning cur-paren)
8e3ee3577d4e (python-mode): Make imenu-create-index-function buffer local.
Barry Warsaw <barry@python.org>
parents: 6669
diff changeset
893 (match-end cur-paren))))
3924
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
894 (beginning-of-line)
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
895 (setq cur-indent (current-indentation)))
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
896
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
897 ;; HACK: want to go to the next correct definition location. we
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
898 ;; explicitly list them here. would be better to have them in a
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
899 ;; list.
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
900 (setq def-pos
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
901 (or (match-beginning class-paren)
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
902 (match-beginning def-paren)))
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
903
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
904 ;; 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
905 (or start-indent
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
906 (setq start-indent cur-indent))
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
907
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
908 ;; 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
909 (or prev-name
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
910 (setq prev-name def-name))
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
911
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
912 ;; 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
913 ;; or shallower indentation
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
914 (cond
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
915 ;; 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
916 ((= start-indent cur-indent)
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
917
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
918 ;; if we don't have push, use the following...
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
919 ;;(setf index-alist (cons (cons def-name def-pos) index-alist))
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
920 (push (cons def-name def-pos) index-alist))
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
921
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
922 ;; deeper indented expression, recur...
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
923 ((< start-indent cur-indent)
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
924
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
925 ;; 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
926 ;; 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
927 ;; 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
928 ;; list
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
929 (re-search-backward imenu-example--python-generic-regexp
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
930 (point-min) 'move)
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
931 (setq sub-method-alist (imenu-example--create-python-index-engine
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
932 cur-indent))
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
933
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
934 (if sub-method-alist
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
935 ;; 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
936 ;; 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
937 (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
938 (push (cons prev-name
3924
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
939 (cons save-elmt sub-method-alist))
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
940 index-alist))))
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
941
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
942 ;; found less indented expression, we're done.
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
943 (t
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
944 (setq looking-p nil)
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
945 (re-search-backward imenu-example--python-generic-regexp
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
946 (point-min) t)))
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
947 (setq prev-name def-name)
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
948 (and looking-p
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
949 (setq looking-p
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
950 (re-search-forward imenu-example--python-generic-regexp
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
951 (point-max) 'move))))
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
952 (nreverse index-alist)))
063d86741410 (imenu-example--python-show-method-args-p,
Barry Warsaw <barry@python.org>
parents: 3923
diff changeset
953
3818
3c5ca7727988 (python-mode): Added menu support, requires easymenu.
Barry Warsaw <barry@python.org>
parents: 3813
diff changeset
954
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
955 ;;;###autoload
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
956 (defun python-mode ()
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
957 "Major mode for editing Python files.
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
958 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
959 `python-mode' buffer. Do `\\[py-describe-mode]' for detailed
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
960 documentation. To see what version of `python-mode' you are running,
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
961 enter `\\[py-version]'.
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
962
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
963 This mode knows about Python indentation, tokens, comments and
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
964 continuation lines. Paragraphs are separated by blank lines only.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
965
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
966 COMMANDS
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
967 \\{py-mode-map}
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
968 VARIABLES
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
969
3818
3c5ca7727988 (python-mode): Added menu support, requires easymenu.
Barry Warsaw <barry@python.org>
parents: 3813
diff changeset
970 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
971 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
972 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
973 py-scroll-process-buffer\t\talways scroll Python process buffer
3c5ca7727988 (python-mode): Added menu support, requires easymenu.
Barry Warsaw <barry@python.org>
parents: 3813
diff changeset
974 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
975 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
976 (interactive)
4192
d23f78730e00 (python-mode): font-lock-defaults must be make-local-variable'd
Barry Warsaw <barry@python.org>
parents: 4189
diff changeset
977 ;; set up local variables
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
978 (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
979 (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
980 (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
981 (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
982 (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
983 (make-local-variable 'comment-start)
4763
38689aceae7b (python-mode): added comment-end definitions.
Barry Warsaw <barry@python.org>
parents: 4508
diff changeset
984 (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
985 (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
986 (make-local-variable 'comment-column)
8628
aea6841ab898 (py-comment-indent-function): A replacement for
Barry Warsaw <barry@python.org>
parents: 8381
diff changeset
987 (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
988 (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
989 (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
990 (make-local-variable 'add-log-current-defun-function)
4192
d23f78730e00 (python-mode): font-lock-defaults must be make-local-variable'd
Barry Warsaw <barry@python.org>
parents: 4189
diff changeset
991 ;;
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
992 (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
993 (setq major-mode 'python-mode
aea6841ab898 (py-comment-indent-function): A replacement for
Barry Warsaw <barry@python.org>
parents: 8381
diff changeset
994 mode-name "Python"
aea6841ab898 (py-comment-indent-function): A replacement for
Barry Warsaw <barry@python.org>
parents: 8381
diff changeset
995 local-abbrev-table python-mode-abbrev-table
aea6841ab898 (py-comment-indent-function): A replacement for
Barry Warsaw <barry@python.org>
parents: 8381
diff changeset
996 font-lock-defaults '(python-font-lock-keywords)
aea6841ab898 (py-comment-indent-function): A replacement for
Barry Warsaw <barry@python.org>
parents: 8381
diff changeset
997 paragraph-separate "^[ \t]*$"
aea6841ab898 (py-comment-indent-function): A replacement for
Barry Warsaw <barry@python.org>
parents: 8381
diff changeset
998 paragraph-start "^[ \t]*$"
aea6841ab898 (py-comment-indent-function): A replacement for
Barry Warsaw <barry@python.org>
parents: 8381
diff changeset
999 require-final-newline t
aea6841ab898 (py-comment-indent-function): A replacement for
Barry Warsaw <barry@python.org>
parents: 8381
diff changeset
1000 comment-start "# "
aea6841ab898 (py-comment-indent-function): A replacement for
Barry Warsaw <barry@python.org>
parents: 8381
diff changeset
1001 comment-end ""
aea6841ab898 (py-comment-indent-function): A replacement for
Barry Warsaw <barry@python.org>
parents: 8381
diff changeset
1002 comment-start-skip "# *"
aea6841ab898 (py-comment-indent-function): A replacement for
Barry Warsaw <barry@python.org>
parents: 8381
diff changeset
1003 comment-column 40
aea6841ab898 (py-comment-indent-function): A replacement for
Barry Warsaw <barry@python.org>
parents: 8381
diff changeset
1004 comment-indent-function 'py-comment-indent-function
aea6841ab898 (py-comment-indent-function): A replacement for
Barry Warsaw <barry@python.org>
parents: 8381
diff changeset
1005 indent-region-function 'py-indent-region
aea6841ab898 (py-comment-indent-function): A replacement for
Barry Warsaw <barry@python.org>
parents: 8381
diff changeset
1006 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
1007 ;; 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
1008 add-log-current-defun-function 'py-current-defun
4188
c796ae115783 (python-mode): font-lock-defaults necessary for Emacs 19, but doesn't
Barry Warsaw <barry@python.org>
parents: 4187
diff changeset
1009 )
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1010 (use-local-map py-mode-map)
3818
3c5ca7727988 (python-mode): Added menu support, requires easymenu.
Barry Warsaw <barry@python.org>
parents: 3813
diff changeset
1011 ;; add the menu
3c5ca7727988 (python-mode): Added menu support, requires easymenu.
Barry Warsaw <barry@python.org>
parents: 3813
diff changeset
1012 (if py-menu
3c5ca7727988 (python-mode): Added menu support, requires easymenu.
Barry Warsaw <barry@python.org>
parents: 3813
diff changeset
1013 (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
1014 ;; Emacs 19 requires this
5968
b7048f5be9a1 #Checkpointing X/Emacs 20'fication of this mode.
Barry Warsaw <barry@python.org>
parents: 5965
diff changeset
1015 (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
1016 (setq comment-multi-line nil))
7672
1fb868f25459 (py-smart-indentation): New variable which controls the automagic
Barry Warsaw <barry@python.org>
parents: 7481
diff changeset
1017 ;; Install Imenu, only works for Emacs.
1fb868f25459 (py-smart-indentation): New variable which controls the automagic
Barry Warsaw <barry@python.org>
parents: 7481
diff changeset
1018 (when (py-safe (require 'imenu))
1fb868f25459 (py-smart-indentation): New variable which controls the automagic
Barry Warsaw <barry@python.org>
parents: 7481
diff changeset
1019 (make-variable-buffer-local 'imenu-create-index-function)
1fb868f25459 (py-smart-indentation): New variable which controls the automagic
Barry Warsaw <barry@python.org>
parents: 7481
diff changeset
1020 (setq imenu-create-index-function
1fb868f25459 (py-smart-indentation): New variable which controls the automagic
Barry Warsaw <barry@python.org>
parents: 7481
diff changeset
1021 (function imenu-example--create-python-index))
1fb868f25459 (py-smart-indentation): New variable which controls the automagic
Barry Warsaw <barry@python.org>
parents: 7481
diff changeset
1022 (setq imenu-generic-expression
1fb868f25459 (py-smart-indentation): New variable which controls the automagic
Barry Warsaw <barry@python.org>
parents: 7481
diff changeset
1023 imenu-example--generic-python-expression)
1fb868f25459 (py-smart-indentation): New variable which controls the automagic
Barry Warsaw <barry@python.org>
parents: 7481
diff changeset
1024 (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
1025 (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
1026 )
1fb868f25459 (py-smart-indentation): New variable which controls the automagic
Barry Warsaw <barry@python.org>
parents: 7481
diff changeset
1027 ;; Run the mode hook. Note that py-mode-hook is deprecated.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1028 (if python-mode-hook
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1029 (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
1030 (run-hooks 'py-mode-hook))
1fb868f25459 (py-smart-indentation): New variable which controls the automagic
Barry Warsaw <barry@python.org>
parents: 7481
diff changeset
1031 ;; Now do the automagical guessing
1fb868f25459 (py-smart-indentation): New variable which controls the automagic
Barry Warsaw <barry@python.org>
parents: 7481
diff changeset
1032 (if py-smart-indentation
1fb868f25459 (py-smart-indentation): New variable which controls the automagic
Barry Warsaw <barry@python.org>
parents: 7481
diff changeset
1033 (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
1034 ;; 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
1035 (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
1036 (<= py-indent-offset 8)
1fb868f25459 (py-smart-indentation): New variable which controls the automagic
Barry Warsaw <barry@python.org>
parents: 7481
diff changeset
1037 (>= py-indent-offset 2))
1fb868f25459 (py-smart-indentation): New variable which controls the automagic
Barry Warsaw <barry@python.org>
parents: 7481
diff changeset
1038 (setq offset py-indent-offset))
1fb868f25459 (py-smart-indentation): New variable which controls the automagic
Barry Warsaw <barry@python.org>
parents: 7481
diff changeset
1039 (setq py-indent-offset offset)
7699
96b7c1323d30 (py-smart-indentation): Updated docstring for new policy.
Barry Warsaw <barry@python.org>
parents: 7676
diff changeset
1040 ;; 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
1041 ;; 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
1042 ;; have explicitly turned it off.
96b7c1323d30 (py-smart-indentation): Updated docstring for new policy.
Barry Warsaw <barry@python.org>
parents: 7676
diff changeset
1043 (if (/= tab-width py-indent-offset)
96b7c1323d30 (py-smart-indentation): Updated docstring for new policy.
Barry Warsaw <barry@python.org>
parents: 7676
diff changeset
1044 (setq indent-tabs-mode nil))
7672
1fb868f25459 (py-smart-indentation): New variable which controls the automagic
Barry Warsaw <barry@python.org>
parents: 7481
diff changeset
1045 )))
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1046
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
1047
2535
875173f3f31c (py-electric-colon): new command
Barry Warsaw <barry@python.org>
parents: 2524
diff changeset
1048 ;; electric characters
2547
3281a931a1d9 (py-outdent-p): new function
Barry Warsaw <barry@python.org>
parents: 2544
diff changeset
1049 (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
1050 "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
1051 (save-excursion
3281a931a1d9 (py-outdent-p): new function
Barry Warsaw <barry@python.org>
parents: 2544
diff changeset
1052 (and (progn (back-to-indentation)
3281a931a1d9 (py-outdent-p): new function
Barry Warsaw <barry@python.org>
parents: 2544
diff changeset
1053 (looking-at py-outdent-re))
7152
d39a805852c2 (py-outdent-p): When looking at the previous line, watch out for
Barry Warsaw <barry@python.org>
parents: 7151
diff changeset
1054 (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
1055 (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
1056 (back-to-indentation)
2547
3281a931a1d9 (py-outdent-p): new function
Barry Warsaw <barry@python.org>
parents: 2544
diff changeset
1057 (while (or (looking-at py-blank-or-comment-re)
3281a931a1d9 (py-outdent-p): new function
Barry Warsaw <barry@python.org>
parents: 2544
diff changeset
1058 (bobp))
3281a931a1d9 (py-outdent-p): new function
Barry Warsaw <barry@python.org>
parents: 2544
diff changeset
1059 (backward-to-indentation 1))
3281a931a1d9 (py-outdent-p): new function
Barry Warsaw <barry@python.org>
parents: 2544
diff changeset
1060 (not (looking-at py-no-outdent-re)))
3281a931a1d9 (py-outdent-p): new function
Barry Warsaw <barry@python.org>
parents: 2544
diff changeset
1061 )))
3281a931a1d9 (py-outdent-p): new function
Barry Warsaw <barry@python.org>
parents: 2544
diff changeset
1062
2535
875173f3f31c (py-electric-colon): new command
Barry Warsaw <barry@python.org>
parents: 2524
diff changeset
1063 (defun py-electric-colon (arg)
875173f3f31c (py-electric-colon): new command
Barry Warsaw <barry@python.org>
parents: 2524
diff changeset
1064 "Insert a colon.
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1065 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
1066 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
1067 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
1068 comment."
2535
875173f3f31c (py-electric-colon): new command
Barry Warsaw <barry@python.org>
parents: 2524
diff changeset
1069 (interactive "P")
875173f3f31c (py-electric-colon): new command
Barry Warsaw <barry@python.org>
parents: 2524
diff changeset
1070 (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
1071 ;; 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
1072 (if (save-excursion
c1d77d74fe35 (py-electric-colon): turn off electric behavior inside strings and
Barry Warsaw <barry@python.org>
parents: 3094
diff changeset
1073 (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
1074 (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
1075 (point))
c1d77d74fe35 (py-electric-colon): turn off electric behavior inside strings and
Barry Warsaw <barry@python.org>
parents: 3094
diff changeset
1076 (point))))
c1d77d74fe35 (py-electric-colon): turn off electric behavior inside strings and
Barry Warsaw <barry@python.org>
parents: 3094
diff changeset
1077 (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
1078 (save-excursion
c1d77d74fe35 (py-electric-colon): turn off electric behavior inside strings and
Barry Warsaw <barry@python.org>
parents: 3094
diff changeset
1079 (let ((here (point))
c1d77d74fe35 (py-electric-colon): turn off electric behavior inside strings and
Barry Warsaw <barry@python.org>
parents: 3094
diff changeset
1080 (outdent 0)
4479
2343803318e4 (py-indent-line): take an optional universal argument which says to
Barry Warsaw <barry@python.org>
parents: 4346
diff changeset
1081 (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
1082 (if (and (not arg)
c1d77d74fe35 (py-electric-colon): turn off electric behavior inside strings and
Barry Warsaw <barry@python.org>
parents: 3094
diff changeset
1083 (py-outdent-p)
c1d77d74fe35 (py-electric-colon): turn off electric behavior inside strings and
Barry Warsaw <barry@python.org>
parents: 3094
diff changeset
1084 (= indent (save-excursion
3934
f9ad98b58472 (py-electric-colon): Use (py-next-statement -1) instead of
Barry Warsaw <barry@python.org>
parents: 3926
diff changeset
1085 (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
1086 (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
1087 )
c1d77d74fe35 (py-electric-colon): turn off electric behavior inside strings and
Barry Warsaw <barry@python.org>
parents: 3094
diff changeset
1088 (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
1089 ;; 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
1090 ;; 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
1091 ;; 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
1092 ;; 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
1093 ;; 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
1094 ;; determine this???
3095
c1d77d74fe35 (py-electric-colon): turn off electric behavior inside strings and
Barry Warsaw <barry@python.org>
parents: 3094
diff changeset
1095 (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
1096 (goto-char here)
c1d77d74fe35 (py-electric-colon): turn off electric behavior inside strings and
Barry Warsaw <barry@python.org>
parents: 3094
diff changeset
1097 (beginning-of-line)
c1d77d74fe35 (py-electric-colon): turn off electric behavior inside strings and
Barry Warsaw <barry@python.org>
parents: 3094
diff changeset
1098 (delete-horizontal-space)
c1d77d74fe35 (py-electric-colon): turn off electric behavior inside strings and
Barry Warsaw <barry@python.org>
parents: 3094
diff changeset
1099 (indent-to (- indent outdent))
c1d77d74fe35 (py-electric-colon): turn off electric behavior inside strings and
Barry Warsaw <barry@python.org>
parents: 3094
diff changeset
1100 )))))
2535
875173f3f31c (py-electric-colon): new command
Barry Warsaw <barry@python.org>
parents: 2524
diff changeset
1101
875173f3f31c (py-electric-colon): new command
Barry Warsaw <barry@python.org>
parents: 2524
diff changeset
1102
6555
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1103 ;; Python subprocess utilities and filters
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1104 (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
1105 "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
1106 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
1107 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
1108 `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
1109 (let ((curbuf (current-buffer))
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1110 (procbuf (process-buffer proc))
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1111 (comint-scroll-to-bottom-on-output t)
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1112 (msg (format "## working on region in file %s...\n" filename))
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1113 (cmd (format "execfile('%s')\n" filename)))
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1114 (unwind-protect
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1115 (progn
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1116 (set-buffer procbuf)
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1117 (goto-char (point-max))
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1118 (move-marker (process-mark proc) (point))
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1119 (funcall (process-filter proc) proc msg))
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1120 (set-buffer curbuf))
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1121 (process-send-string proc cmd)))
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1122
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1123 (defun py-process-filter (pyproc string)
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
1124 (let ((curbuf (current-buffer))
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
1125 (pbuf (process-buffer pyproc))
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
1126 (pmark (process-mark pyproc))
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
1127 file-finished)
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1128 ;; make sure we switch to a different buffer at least once. if we
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1129 ;; *don't* do this, then if the process buffer is in the selected
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
1130 ;; window, and point is before the end, and lots of output is
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
1131 ;; coming at a fast pace, then (a) simple cursor-movement commands
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
1132 ;; like C-p, C-n, C-f, C-b, C-a, C-e take an incredibly long time
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
1133 ;; to have a visible effect (the window just doesn't get updated,
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
1134 ;; sometimes for minutes(!)), and (b) it takes about 5x longer to
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
1135 ;; get all the process output (until the next python prompt).
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1136 ;;
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
1137 ;; #b makes no sense to me at all. #a almost makes sense: unless
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
1138 ;; we actually change buffers, set_buffer_internal in buffer.c
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
1139 ;; doesn't set windows_or_buffers_changed to 1, & that in turn
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
1140 ;; seems to make the Emacs command loop reluctant to update the
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
1141 ;; display. Perhaps the default process filter in process.c's
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
1142 ;; read_process_output has update_mode_lines++ for a similar
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
1143 ;; reason? beats me ...
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
1144
4346
7b600e73fd2a (py-process-filter): Make sure current-buffer is restored, even in the
Barry Warsaw <barry@python.org>
parents: 4196
diff changeset
1145 (unwind-protect
7b600e73fd2a (py-process-filter): Make sure current-buffer is restored, even in the
Barry Warsaw <barry@python.org>
parents: 4196
diff changeset
1146 ;; make sure current buffer is restored
7b600e73fd2a (py-process-filter): Make sure current-buffer is restored, even in the
Barry Warsaw <barry@python.org>
parents: 4196
diff changeset
1147 ;; BAW - we want to check to see if this still applies
7b600e73fd2a (py-process-filter): Make sure current-buffer is restored, even in the
Barry Warsaw <barry@python.org>
parents: 4196
diff changeset
1148 (progn
7b600e73fd2a (py-process-filter): Make sure current-buffer is restored, even in the
Barry Warsaw <barry@python.org>
parents: 4196
diff changeset
1149 ;; mysterious ugly hack
7b600e73fd2a (py-process-filter): Make sure current-buffer is restored, even in the
Barry Warsaw <barry@python.org>
parents: 4196
diff changeset
1150 (if (eq curbuf pbuf)
7b600e73fd2a (py-process-filter): Make sure current-buffer is restored, even in the
Barry Warsaw <barry@python.org>
parents: 4196
diff changeset
1151 (set-buffer (get-buffer-create "*scratch*")))
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1152
4346
7b600e73fd2a (py-process-filter): Make sure current-buffer is restored, even in the
Barry Warsaw <barry@python.org>
parents: 4196
diff changeset
1153 (set-buffer pbuf)
7b600e73fd2a (py-process-filter): Make sure current-buffer is restored, even in the
Barry Warsaw <barry@python.org>
parents: 4196
diff changeset
1154 (let* ((start (point))
7b600e73fd2a (py-process-filter): Make sure current-buffer is restored, even in the
Barry Warsaw <barry@python.org>
parents: 4196
diff changeset
1155 (goback (< start pmark))
7b600e73fd2a (py-process-filter): Make sure current-buffer is restored, even in the
Barry Warsaw <barry@python.org>
parents: 4196
diff changeset
1156 (goend (and (not goback) (= start (point-max))))
7b600e73fd2a (py-process-filter): Make sure current-buffer is restored, even in the
Barry Warsaw <barry@python.org>
parents: 4196
diff changeset
1157 (buffer-read-only nil))
7b600e73fd2a (py-process-filter): Make sure current-buffer is restored, even in the
Barry Warsaw <barry@python.org>
parents: 4196
diff changeset
1158 (goto-char pmark)
7b600e73fd2a (py-process-filter): Make sure current-buffer is restored, even in the
Barry Warsaw <barry@python.org>
parents: 4196
diff changeset
1159 (insert string)
7b600e73fd2a (py-process-filter): Make sure current-buffer is restored, even in the
Barry Warsaw <barry@python.org>
parents: 4196
diff changeset
1160 (move-marker pmark (point))
7b600e73fd2a (py-process-filter): Make sure current-buffer is restored, even in the
Barry Warsaw <barry@python.org>
parents: 4196
diff changeset
1161 (setq file-finished
7b600e73fd2a (py-process-filter): Make sure current-buffer is restored, even in the
Barry Warsaw <barry@python.org>
parents: 4196
diff changeset
1162 (and py-file-queue
7b600e73fd2a (py-process-filter): Make sure current-buffer is restored, even in the
Barry Warsaw <barry@python.org>
parents: 4196
diff changeset
1163 (equal ">>> "
7b600e73fd2a (py-process-filter): Make sure current-buffer is restored, even in the
Barry Warsaw <barry@python.org>
parents: 4196
diff changeset
1164 (buffer-substring
7b600e73fd2a (py-process-filter): Make sure current-buffer is restored, even in the
Barry Warsaw <barry@python.org>
parents: 4196
diff changeset
1165 (prog2 (beginning-of-line) (point)
7b600e73fd2a (py-process-filter): Make sure current-buffer is restored, even in the
Barry Warsaw <barry@python.org>
parents: 4196
diff changeset
1166 (goto-char pmark))
7b600e73fd2a (py-process-filter): Make sure current-buffer is restored, even in the
Barry Warsaw <barry@python.org>
parents: 4196
diff changeset
1167 (point)))))
7b600e73fd2a (py-process-filter): Make sure current-buffer is restored, even in the
Barry Warsaw <barry@python.org>
parents: 4196
diff changeset
1168 (if goback (goto-char start)
7b600e73fd2a (py-process-filter): Make sure current-buffer is restored, even in the
Barry Warsaw <barry@python.org>
parents: 4196
diff changeset
1169 ;; else
7b600e73fd2a (py-process-filter): Make sure current-buffer is restored, even in the
Barry Warsaw <barry@python.org>
parents: 4196
diff changeset
1170 (if py-scroll-process-buffer
7b600e73fd2a (py-process-filter): Make sure current-buffer is restored, even in the
Barry Warsaw <barry@python.org>
parents: 4196
diff changeset
1171 (let* ((pop-up-windows t)
7b600e73fd2a (py-process-filter): Make sure current-buffer is restored, even in the
Barry Warsaw <barry@python.org>
parents: 4196
diff changeset
1172 (pwin (display-buffer pbuf)))
7b600e73fd2a (py-process-filter): Make sure current-buffer is restored, even in the
Barry Warsaw <barry@python.org>
parents: 4196
diff changeset
1173 (set-window-point pwin (point)))))
7b600e73fd2a (py-process-filter): Make sure current-buffer is restored, even in the
Barry Warsaw <barry@python.org>
parents: 4196
diff changeset
1174 (set-buffer curbuf)
7b600e73fd2a (py-process-filter): Make sure current-buffer is restored, even in the
Barry Warsaw <barry@python.org>
parents: 4196
diff changeset
1175 (if file-finished
7b600e73fd2a (py-process-filter): Make sure current-buffer is restored, even in the
Barry Warsaw <barry@python.org>
parents: 4196
diff changeset
1176 (progn
6679
f95c9ae2aaef (py-process-filter): py-delete-file-silently is obsolete. Use a
Barry Warsaw <barry@python.org>
parents: 6678
diff changeset
1177 (py-safe (delete-file (car py-file-queue)))
4346
7b600e73fd2a (py-process-filter): Make sure current-buffer is restored, even in the
Barry Warsaw <barry@python.org>
parents: 4196
diff changeset
1178 (setq py-file-queue (cdr py-file-queue))
7b600e73fd2a (py-process-filter): Make sure current-buffer is restored, even in the
Barry Warsaw <barry@python.org>
parents: 4196
diff changeset
1179 (if py-file-queue
7b600e73fd2a (py-process-filter): Make sure current-buffer is restored, even in the
Barry Warsaw <barry@python.org>
parents: 4196
diff changeset
1180 (py-execute-file pyproc (car py-file-queue)))))
7b600e73fd2a (py-process-filter): Make sure current-buffer is restored, even in the
Barry Warsaw <barry@python.org>
parents: 4196
diff changeset
1181 (and goend
7b600e73fd2a (py-process-filter): Make sure current-buffer is restored, even in the
Barry Warsaw <barry@python.org>
parents: 4196
diff changeset
1182 (progn (set-buffer pbuf)
7b600e73fd2a (py-process-filter): Make sure current-buffer is restored, even in the
Barry Warsaw <barry@python.org>
parents: 4196
diff changeset
1183 (goto-char (point-max))))
7b600e73fd2a (py-process-filter): Make sure current-buffer is restored, even in the
Barry Warsaw <barry@python.org>
parents: 4196
diff changeset
1184 ))
7b600e73fd2a (py-process-filter): Make sure current-buffer is restored, even in the
Barry Warsaw <barry@python.org>
parents: 4196
diff changeset
1185 (set-buffer curbuf))))
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1186
6663
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1187 (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
1188 "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
1189 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
1190 (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
1191 (save-excursion
21656204dd4f (py-jump-on-exception): Variable which if t, means that if an
Barry Warsaw <barry@python.org>
parents: 6730
diff changeset
1192 (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
1193 (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
1194 (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
1195 (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
1196 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
1197 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
1198 (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
1199 (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
1200 (beep)
269a327d6305 (py-postprocess-output-buffer): Return t if an exception was found,
Barry Warsaw <barry@python.org>
parents: 7742
diff changeset
1201 (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
1202 (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
1203 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
1204
6731
21656204dd4f (py-jump-on-exception): Variable which if t, means that if an
Barry Warsaw <barry@python.org>
parents: 6730
diff changeset
1205
6555
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1206
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1207 ;;; Subprocess commands
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1208
6663
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1209 ;; 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
1210 (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
1211 (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
1212 (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
1213 (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
1214
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
1215 ;; for toggling between CPython and JPython
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
1216 (defvar 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
1217 (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
1218 (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
1219 (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
1220 (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
1221 (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
1222
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
1223 (defun py-toggle-shells (arg)
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
1224 "Toggles between the CPython and JPython shells.
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1225 With positive argument ARG (interactively \\[universal-argument]),
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1226 uses the CPython shell, with negative ARG uses the JPython shell, and
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1227 with a zero argument, toggles the shell."
7950
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
1228 (interactive "P")
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
1229 ;; 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
1230 (if (null arg)
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
1231 (setq arg 0))
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
1232 ;; toggle if zero
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
1233 (if (= arg 0)
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
1234 (if (string-equal 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
1235 (setq arg -1)
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
1236 (setq arg 1)))
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
1237 (let (msg)
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
1238 (cond
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
1239 ((< 0 arg)
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
1240 ;; set to CPython
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
1241 (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
1242 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
1243 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
1244 msg "CPython"
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
1245 mode-name "Python"))
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
1246 ((> 0 arg)
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
1247 (setq py-which-shell py-jpython-command
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
1248 py-which-args py-jpython-command-args
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
1249 py-which-bufname "JPython"
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
1250 msg "JPython"
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
1251 mode-name "JPython"))
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
1252 )
7952
72d9961540d8 (py-toggle-shells): Added a message in the minibuf.
Barry Warsaw <barry@python.org>
parents: 7950
diff changeset
1253 (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
1254 (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
1255
6555
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1256 ;;;###autoload
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1257 (defun py-shell ()
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1258 "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
1259 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
1260 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
1261 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
1262 bindings active in the `*Python*' buffer.
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1263
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1264 See the docs for variable `py-scroll-buffer' for info on scrolling
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1265 behavior in the process window.
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1266
7950
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
1267 Note: You can toggle between using the CPython interpreter and the
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
1268 JPython interpreter by hitting \\[py-toggle-shells]. This toggles
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
1269 buffer local variables which control whether all your subshell
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
1270 interactions happen to the `*JPython*' or `*Python*' buffers (the
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
1271 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
1272
6555
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1273 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
1274 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
1275 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
1276 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
1277 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
1278 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
1279 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
1280 mode.
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1281
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1282 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
1283 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
1284 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
1285 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
1286 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
1287 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
1288 filter."
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1289 ;; BAW - should undo be disabled in the python process buffer, if
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1290 ;; this bug still exists?
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1291 (interactive)
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1292 (require 'comint)
6559
1a233be5fc17 (mark-python-def-or-class): Renamed to py-mark-def-or-class globally.
Barry Warsaw <barry@python.org>
parents: 6556
diff changeset
1293 (switch-to-buffer-other-window
7950
9cbcb5931d80 Quick and extremely dirty hacks to toggle between using CPython and
Barry Warsaw <barry@python.org>
parents: 7878
diff changeset
1294 (apply 'make-comint py-which-bufname py-which-shell nil py-which-args))
6555
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1295 (make-local-variable 'comint-prompt-regexp)
8371
a65930f5cddb More ME patches:
Barry Warsaw <barry@python.org>
parents: 8370
diff changeset
1296 (setq comint-prompt-regexp "^>>> \\|^[.][.][.] \\|^(pdb) ")
6555
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1297 (set-process-filter (get-buffer-process (current-buffer)) 'py-process-filter)
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1298 (set-syntax-table py-mode-syntax-table)
6663
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1299 ;; set up keybindings for this subshell
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1300 (local-set-key [tab] 'self-insert-command)
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1301 (local-set-key "\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
1302 (local-set-key "\C-c=" 'py-down-exception)
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1303 )
6555
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1304
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1305 (defun py-clear-queue ()
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1306 "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
1307 (interactive)
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1308 (let ((n (length py-file-queue)))
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1309 (mapcar 'delete-file py-file-queue)
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1310 (setq py-file-queue nil)
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1311 (message "%d pending files de-queued." n)))
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1312
8378
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1313
6555
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1314 (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
1315 "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
1316
6555
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1317 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
1318 `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
1319 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
1320 `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
1321 \\[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
1322 buffer.
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1323
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1324 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
1325 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
1326 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
1327 buffer.
6555
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1328
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1329 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
1330 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
1331 `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
1332 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
1333 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
1334 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
1335
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1336 \t## working on region in file <name>...
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1337
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1338 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
1339 (interactive "r\nP")
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1340 (or (< start end)
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1341 (error "Region is empty"))
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1342 (let* ((proc (get-process "Python"))
6562
53835043528c (py-emacs-features): Test for working make-temp-name, which is broken
Barry Warsaw <barry@python.org>
parents: 6560
diff changeset
1343 (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
1344 (let
9a075a2edb1f (py-execute-region): When temp-names are broken (Emacs 19.34), a
Barry Warsaw <barry@python.org>
parents: 8629
diff changeset
1345 ((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
1346 (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
1347 (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
1348 (if pid
9a075a2edb1f (py-execute-region): When temp-names are broken (Emacs 19.34), a
Barry Warsaw <barry@python.org>
parents: 8629
diff changeset
1349 (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
1350 (format "python-%d" sn)))
7481
cca39d719aba (py-execute-region): Simplified calculation of temporary file name.
Barry Warsaw <barry@python.org>
parents: 7480
diff changeset
1351 (make-temp-name "python-")))
cca39d719aba (py-execute-region): Simplified calculation of temporary file name.
Barry Warsaw <barry@python.org>
parents: 7480
diff changeset
1352 (file (expand-file-name temp py-temp-directory)))
6555
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1353 (write-region start end file nil 'nomsg)
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1354 (cond
8370
f2b0859fece3 #Documentation and comment typos patch given by Michael Ernst. More
Barry Warsaw <barry@python.org>
parents: 8070
diff changeset
1355 ;; 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
1356 (async
6663
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1357 (let* ((buf (generate-new-buffer-name py-output-buffer)))
6555
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1358 (start-process "Python" buf py-python-command "-u" file)
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1359 (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
1360 (py-postprocess-output-buffer buf)
6555
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1361 ))
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1362 ;; 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
1363 ;; execution there.
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1364 (proc
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1365 ;; use the existing python shell
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1366 (if (not py-file-queue)
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1367 (py-execute-file proc file)
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1368 (message "File %s queued for execution" file))
6663
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1369 (push file py-file-queue)
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1370 (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
1371 (t
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1372 ;; otherwise either run it synchronously in a subprocess
6663
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1373 (shell-command-on-region start end py-python-command py-output-buffer)
7742
5bf66ab4dfb6 (py-execute-region): Watch out for shell-command-on-region killing a
Barry Warsaw <barry@python.org>
parents: 7727
diff changeset
1374 ;; shell-command-on-region kills the output buffer if it never
5bf66ab4dfb6 (py-execute-region): Watch out for shell-command-on-region killing a
Barry Warsaw <barry@python.org>
parents: 7727
diff changeset
1375 ;; existed and there's no output from the command
5bf66ab4dfb6 (py-execute-region): Watch out for shell-command-on-region killing a
Barry Warsaw <barry@python.org>
parents: 7727
diff changeset
1376 (if (not (get-buffer py-output-buffer))
5bf66ab4dfb6 (py-execute-region): Watch out for shell-command-on-region killing a
Barry Warsaw <barry@python.org>
parents: 7727
diff changeset
1377 (message "No output.")
5bf66ab4dfb6 (py-execute-region): Watch out for shell-command-on-region killing a
Barry Warsaw <barry@python.org>
parents: 7727
diff changeset
1378 (setq py-exception-buffer (current-buffer))
7743
269a327d6305 (py-postprocess-output-buffer): Return t if an exception was found,
Barry Warsaw <barry@python.org>
parents: 7742
diff changeset
1379 (let ((err-p (py-postprocess-output-buffer py-output-buffer)))
269a327d6305 (py-postprocess-output-buffer): Return t if an exception was found,
Barry Warsaw <barry@python.org>
parents: 7742
diff changeset
1380 (pop-to-buffer py-output-buffer)
269a327d6305 (py-postprocess-output-buffer): Return t if an exception was found,
Barry Warsaw <barry@python.org>
parents: 7742
diff changeset
1381 (if err-p
269a327d6305 (py-postprocess-output-buffer): Return t if an exception was found,
Barry Warsaw <barry@python.org>
parents: 7742
diff changeset
1382 (pop-to-buffer py-exception-buffer)))
7742
5bf66ab4dfb6 (py-execute-region): Watch out for shell-command-on-region killing a
Barry Warsaw <barry@python.org>
parents: 7727
diff changeset
1383 ))
5bf66ab4dfb6 (py-execute-region): Watch out for shell-command-on-region killing a
Barry Warsaw <barry@python.org>
parents: 7727
diff changeset
1384 )))
6555
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1385
8378
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1386
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1387 ;; Code execution commands
6555
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1388 (defun py-execute-buffer (&optional async)
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1389 "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
1390 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
1391 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
1392
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1393 If there is a *Python* process buffer it is used. If a clipping
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1394 restriction is in effect, only the accessible portion of the buffer is
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1395 sent. A trailing newline will be supplied if needed.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1396
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1397 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
1398 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
1399 (interactive "P")
7142
aff1e7b1f523 (py-master-file): New buffer-local variable which can be set in the
Barry Warsaw <barry@python.org>
parents: 6836
diff changeset
1400 (if 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
1401 (let* ((filename (expand-file-name 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
1402 (buffer (or (get-file-buffer filename)
aff1e7b1f523 (py-master-file): New buffer-local variable which can be set in the
Barry Warsaw <barry@python.org>
parents: 6836
diff changeset
1403 (find-file-noselect filename))))
aff1e7b1f523 (py-master-file): New buffer-local variable which can be set in the
Barry Warsaw <barry@python.org>
parents: 6836
diff changeset
1404 (set-buffer buffer)))
6555
a5f7eb869f21 First round of changes, mostly subprocess stuff.
Barry Warsaw <barry@python.org>
parents: 6544
diff changeset
1405 (py-execute-region (point-min) (point-max) async))
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1406
8378
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1407 (defun py-execute-import-or-reload (&optional async)
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1408 "Import the current buffer's file in a Python interpreter.
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1409
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1410 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
1411 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
1412
239492b34f68 (py-beginning-of-def-or-class, py-end-of-def-or-class,
Barry Warsaw <barry@python.org>
parents: 8628
diff changeset
1413 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
1414
239492b34f68 (py-beginning-of-def-or-class, py-end-of-def-or-class,
Barry Warsaw <barry@python.org>
parents: 8628
diff changeset
1415 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
1416 instead.
239492b34f68 (py-beginning-of-def-or-class, py-end-of-def-or-class,
Barry Warsaw <barry@python.org>
parents: 8628
diff changeset
1417
239492b34f68 (py-beginning-of-def-or-class, py-end-of-def-or-class,
Barry Warsaw <barry@python.org>
parents: 8628
diff changeset
1418 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
1419 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
1420 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
1421
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1422 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
1423 subtleties, including the use of the optional ASYNC argument.
8378
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1424
8629
239492b34f68 (py-beginning-of-def-or-class, py-end-of-def-or-class,
Barry Warsaw <barry@python.org>
parents: 8628
diff changeset
1425 This may be preferable to `\\[py-execute-buffer]' because:
8378
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1426
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1427 - Definitions stay in their module rather than appearing at top
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1428 level, where they would clutter the global namespace and not affect
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1429 uses of qualified names (MODULE.NAME).
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1430
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1431 - The Python debugger gets line number information about the functions."
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1432 (interactive "P")
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1433 ;; Check file local variable py-master-file
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1434 (if py-master-file
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1435 (let* ((filename (expand-file-name py-master-file))
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1436 (buffer (or (get-file-buffer filename)
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1437 (find-file-noselect filename))))
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1438 (set-buffer buffer)))
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1439 (let ((file (buffer-file-name (current-buffer))))
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1440 (if file
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1441 (progn
8381
822e0812f20c (py-ask-about-save): New variable used in
Barry Warsaw <barry@python.org>
parents: 8380
diff changeset
1442 ;; Maybe save some buffers
822e0812f20c (py-ask-about-save): New variable used in
Barry Warsaw <barry@python.org>
parents: 8380
diff changeset
1443 (save-some-buffers (not py-ask-about-save) nil)
8378
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1444 (py-execute-string
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1445 (if (string-match "\\.py$" file)
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1446 (let ((f (file-name-sans-extension
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1447 (file-name-nondirectory file))))
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1448 (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
1449 f f f))
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1450 (format "execfile('%s')\n" file))
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1451 async))
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1452 ;; else
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1453 (py-execute-buffer async))))
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1454
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1455
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1456 (defun py-execute-def-or-class (&optional async)
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1457 "Send the current function or class definition to a Python interpreter.
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1458
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1459 If there is a *Python* process buffer it is used.
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1460
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1461 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
1462 subtleties, including the use of the optional ASYNC argument."
8378
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1463 (interactive "P")
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1464 (save-excursion
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1465 (py-mark-def-or-class)
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1466 ;; mark is before point
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1467 (py-execute-region (mark) (point) async)))
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1468
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1469
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1470 (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
1471 "Send the argument STRING to a Python interpreter.
8378
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1472
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1473 If there is a *Python* process buffer it is used.
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1474
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1475 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
1476 subtleties, including the use of the optional ASYNC argument."
8378
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1477 (interactive "sExecute Python command: ")
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1478 (save-excursion
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1479 (set-buffer (get-buffer-create
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1480 (generate-new-buffer-name " *Python Command*")))
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1481 (insert string)
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1482 (py-execute-region (point-min) (point-max) async)))
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1483
6663
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1484
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1485
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1486 (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
1487 "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
1488 (let ((buffer (cond ((string-equal file "<stdin>")
8371
a65930f5cddb More ME patches:
Barry Warsaw <barry@python.org>
parents: 8370
diff changeset
1489 (if (consp py-exception-buffer)
a65930f5cddb More ME patches:
Barry Warsaw <barry@python.org>
parents: 8370
diff changeset
1490 (cdr py-exception-buffer)
a65930f5cddb More ME patches:
Barry Warsaw <barry@python.org>
parents: 8370
diff changeset
1491 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
1492 ((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
1493 (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
1494 (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
1495 ((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
1496 ;; 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
1497 ;; 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
1498 (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
1499 nil
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1500 file t))))))
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1501 (pop-to-buffer buffer)
8371
a65930f5cddb More ME patches:
Barry Warsaw <barry@python.org>
parents: 8370
diff changeset
1502 ;; Force Python mode
8378
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
1503 (if (not (eq major-mode 'python-mode))
8371
a65930f5cddb More ME patches:
Barry Warsaw <barry@python.org>
parents: 8370
diff changeset
1504 (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
1505 (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
1506 (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
1507
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1508 (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
1509 "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
1510 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
1511 (interactive "e")
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1512 (cond
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1513 ((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
1514 ;; XEmacs
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1515 (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
1516 (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
1517 (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
1518 (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
1519 (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
1520 (and info
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1521 (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
1522 ))
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1523 ;; 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
1524 ))
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1525
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1526 (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
1527 "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
1528 (interactive)
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1529 (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
1530 (save-excursion
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1531 (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
1532 (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
1533 (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
1534 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
1535 (if (not file)
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1536 (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
1537 (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
1538
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1539 (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
1540 "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
1541 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
1542 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
1543 `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
1544 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
1545 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
1546 (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
1547 (save-excursion
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1548 (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
1549 (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
1550 (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
1551 (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
1552 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
1553 (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
1554 (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
1555 (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
1556
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1557 (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
1558 "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
1559 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
1560 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
1561 stack."
6663
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1562 (interactive "P")
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1563 (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
1564 (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
1565 (if bottom
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1566 (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
1567 (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
1568
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1569 (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
1570 "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
1571 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
1572 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
1573 (interactive "P")
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1574 (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
1575 (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
1576 (if top
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1577 (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
1578 (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
1579
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
1580
6556
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
1581 ;; Electric deletion
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
1582 (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
1583 "Delete preceding character or levels of indentation.
6556
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
1584 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
1585 with a single argument (the number of characters to delete).
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1586
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1587 If point is at the leftmost column, delete the preceding newline.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1588
6556
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
1589 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
1590 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
1591 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
1592 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
1593 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
1594 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
1595 \\[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
1596 zero).
6556
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
1597
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
1598 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
1599 spaces if needed so that only a single column position is deleted.
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1600 \\[universal-argument] specifies how many characters to delete
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1601 (default is 1).
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1602
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1603 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
1604 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
1605 above."
3744
ffdf1f06cf8b (py-delete-char): Obey numeric argument.
Barry Warsaw <barry@python.org>
parents: 3743
diff changeset
1606 (interactive "*p")
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1607 (if (or (/= (current-indentation) (current-column))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1608 (bolp)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1609 (py-continuation-line-p)
3920
9366164f5c4a (py-delete-char): Check for py-honor-comment-indentation.
Barry Warsaw <barry@python.org>
parents: 3919
diff changeset
1610 (not py-honor-comment-indentation)
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1611 (looking-at "#[^ \t\n]")) ; non-indenting #
6556
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
1612 (funcall py-backspace-function arg)
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1613 ;; else indent the same as the colon line that opened the block
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1614 ;; force non-blank so py-goto-block-up doesn't ignore it
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1615 (insert-char ?* 1)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1616 (backward-char)
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
1617 (let ((base-indent 0) ; indentation of base line
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
1618 (base-text "") ; and text of base line
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
1619 (base-found-p nil))
3744
ffdf1f06cf8b (py-delete-char): Obey numeric argument.
Barry Warsaw <barry@python.org>
parents: 3743
diff changeset
1620 (save-excursion
6556
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
1621 (while (< 0 arg)
3744
ffdf1f06cf8b (py-delete-char): Obey numeric argument.
Barry Warsaw <barry@python.org>
parents: 3743
diff changeset
1622 (condition-case nil ; in case no enclosing block
ffdf1f06cf8b (py-delete-char): Obey numeric argument.
Barry Warsaw <barry@python.org>
parents: 3743
diff changeset
1623 (progn
ffdf1f06cf8b (py-delete-char): Obey numeric argument.
Barry Warsaw <barry@python.org>
parents: 3743
diff changeset
1624 (py-goto-block-up 'no-mark)
ffdf1f06cf8b (py-delete-char): Obey numeric argument.
Barry Warsaw <barry@python.org>
parents: 3743
diff changeset
1625 (setq base-indent (current-indentation)
ffdf1f06cf8b (py-delete-char): Obey numeric argument.
Barry Warsaw <barry@python.org>
parents: 3743
diff changeset
1626 base-text (py-suck-up-leading-text)
ffdf1f06cf8b (py-delete-char): Obey numeric argument.
Barry Warsaw <barry@python.org>
parents: 3743
diff changeset
1627 base-found-p t))
ffdf1f06cf8b (py-delete-char): Obey numeric argument.
Barry Warsaw <barry@python.org>
parents: 3743
diff changeset
1628 (error nil))
6556
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
1629 (setq arg (1- arg))))
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1630 (delete-char 1) ; toss the dummy character
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1631 (delete-horizontal-space)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1632 (indent-to base-indent)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1633 (if base-found-p
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1634 (message "Closes block: %s" base-text)))))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1635
6556
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
1636
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
1637 (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
1638 "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
1639
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
1640 The behavior of this function depends on the variable
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
1641 `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
1642 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
1643 function behaves identically to \\[c-electric-backspace].
6556
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
1644
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
1645 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
1646 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
1647 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
1648
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1649 \\[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
1650 number of characters to delete (default is 1)."
6556
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
1651 (interactive "*p")
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
1652 (if (and (boundp 'delete-key-deletes-forward)
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
1653 delete-key-deletes-forward)
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
1654 (funcall py-delete-function arg)
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
1655 ;; else
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
1656 (py-electric-backspace arg)))
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
1657
2513
56e25114d438 (py-delete-char): must have 'supersede value for 'delete-selection and
Barry Warsaw <barry@python.org>
parents: 2499
diff changeset
1658 ;; required for pending-del and delsel modes
6556
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
1659 (put 'py-electric-backspace 'delete-selection 'supersede) ;delsel
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
1660 (put 'py-electric-backspace 'pending-delete 'supersede) ;pending-del
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
1661 (put 'py-electric-delete 'delete-selection 'supersede) ;delsel
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
1662 (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
1663
6556
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
1664
4280b2729cce (py-backspace-function): New variable.
Barry Warsaw <barry@python.org>
parents: 6555
diff changeset
1665
4479
2343803318e4 (py-indent-line): take an optional universal argument which says to
Barry Warsaw <barry@python.org>
parents: 4346
diff changeset
1666 (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
1667 "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
1668 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
1669 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
1670 (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
1671
2343803318e4 (py-indent-line): take an optional universal argument which says to
Barry Warsaw <barry@python.org>
parents: 4346
diff changeset
1672 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
1673 \\[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
1674 (interactive "P")
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
1675 (let* ((ci (current-indentation))
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
1676 (move-to-indentation-p (<= (current-column) ci))
4479
2343803318e4 (py-indent-line): take an optional universal argument which says to
Barry Warsaw <barry@python.org>
parents: 4346
diff changeset
1677 (need (py-compute-indentation (not arg))))
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1678 ;; see if we need to dedent
2547
3281a931a1d9 (py-outdent-p): new function
Barry Warsaw <barry@python.org>
parents: 2544
diff changeset
1679 (if (py-outdent-p)
2537
6fcd0b022fa7 (py-outdent-re): new constant
Barry Warsaw <barry@python.org>
parents: 2536
diff changeset
1680 (setq need (- need py-indent-offset)))
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1681 (if (/= ci need)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1682 (save-excursion
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1683 (beginning-of-line)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1684 (delete-horizontal-space)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1685 (indent-to need)))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1686 (if move-to-indentation-p (back-to-indentation))))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1687
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1688 (defun py-newline-and-indent ()
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
1689 "Strives to act like the Emacs `newline-and-indent'.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1690 This is just `strives to' because correct indentation can't be computed
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1691 from scratch for Python code. In general, deletes the whitespace before
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1692 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
1693 the new line indented."
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1694 (interactive)
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
1695 (let ((ci (current-indentation)))
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1696 (if (< ci (current-column)) ; if point beyond indentation
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1697 (newline-and-indent)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1698 ;; else try to act like newline-and-indent "normally" acts
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1699 (beginning-of-line)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1700 (insert-char ?\n 1)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1701 (move-to-column ci))))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1702
4479
2343803318e4 (py-indent-line): take an optional universal argument which says to
Barry Warsaw <barry@python.org>
parents: 4346
diff changeset
1703 (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
1704 "Compute Python indentation.
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1705 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
1706 `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
1707 dedenting."
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1708 (save-excursion
7262
c09907104092 (py-compute-indentation): Several changes made to improve navigation
Barry Warsaw <barry@python.org>
parents: 7201
diff changeset
1709 (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
1710 (let* ((bod (py-point 'bod))
6678
de2f8f494ae3 (py-compute-indentation): Check for multiline stringness and
Barry Warsaw <barry@python.org>
parents: 6677
diff changeset
1711 (pps (parse-partial-sexp bod (point)))
de2f8f494ae3 (py-compute-indentation): Check for multiline stringness and
Barry Warsaw <barry@python.org>
parents: 6677
diff changeset
1712 (boipps (parse-partial-sexp bod (py-point 'boi))))
3114
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1713 (cond
6663
9f02eb36b573 Added comment about where to find details on python-mode.el, pointing
Barry Warsaw <barry@python.org>
parents: 6565
diff changeset
1714 ;; 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
1715 ((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
1716 (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
1717 (save-excursion
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1718 (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
1719 ;; 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
1720 ;; 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
1721 ;; 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
1722 (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
1723 (back-to-indentation)
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1724 (current-column))))
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1725 ;; are we on a continuation line?
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1726 ((py-continuation-line-p)
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1727 (let ((startpos (point))
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1728 (open-bracket-pos (py-nesting-level))
3923
a39d06497520 (py-keep-region-active): Zap duplicate defun.
Barry Warsaw <barry@python.org>
parents: 3920
diff changeset
1729 endpos searching found state)
3114
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1730 (if open-bracket-pos
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1731 (progn
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1732 ;; align with first item in list; else a normal
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1733 ;; indent beyond the line with the open bracket
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1734 (goto-char (1+ open-bracket-pos)) ; just beyond bracket
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1735 ;; is the first list item on the same line?
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1736 (skip-chars-forward " \t")
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1737 (if (null (memq (following-char) '(?\n ?# ?\\)))
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1738 ; yes, so line up with it
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1739 (current-column)
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1740 ;; first list item on another line, or doesn't exist yet
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1741 (forward-line 1)
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1742 (while (and (< (point) startpos)
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1743 (looking-at "[ \t]*[#\n\\\\]")) ; skip noise
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1744 (forward-line 1))
7777
5e215894c555 (py-compute-indentation): When looking at a continuation line inside
Barry Warsaw <barry@python.org>
parents: 7776
diff changeset
1745 (if (and (< (point) startpos)
5e215894c555 (py-compute-indentation): When looking at a continuation line inside
Barry Warsaw <barry@python.org>
parents: 7776
diff changeset
1746 (/= startpos
5e215894c555 (py-compute-indentation): When looking at a continuation line inside
Barry Warsaw <barry@python.org>
parents: 7776
diff changeset
1747 (save-excursion
5e215894c555 (py-compute-indentation): When looking at a continuation line inside
Barry Warsaw <barry@python.org>
parents: 7776
diff changeset
1748 (goto-char (1+ open-bracket-pos))
8070
4a2f1c69fde8 (py-compute-indentation): Use forward-comment to skip over all
Barry Warsaw <barry@python.org>
parents: 7952
diff changeset
1749 (forward-comment (point-max))
7777
5e215894c555 (py-compute-indentation): When looking at a continuation line inside
Barry Warsaw <barry@python.org>
parents: 7776
diff changeset
1750 (point))))
3114
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1751 ;; again mimic the first list item
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1752 (current-indentation)
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1753 ;; else they're about to enter the first item
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1754 (goto-char open-bracket-pos)
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1755 (+ (current-indentation) py-indent-offset))))
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1756
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1757 ;; else on backslash continuation line
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1758 (forward-line -1)
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1759 (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
1760 (current-indentation) ; so just continue the pattern
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1761 ;; 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
1762 ;; 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
1763 ;; 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
1764 ;; 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
1765 ;; column
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1766 (end-of-line)
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1767 (setq endpos (point) searching t)
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1768 (back-to-indentation)
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1769 (setq startpos (point))
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1770 ;; 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
1771 ;; 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
1772 (while searching
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1773 (skip-chars-forward "^=" endpos)
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1774 (if (= (point) endpos)
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1775 (setq searching nil)
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1776 (forward-char 1)
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1777 (setq state (parse-partial-sexp startpos (point)))
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1778 (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
1779 (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
1780 (progn
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1781 (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
1782 (setq found
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1783 (not (or
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1784 (eq (following-char) ?=)
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1785 (memq (char-after (- (point) 2))
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1786 '(?< ?> ?!)))))))))
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1787 (if (or (not found) ; not an assignment
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1788 (looking-at "[ \t]*\\\\")) ; <=><spaces><backslash>
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1789 (progn
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1790 (goto-char startpos)
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1791 (skip-chars-forward "^ \t\n")))
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1792 (1+ (current-column))))))
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1793
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1794 ;; 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
1795 ((bobp) (current-indentation))
3114
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1796
3919
f487793d6018 (py-mode): comment-start is now "# " so indent-for-comment does the
Barry Warsaw <barry@python.org>
parents: 3905
diff changeset
1797 ;; 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
1798 ;; 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
1799 ;; 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
1800 ;; 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
1801 ;; 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
1802
f487793d6018 (py-mode): comment-start is now "# " so indent-for-comment does the
Barry Warsaw <barry@python.org>
parents: 3905
diff changeset
1803 ;; 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
1804 ;; - 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
1805 ;; - 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
1806 ;; - 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
1807 ;; 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
1808
f487793d6018 (py-mode): comment-start is now "# " so indent-for-comment does the
Barry Warsaw <barry@python.org>
parents: 3905
diff changeset
1809 ;; 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
1810 ;; 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
1811 ;; 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
1812
f487793d6018 (py-mode): comment-start is now "# " so indent-for-comment does the
Barry Warsaw <barry@python.org>
parents: 3905
diff changeset
1813 ;; 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
1814 ;; purposes.
f487793d6018 (py-mode): comment-start is now "# " so indent-for-comment does the
Barry Warsaw <barry@python.org>
parents: 3905
diff changeset
1815
f487793d6018 (py-mode): comment-start is now "# " so indent-for-comment does the
Barry Warsaw <barry@python.org>
parents: 3905
diff changeset
1816 ;; 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
1817 ;; 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
1818 ;; 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
1819 ;; 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
1820 ;; below.
f487793d6018 (py-mode): comment-start is now "# " so indent-for-comment does the
Barry Warsaw <barry@python.org>
parents: 3905
diff changeset
1821 ((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
1822 ;; 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
1823 (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
1824 (<= (current-indentation)
f487793d6018 (py-mode): comment-start is now "# " so indent-for-comment does the
Barry Warsaw <barry@python.org>
parents: 3905
diff changeset
1825 (save-excursion
f487793d6018 (py-mode): comment-start is now "# " so indent-for-comment does the
Barry Warsaw <barry@python.org>
parents: 3905
diff changeset
1826 (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
1827 (current-indentation))))
3114
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1828 (current-indentation))
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1829
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1830 ;; 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
1831 ;; 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
1832 ;; 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
1833 ;; indentation for the continuation lines (if any)
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1834 (t
3093
b3a8013cb4fa (py-compute-indentation): when inside a comment, indent to under the
Barry Warsaw <barry@python.org>
parents: 2799
diff changeset
1835 ;; 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
1836 ;; 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
1837 ;; 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
1838 ;; 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
1839 (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
1840 (fboundp 'forward-comment))
3426
6402be2689c5 (py-compute-indentation): fix skipping backwards over comments by
Barry Warsaw <barry@python.org>
parents: 3348
diff changeset
1841 (forward-comment (- (point-max)))
3434
529f4d9cbe3d (py-honor-comment-indentation, py-compute-indentation): allow other
Barry Warsaw <barry@python.org>
parents: 3429
diff changeset
1842 (let (done)
529f4d9cbe3d (py-honor-comment-indentation, py-compute-indentation): allow other
Barry Warsaw <barry@python.org>
parents: 3429
diff changeset
1843 (while (not done)
8924
0954ad4acdfd (py-compute-indentation): Changes to the `t' condition which affect
Barry Warsaw <barry@python.org>
parents: 8911
diff changeset
1844 (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
1845 (setq done (or (bobp)
0954ad4acdfd (py-compute-indentation): Changes to the `t' condition which affect
Barry Warsaw <barry@python.org>
parents: 8911
diff changeset
1846 (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
1847 (save-excursion
0954ad4acdfd (py-compute-indentation): Changes to the `t' condition which affect
Barry Warsaw <barry@python.org>
parents: 8911
diff changeset
1848 (back-to-indentation)
0954ad4acdfd (py-compute-indentation): Changes to the `t' condition which affect
Barry Warsaw <barry@python.org>
parents: 8911
diff changeset
1849 (not (looking-at py-block-comment-prefix))
0954ad4acdfd (py-compute-indentation): Changes to the `t' condition which affect
Barry Warsaw <barry@python.org>
parents: 8911
diff changeset
1850 ))
0954ad4acdfd (py-compute-indentation): Changes to the `t' condition which affect
Barry Warsaw <barry@python.org>
parents: 8911
diff changeset
1851 (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
1852 (save-excursion
0954ad4acdfd (py-compute-indentation): Changes to the `t' condition which affect
Barry Warsaw <barry@python.org>
parents: 8911
diff changeset
1853 (back-to-indentation)
0954ad4acdfd (py-compute-indentation): Changes to the `t' condition which affect
Barry Warsaw <barry@python.org>
parents: 8911
diff changeset
1854 (not (zerop (current-column)))))
0954ad4acdfd (py-compute-indentation): Changes to the `t' condition which affect
Barry Warsaw <barry@python.org>
parents: 8911
diff changeset
1855 ))
3434
529f4d9cbe3d (py-honor-comment-indentation, py-compute-indentation): allow other
Barry Warsaw <barry@python.org>
parents: 3429
diff changeset
1856 )))
3114
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1857 ;; 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
1858 ;; 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
1859 ;; strings.
7776
db94b15bd640 Two patches for Emacs 20.2 compatibility:
Barry Warsaw <barry@python.org>
parents: 7743
diff changeset
1860 (let* ((delim (nth 3 (parse-partial-sexp bod (point))))
7262
c09907104092 (py-compute-indentation): Several changes made to improve navigation
Barry Warsaw <barry@python.org>
parents: 7201
diff changeset
1861 (skip (and delim (make-string 1 delim))))
c09907104092 (py-compute-indentation): Several changes made to improve navigation
Barry Warsaw <barry@python.org>
parents: 7201
diff changeset
1862 (when skip
c09907104092 (py-compute-indentation): Several changes made to improve navigation
Barry Warsaw <barry@python.org>
parents: 7201
diff changeset
1863 (save-excursion
c09907104092 (py-compute-indentation): Several changes made to improve navigation
Barry Warsaw <barry@python.org>
parents: 7201
diff changeset
1864 (py-safe (search-backward skip))
c09907104092 (py-compute-indentation): Several changes made to improve navigation
Barry Warsaw <barry@python.org>
parents: 7201
diff changeset
1865 (if (and (eq (char-before) delim)
c09907104092 (py-compute-indentation): Several changes made to improve navigation
Barry Warsaw <barry@python.org>
parents: 7201
diff changeset
1866 (eq (char-before (1- (point))) delim))
c09907104092 (py-compute-indentation): Several changes made to improve navigation
Barry Warsaw <barry@python.org>
parents: 7201
diff changeset
1867 (setq skip (make-string 3 delim))))
c09907104092 (py-compute-indentation): Several changes made to improve navigation
Barry Warsaw <barry@python.org>
parents: 7201
diff changeset
1868 ;; we're looking at a triple-quoted string
c09907104092 (py-compute-indentation): Several changes made to improve navigation
Barry Warsaw <barry@python.org>
parents: 7201
diff changeset
1869 (py-safe (search-backward skip))))
7143
3f0be7de7ca5 (py-compute-indentation): In the most common case, where indentation
Barry Warsaw <barry@python.org>
parents: 7142
diff changeset
1870 ;; now skip backward over continued lines
3114
3aab925ebfb0 (py-align-multiline-strings-p): new variable
Barry Warsaw <barry@python.org>
parents: 3095
diff changeset
1871 (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
1872 (+ (current-indentation)
cba4ce15a0d5 (py-statement-closes-block-p, py-compute-indentation): Outdent one
Barry Warsaw <barry@python.org>
parents: 3818
diff changeset
1873 (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
1874 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
1875 (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
1876 (- py-indent-offset)
cba4ce15a0d5 (py-statement-closes-block-p, py-compute-indentation): Outdent one
Barry Warsaw <barry@python.org>
parents: 3818
diff changeset
1877 0)))
cba4ce15a0d5 (py-statement-closes-block-p, py-compute-indentation): Outdent one
Barry Warsaw <barry@python.org>
parents: 3818
diff changeset
1878 )))))
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1879
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1880 (defun py-guess-indent-offset (&optional global)
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
1881 "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
1882
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1883 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
1884 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
1885 \\[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
1886 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
1887 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
1888 those currently existing and those created later in the Emacs session.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1889
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
1890 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
1891 There's no excuse for such foolishness, but sometimes you have to deal
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1892 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
1893 `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
1894 mess.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1895
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1896 Specifically, it searches forward from the statement containing point,
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
1897 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
1898 set to the difference in indentation between that line and the Python
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1899 statement following it. If the search doesn't succeed going forward,
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1900 it's tried again going backward."
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1901 (interactive "P") ; raw prefix arg
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
1902 (let (new-value
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
1903 (start (point))
7725
663367ca13f8 (py-in-literal, py-fast-in-literal): New functions (mostly) stolen
Barry Warsaw <barry@python.org>
parents: 7724
diff changeset
1904 (restart (point))
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
1905 (found nil)
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
1906 colon-indent)
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1907 (py-goto-initial-line)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1908 (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
1909 (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
1910 (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
1911 (setq restart (point))
663367ca13f8 (py-in-literal, py-fast-in-literal): New functions (mostly) stolen
Barry Warsaw <barry@python.org>
parents: 7724
diff changeset
1912 (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
1913 (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
1914 (setq found t)
663367ca13f8 (py-in-literal, py-fast-in-literal): New functions (mostly) stolen
Barry Warsaw <barry@python.org>
parents: 7724
diff changeset
1915 (goto-char restart))))
663367ca13f8 (py-in-literal, py-fast-in-literal): New functions (mostly) stolen
Barry Warsaw <barry@python.org>
parents: 7724
diff changeset
1916 (unless found
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1917 (goto-char start)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1918 (py-goto-initial-line)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1919 (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
1920 (setq found (and
663367ca13f8 (py-in-literal, py-fast-in-literal): New functions (mostly) stolen
Barry Warsaw <barry@python.org>
parents: 7724
diff changeset
1921 (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
1922 (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
1923 (py-statement-opens-block-p)))))
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1924 (setq colon-indent (current-indentation)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1925 found (and found (zerop (py-next-statement 1)))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1926 new-value (- (current-indentation) colon-indent))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1927 (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
1928 (if (not found)
663367ca13f8 (py-in-literal, py-fast-in-literal): New functions (mostly) stolen
Barry Warsaw <barry@python.org>
parents: 7724
diff changeset
1929 (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
1930 (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
1931 'py-indent-offset)
663367ca13f8 (py-in-literal, py-fast-in-literal): New functions (mostly) stolen
Barry Warsaw <barry@python.org>
parents: 7724
diff changeset
1932 (setq py-indent-offset new-value)
663367ca13f8 (py-in-literal, py-fast-in-literal): New functions (mostly) stolen
Barry Warsaw <barry@python.org>
parents: 7724
diff changeset
1933 (message "%s value of py-indent-offset set to %d"
663367ca13f8 (py-in-literal, py-fast-in-literal): New functions (mostly) stolen
Barry Warsaw <barry@python.org>
parents: 7724
diff changeset
1934 (if global "Global" "Local")
663367ca13f8 (py-in-literal, py-fast-in-literal): New functions (mostly) stolen
Barry Warsaw <barry@python.org>
parents: 7724
diff changeset
1935 py-indent-offset))
663367ca13f8 (py-in-literal, py-fast-in-literal): New functions (mostly) stolen
Barry Warsaw <barry@python.org>
parents: 7724
diff changeset
1936 ))
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1937
8628
aea6841ab898 (py-comment-indent-function): A replacement for
Barry Warsaw <barry@python.org>
parents: 8381
diff changeset
1938 (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
1939 "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
1940 ;; 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
1941 ;; 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
1942 ;; cascade one character to the right
8628
aea6841ab898 (py-comment-indent-function): A replacement for
Barry Warsaw <barry@python.org>
parents: 8381
diff changeset
1943 (save-excursion
aea6841ab898 (py-comment-indent-function): A replacement for
Barry Warsaw <barry@python.org>
parents: 8381
diff changeset
1944 (beginning-of-line)
aea6841ab898 (py-comment-indent-function): A replacement for
Barry Warsaw <barry@python.org>
parents: 8381
diff changeset
1945 (let ((eol (py-point 'eol)))
aea6841ab898 (py-comment-indent-function): A replacement for
Barry Warsaw <barry@python.org>
parents: 8381
diff changeset
1946 (and comment-start-skip
aea6841ab898 (py-comment-indent-function): A replacement for
Barry Warsaw <barry@python.org>
parents: 8381
diff changeset
1947 (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
1948 (setq eol (match-beginning 0)))
aea6841ab898 (py-comment-indent-function): A replacement for
Barry Warsaw <barry@python.org>
parents: 8381
diff changeset
1949 (goto-char eol)
aea6841ab898 (py-comment-indent-function): A replacement for
Barry Warsaw <barry@python.org>
parents: 8381
diff changeset
1950 (skip-chars-backward " \t")
aea6841ab898 (py-comment-indent-function): A replacement for
Barry Warsaw <barry@python.org>
parents: 8381
diff changeset
1951 (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
1952 )))
aea6841ab898 (py-comment-indent-function): A replacement for
Barry Warsaw <barry@python.org>
parents: 8381
diff changeset
1953
aea6841ab898 (py-comment-indent-function): A replacement for
Barry Warsaw <barry@python.org>
parents: 8381
diff changeset
1954
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1955 (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
1956 "Indent lines from START to END by COUNT spaces."
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1957 (save-excursion
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1958 (goto-char end)
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1959 (beginning-of-line)
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1960 (setq end (point))
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1961 (goto-char start)
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1962 (beginning-of-line)
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
1963 (setq start (point))
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1964 (indent-rigidly start end count)))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1965
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1966 (defun py-shift-region-left (start end &optional count)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1967 "Shift region of Python code to the left.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1968 The lines from the line containing the start of the current region up
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1969 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
1970 shifted to the left, by `py-indent-offset' columns.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1971
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1972 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
1973 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
1974 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
1975 (interactive
b207876df29a (py-shift-region-left, py-shift-region-right, py-indent-right,
Barry Warsaw <barry@python.org>
parents: 3488
diff changeset
1976 (let ((p (point))
b207876df29a (py-shift-region-left, py-shift-region-right, py-indent-right,
Barry Warsaw <barry@python.org>
parents: 3488
diff changeset
1977 (m (mark))
b207876df29a (py-shift-region-left, py-shift-region-right, py-indent-right,
Barry Warsaw <barry@python.org>
parents: 3488
diff changeset
1978 (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
1979 (if m
b207876df29a (py-shift-region-left, py-shift-region-right, py-indent-right,
Barry Warsaw <barry@python.org>
parents: 3488
diff changeset
1980 (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
1981 (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
1982 ;; 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
1983 (save-excursion
b207876df29a (py-shift-region-left, py-shift-region-right, py-indent-right,
Barry Warsaw <barry@python.org>
parents: 3488
diff changeset
1984 (goto-char start)
b207876df29a (py-shift-region-left, py-shift-region-right, py-indent-right,
Barry Warsaw <barry@python.org>
parents: 3488
diff changeset
1985 (while (< (point) end)
b207876df29a (py-shift-region-left, py-shift-region-right, py-indent-right,
Barry Warsaw <barry@python.org>
parents: 3488
diff changeset
1986 (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
1987 (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
1988 (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
1989 (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
1990 (forward-line 1)))
b207876df29a (py-shift-region-left, py-shift-region-right, py-indent-right,
Barry Warsaw <barry@python.org>
parents: 3488
diff changeset
1991 (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
1992 (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
1993 (py-keep-region-active))
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1994
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1995 (defun py-shift-region-right (start end &optional count)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1996 "Shift region of Python code to the right.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1997 The lines from the line containing the start of the current region up
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
1998 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
1999 shifted to the right, by `py-indent-offset' columns.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2000
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2001 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
2002 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
2003 (interactive
b207876df29a (py-shift-region-left, py-shift-region-right, py-indent-right,
Barry Warsaw <barry@python.org>
parents: 3488
diff changeset
2004 (let ((p (point))
b207876df29a (py-shift-region-left, py-shift-region-right, py-indent-right,
Barry Warsaw <barry@python.org>
parents: 3488
diff changeset
2005 (m (mark))
b207876df29a (py-shift-region-left, py-shift-region-right, py-indent-right,
Barry Warsaw <barry@python.org>
parents: 3488
diff changeset
2006 (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
2007 (if m
b207876df29a (py-shift-region-left, py-shift-region-right, py-indent-right,
Barry Warsaw <barry@python.org>
parents: 3488
diff changeset
2008 (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
2009 (list p (save-excursion (forward-line 1) (point)) arg))))
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2010 (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
2011 (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
2012 (py-keep-region-active))
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2013
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2014 (defun py-indent-region (start end &optional indent-offset)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2015 "Reindent a region of Python code.
3445
07977bf0d997 (py-comment-region): obsoleted by comment-region
Barry Warsaw <barry@python.org>
parents: 3436
diff changeset
2016
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2017 The lines from the line containing the start of the current region up
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2018 to (but not including) the line containing the end of the region are
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2019 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
2020 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
2021 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
2022 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
2023 comment) statement immediately preceding the region.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2024
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2025 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
2026 control structures are introduced or removed, or to reformat code
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2027 using a new value for the indentation offset.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2028
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2029 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
2030 the indentation offset. Else the value of `py-indent-offset' will be
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2031 used.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2032
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2033 Warning: The region must be consistently indented before this function
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2034 is called! This function does not compute proper indentation from
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2035 scratch (that's impossible in Python), it merely adjusts the existing
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2036 indentation to be correct in context.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2037
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2038 Warning: This function really has no idea what to do with
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2039 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
2040 comment lines. Fixing this appears to require telepathy.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2041
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2042 Special cases: whitespace is deleted from blank lines; continuation
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2043 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
2044 in order to preserve their relative indentation with respect to their
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2045 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
2046 (interactive "*r\nP") ; region; raw prefix arg
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2047 (save-excursion
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2048 (goto-char end) (beginning-of-line) (setq end (point-marker))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2049 (goto-char start) (beginning-of-line)
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2050 (let ((py-indent-offset (prefix-numeric-value
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2051 (or indent-offset py-indent-offset)))
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2052 (indents '(-1)) ; stack of active indent levels
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2053 (target-column 0) ; column to which to indent
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2054 (base-shifted-by 0) ; amount last base line was shifted
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2055 (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
2056 (py-compute-indentation t)
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2057 0))
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2058 ci)
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2059 (while (< (point) end)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2060 (setq ci (current-indentation))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2061 ;; figure out appropriate target column
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2062 (cond
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2063 ((or (eq (following-char) ?#) ; comment in column 1
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2064 (looking-at "[ \t]*$")) ; entirely blank
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2065 (setq target-column 0))
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2066 ((py-continuation-line-p) ; shift relative to base line
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2067 (setq target-column (+ ci base-shifted-by)))
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2068 (t ; new base line
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2069 (if (> ci (car indents)) ; going deeper; push it
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2070 (setq indents (cons ci indents))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2071 ;; else we should have seen this indent before
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2072 (setq indents (memq ci indents)) ; pop deeper indents
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2073 (if (null indents)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2074 (error "Bad indentation in region, at line %d"
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2075 (save-restriction
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2076 (widen)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2077 (1+ (count-lines 1 (point)))))))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2078 (setq target-column (+ indent-base
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2079 (* py-indent-offset
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2080 (- (length indents) 2))))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2081 (setq base-shifted-by (- target-column ci))))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2082 ;; shift as needed
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2083 (if (/= ci target-column)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2084 (progn
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2085 (delete-horizontal-space)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2086 (indent-to target-column)))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2087 (forward-line 1))))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2088 (set-marker end nil))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2089
3919
f487793d6018 (py-mode): comment-start is now "# " so indent-for-comment does the
Barry Warsaw <barry@python.org>
parents: 3905
diff changeset
2090 (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
2091 "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
2092 (interactive "r\nP")
3926
1da168185e4e #updated comments
Barry Warsaw <barry@python.org>
parents: 3925
diff changeset
2093 (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
2094 (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
2095
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2096
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2097 ;; Functions for moving point
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2098 (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
2099 "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
2100 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
2101 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
2102 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
2103 continuation lines."
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2104 (interactive "p") ; numeric prefix arg
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2105 (if (< count 0) (py-next-statement (- count))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2106 (py-goto-initial-line)
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2107 (let (start)
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2108 (while (and
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2109 (setq start (point)) ; always true -- side effect
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2110 (> count 0)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2111 (zerop (forward-line -1))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2112 (py-goto-statement-at-or-above))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2113 (setq count (1- count)))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2114 (if (> count 0) (goto-char start)))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2115 count))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2116
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2117 (defun py-next-statement (count)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2118 "Go to the start of next Python statement.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2119 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
2120 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
2121 last statement. Returns count of statements left to move. `Statements'
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2122 do not include blank, comment, or continuation lines."
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2123 (interactive "p") ; numeric prefix arg
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2124 (if (< count 0) (py-previous-statement (- count))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2125 (beginning-of-line)
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2126 (let (start)
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2127 (while (and
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2128 (setq start (point)) ; always true -- side effect
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2129 (> count 0)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2130 (py-goto-statement-below))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2131 (setq count (1- count)))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2132 (if (> count 0) (goto-char start)))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2133 count))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2134
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2135 (defun py-goto-block-up (&optional nomark)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2136 "Move up to start of current block.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2137 Go to the statement that starts the smallest enclosing block; roughly
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2138 speaking, this will be the closest preceding statement that ends with a
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2139 colon and is indented less than the statement you started on. If
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2140 successful, also sets the mark to the starting point.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2141
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2142 `\\[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
2143 block, if desired.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2144
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2145 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
2146 NOMARK is not nil."
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2147 (interactive)
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2148 (let ((start (point))
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2149 (found nil)
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2150 initial-indent)
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2151 (py-goto-initial-line)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2152 ;; if on blank or non-indenting comment line, use the preceding stmt
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2153 (if (looking-at "[ \t]*\\($\\|#[^ \t\n]\\)")
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2154 (progn
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2155 (py-goto-statement-at-or-above)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2156 (setq found (py-statement-opens-block-p))))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2157 ;; search back for colon line indented less
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2158 (setq initial-indent (current-indentation))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2159 (if (zerop initial-indent)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2160 ;; force fast exit
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2161 (goto-char (point-min)))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2162 (while (not (or found (bobp)))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2163 (setq found
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2164 (and
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2165 (re-search-backward ":[ \t]*\\($\\|[#\\]\\)" nil 'move)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2166 (or (py-goto-initial-line) t) ; always true -- side effect
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2167 (< (current-indentation) initial-indent)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2168 (py-statement-opens-block-p))))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2169 (if found
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2170 (progn
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2171 (or nomark (push-mark start))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2172 (back-to-indentation))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2173 (goto-char start)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2174 (error "Enclosing block not found"))))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2175
8377
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2176 (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
2177 "Move point to start of `def' or `class'.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2178
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2179 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
2180 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
2181 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
2182 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
2183 or `def'.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2184
8377
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2185 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
2186 COUNTth start of `def'.
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2187
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2188 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
2189 moves point to the start of the statement.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2190
8377
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2191 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
2192 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
2193 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
2194 statement can be found, leaves point at the start of the buffer.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2195
8377
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2196 Returns t iff a `def' statement is found by these rules.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2197
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2198 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
2199 start of the buffer each time.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2200
8629
239492b34f68 (py-beginning-of-def-or-class, py-end-of-def-or-class,
Barry Warsaw <barry@python.org>
parents: 8628
diff changeset
2201 To mark the current `def', see `\\[py-mark-def-or-class]'."
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2202 (interactive "P") ; raw prefix arg
8377
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2203 (if (not count)
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2204 (setq count 1))
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2205 (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
2206 (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
2207 (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
2208 (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
2209 (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
2210 (t "^[ \t]*def\\>")))
8377
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2211 )
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2212 ;; searching backward
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2213 (if (and (< 0 count)
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2214 (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
2215 (not at-or-before-p)))
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2216 (end-of-line))
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2217 ;; search forward
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2218 (if (and (> 0 count)
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2219 (zerop (current-column))
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2220 (looking-at start-re))
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2221 (end-of-line))
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2222 (re-search-backward start-re nil 'move count)
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2223 (goto-char (match-beginning 0))))
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2224
8377
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2225 ;; Backwards compatibility
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2226 (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
2227
8377
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2228 (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
2229 "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
2230
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2231 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
2232 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
2233 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
2234 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
2235 or `def'.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2236
8377
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2237 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
2238 COUNTth end of `def'.
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2239
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2240 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
2241
8377
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2242 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
2243 contains the statement you started on, that's the `def' we use.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2244
8377
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2245 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
2246
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2247 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
2248 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
2249 start of the `def' is returned.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2250
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2251 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
2252
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2253 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
2254 end of the buffer each time.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2255
8629
239492b34f68 (py-beginning-of-def-or-class, py-end-of-def-or-class,
Barry Warsaw <barry@python.org>
parents: 8628
diff changeset
2256 To mark the current `def', see `\\[py-mark-def-or-class]'."
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2257 (interactive "P") ; raw prefix arg
8377
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2258 (if (and count (/= count 1))
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2259 (py-beginning-of-def-or-class (- 1 count)))
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2260 (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
2261 (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
2262 (class "class")
239492b34f68 (py-beginning-of-def-or-class, py-end-of-def-or-class,
Barry Warsaw <barry@python.org>
parents: 8628
diff changeset
2263 (t "def")))
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2264 (state 'not-found))
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2265 ;; move point to start of appropriate def/class
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2266 (if (looking-at (concat "[ \t]*" which "\\>")) ; already on one
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2267 (setq state 'at-beginning)
8377
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2268 ;; 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
2269 (if (and (py-beginning-of-def-or-class class)
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2270 (progn (py-goto-beyond-block)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2271 (> (point) start)))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2272 (setq state 'at-end)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2273 ;; else search forward
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2274 (goto-char start)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2275 (if (re-search-forward (concat "^[ \t]*" which "\\>") nil 'move)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2276 (progn (setq state 'at-beginning)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2277 (beginning-of-line)))))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2278 (cond
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2279 ((eq state 'at-beginning) (py-goto-beyond-block) t)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2280 ((eq state 'at-end) t)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2281 ((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
2282 (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
2283
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2284 ;; Backwards compabitility
8378
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
2285 (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
2286
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2287
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2288 ;; Functions for marking regions
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2289 (defun py-mark-block (&optional extend just-move)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2290 "Mark following block of lines. With prefix arg, mark structure.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2291 Easier to use than explain. It sets the region to an `interesting'
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2292 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
2293 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
2294 of the region depends on the kind of line at the start:
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2295
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2296 - If a comment, the region will include all succeeding comment lines up
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2297 to (but not including) the next non-comment line (if any).
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2298
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2299 - 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
2300 structures:
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2301
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2302 if elif else try except finally for while def class
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2303
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2304 the region will be set to the body of the structure, including
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2305 following blocks that `belong' to it, but excluding trailing blank
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2306 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
2307 and all (if any) of the following `except' and `finally' blocks
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2308 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
2309 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
2310 degenerate, since they're always one-block structures) def and
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2311 class blocks.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2312
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2313 - 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
2314 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
2315 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
2316 include all succeeding lines up to (but not including) the next
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2317 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
2318 line, except that trailing blank and comment lines are excluded.
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2319 E.g., if the starting line begins a multi-statement `def'
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2320 structure, the region will be set to the full function definition,
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2321 but without any trailing `noise' lines.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2322
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2323 - Else the region will include all succeeding lines up to (but not
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2324 including) the next blank line, or code or indenting-comment line
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2325 indented strictly less than the starting line. Trailing indenting
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2326 comment lines are included in this case, but not trailing blank
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2327 lines.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2328
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2329 A msg identifying the location of the mark is displayed in the echo
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2330 area; or do `\\[exchange-point-and-mark]' to flip down to the end.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2331
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2332 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
2333 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
2334 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
2335 (interactive "P") ; raw prefix arg
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2336 (py-goto-initial-line)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2337 ;; skip over blank lines
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2338 (while (and
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2339 (looking-at "[ \t]*$") ; while blank line
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2340 (not (eobp))) ; & somewhere to go
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2341 (forward-line 1))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2342 (if (eobp)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2343 (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
2344 (let ((initial-pos (point))
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2345 (initial-indent (current-indentation))
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2346 last-pos ; position of last stmt in region
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2347 (followers
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2348 '((if elif else) (elif elif else) (else)
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2349 (try except finally) (except except) (finally)
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2350 (for else) (while else)
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2351 (def) (class) ) )
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2352 first-symbol next-symbol)
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2353
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2354 (cond
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2355 ;; if comment line, suck up the following comment lines
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2356 ((looking-at "[ \t]*#")
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2357 (re-search-forward "^[ \t]*[^ \t#]" nil 'move) ; look for non-comment
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2358 (re-search-backward "^[ \t]*#") ; and back to last comment in block
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2359 (setq last-pos (point)))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2360
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2361 ;; else if line is a block line and EXTEND given, suck up
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2362 ;; the whole structure
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2363 ((and extend
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2364 (setq first-symbol (py-suck-up-first-keyword) )
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2365 (assq first-symbol followers))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2366 (while (and
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2367 (or (py-goto-beyond-block) t) ; side effect
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2368 (forward-line -1) ; side effect
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2369 (setq last-pos (point)) ; side effect
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2370 (py-goto-statement-below)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2371 (= (current-indentation) initial-indent)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2372 (setq next-symbol (py-suck-up-first-keyword))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2373 (memq next-symbol (cdr (assq first-symbol followers))))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2374 (setq first-symbol next-symbol)))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2375
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2376 ;; else if line *opens* a block, search for next stmt indented <=
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2377 ((py-statement-opens-block-p)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2378 (while (and
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2379 (setq last-pos (point)) ; always true -- side effect
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2380 (py-goto-statement-below)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2381 (> (current-indentation) initial-indent))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2382 nil))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2383
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2384 ;; else plain code line; stop at next blank line, or stmt or
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2385 ;; indenting comment line indented <
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2386 (t
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2387 (while (and
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2388 (setq last-pos (point)) ; always true -- side effect
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2389 (or (py-goto-beyond-final-line) t)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2390 (not (looking-at "[ \t]*$")) ; stop at blank line
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2391 (or
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2392 (>= (current-indentation) initial-indent)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2393 (looking-at "[ \t]*#[^ \t\n]"))) ; ignore non-indenting #
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2394 nil)))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2395
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2396 ;; skip to end of last stmt
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2397 (goto-char last-pos)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2398 (py-goto-beyond-final-line)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2399
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2400 ;; set mark & display
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2401 (if just-move
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2402 () ; just return
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2403 (push-mark (point) 'no-msg)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2404 (forward-line -1)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2405 (message "Mark set after: %s" (py-suck-up-leading-text))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2406 (goto-char initial-pos))))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2407
6559
1a233be5fc17 (mark-python-def-or-class): Renamed to py-mark-def-or-class globally.
Barry Warsaw <barry@python.org>
parents: 6556
diff changeset
2408 (defun py-mark-def-or-class (&optional class)
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2409 "Set region to body of def (or class, with prefix arg) enclosing point.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2410 Pushes the current mark, then point, on the mark ring (all language
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2411 modes do this, but although it's handy it's never documented ...).
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2412
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2413 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
2414 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
2415 `\\[py-beginning-of-def-or-class]'.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2416
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2417 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
2418 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
2419 `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
2420 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
2421 forward' string-search commands. But because Python `def' and `class'
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2422 can nest to arbitrary levels, finding the smallest def containing
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2423 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
2424 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
2425 preceding def that's indented less. The fancy algorithm required is
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2426 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
2427 `goto' variations.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2428
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2429 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
2430 `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
2431 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
2432 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
2433 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
2434 that. Else signals an error.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2435
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2436 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
2437 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
2438 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
2439 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
2440 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
2441 point is left at its start.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2442
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2443 The intent is to mark the containing def/class and its associated
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2444 documentation, to make moving and duplicating functions and classes
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2445 pleasant."
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2446 (interactive "P") ; raw prefix arg
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2447 (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
2448 (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
2449 (class "class")
239492b34f68 (py-beginning-of-def-or-class, py-end-of-def-or-class,
Barry Warsaw <barry@python.org>
parents: 8628
diff changeset
2450 (t "def"))))
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2451 (push-mark start)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2452 (if (not (py-go-up-tree-to-keyword which))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2453 (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
2454 (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
2455 (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
2456 "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
2457 which)))
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2458 ;; else enclosing def/class found
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2459 (setq start (point))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2460 (py-goto-beyond-block)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2461 (push-mark (point))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2462 (goto-char start)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2463 (if (zerop (forward-line -1)) ; if there is a preceding line
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2464 (progn
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2465 (if (looking-at "[ \t]*$") ; it's blank
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2466 (setq start (point)) ; so reset start point
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2467 (goto-char start)) ; else try again
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2468 (if (zerop (forward-line -1))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2469 (if (looking-at "[ \t]*#") ; a comment
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2470 ;; look back for non-comment line
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2471 ;; tricky: note that the regexp matches a blank
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2472 ;; line, cuz \n is in the 2nd character class
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2473 (and
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2474 (re-search-backward "^[ \t]*[^ \t#]" nil 'move)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2475 (forward-line 1))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2476 ;; 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
2477 (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
2478 (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
2479 (py-keep-region-active))
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2480
3811
b9a0434d2cb6 (py-forward-into-nomenclature, py-backward-into-nomenclature): New functions.
Barry Warsaw <barry@python.org>
parents: 3796
diff changeset
2481 ;; ripped from cc-mode
b9a0434d2cb6 (py-forward-into-nomenclature, py-backward-into-nomenclature): New functions.
Barry Warsaw <barry@python.org>
parents: 3796
diff changeset
2482 (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
2483 "Move forward to end of a nomenclature section or word.
8910
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2484 With \\[universal-argument] (programmatically, optional argument ARG),
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2485 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
2486
b9a0434d2cb6 (py-forward-into-nomenclature, py-backward-into-nomenclature): New functions.
Barry Warsaw <barry@python.org>
parents: 3796
diff changeset
2487 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
2488 (interactive "p")
b9a0434d2cb6 (py-forward-into-nomenclature, py-backward-into-nomenclature): New functions.
Barry Warsaw <barry@python.org>
parents: 3796
diff changeset
2489 (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
2490 (if (> arg 0)
3937
decd13f6629d (py-forward-into-nomenclature): Slightly better regex for stopping on
Barry Warsaw <barry@python.org>
parents: 3934
diff changeset
2491 (re-search-forward
decd13f6629d (py-forward-into-nomenclature): Slightly better regex for stopping on
Barry Warsaw <barry@python.org>
parents: 3934
diff changeset
2492 "\\(\\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
2493 (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
2494 (while (and (< arg 0)
b9a0434d2cb6 (py-forward-into-nomenclature, py-backward-into-nomenclature): New functions.
Barry Warsaw <barry@python.org>
parents: 3796
diff changeset
2495 (re-search-backward
3937
decd13f6629d (py-forward-into-nomenclature): Slightly better regex for stopping on
Barry Warsaw <barry@python.org>
parents: 3934
diff changeset
2496 "\\(\\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
2497 (point-min) 0))
b9a0434d2cb6 (py-forward-into-nomenclature, py-backward-into-nomenclature): New functions.
Barry Warsaw <barry@python.org>
parents: 3796
diff changeset
2498 (forward-char 1)
b9a0434d2cb6 (py-forward-into-nomenclature, py-backward-into-nomenclature): New functions.
Barry Warsaw <barry@python.org>
parents: 3796
diff changeset
2499 (setq arg (1+ arg)))))
b9a0434d2cb6 (py-forward-into-nomenclature, py-backward-into-nomenclature): New functions.
Barry Warsaw <barry@python.org>
parents: 3796
diff changeset
2500 (py-keep-region-active))
b9a0434d2cb6 (py-forward-into-nomenclature, py-backward-into-nomenclature): New functions.
Barry Warsaw <barry@python.org>
parents: 3796
diff changeset
2501
b9a0434d2cb6 (py-forward-into-nomenclature, py-backward-into-nomenclature): New functions.
Barry Warsaw <barry@python.org>
parents: 3796
diff changeset
2502 (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
2503 "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
2504 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
2505 forward.
b9a0434d2cb6 (py-forward-into-nomenclature, py-backward-into-nomenclature): New functions.
Barry Warsaw <barry@python.org>
parents: 3796
diff changeset
2506
b9a0434d2cb6 (py-forward-into-nomenclature, py-backward-into-nomenclature): New functions.
Barry Warsaw <barry@python.org>
parents: 3796
diff changeset
2507 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
2508 (interactive "p")
b9a0434d2cb6 (py-forward-into-nomenclature, py-backward-into-nomenclature): New functions.
Barry Warsaw <barry@python.org>
parents: 3796
diff changeset
2509 (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
2510 (py-keep-region-active))
b9a0434d2cb6 (py-forward-into-nomenclature, py-backward-into-nomenclature): New functions.
Barry Warsaw <barry@python.org>
parents: 3796
diff changeset
2511
b9a0434d2cb6 (py-forward-into-nomenclature, py-backward-into-nomenclature): New functions.
Barry Warsaw <barry@python.org>
parents: 3796
diff changeset
2512
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2513
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2514 ;; Documentation functions
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2515
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2516 ;; 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
2517 ;; 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
2518 ;; 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
2519 ;; values
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2520 (defun py-dump-help-string (str)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2521 (with-output-to-temp-buffer "*Help*"
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2522 (let ((locals (buffer-local-variables))
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2523 funckind funcname func funcdoc
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2524 (start 0) mstart end
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2525 keys )
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2526 (while (string-match "^%\\([vc]\\):\\(.+\\)\n" str start)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2527 (setq mstart (match-beginning 0) end (match-end 0)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2528 funckind (substring str (match-beginning 1) (match-end 1))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2529 funcname (substring str (match-beginning 2) (match-end 2))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2530 func (intern funcname))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2531 (princ (substitute-command-keys (substring str start mstart)))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2532 (cond
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2533 ((equal funckind "c") ; command
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2534 (setq funcdoc (documentation func)
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2535 keys (concat
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2536 "Key(s): "
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2537 (mapconcat 'key-description
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2538 (where-is-internal func py-mode-map)
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2539 ", "))))
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2540 ((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
2541 (setq funcdoc (documentation-property func 'variable-documentation)
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2542 keys (if (assq func locals)
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2543 (concat
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2544 "Local/Global values: "
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2545 (prin1-to-string (symbol-value func))
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2546 " / "
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2547 (prin1-to-string (default-value func)))
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2548 (concat
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2549 "Value: "
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2550 (prin1-to-string (symbol-value func))))))
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2551 (t ; unexpected
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2552 (error "Error in py-dump-help-string, tag `%s'" funckind)))
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2553 (princ (format "\n-> %s:\t%s\t%s\n\n"
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2554 (if (equal funckind "c") "Command" "Variable")
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2555 funcname keys))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2556 (princ funcdoc)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2557 (terpri)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2558 (setq start end))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2559 (princ (substitute-command-keys (substring str start))))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2560 (print-help-return-message)))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2561
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2562 (defun py-describe-mode ()
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2563 "Dump long form of Python-mode docs."
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2564 (interactive)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2565 (py-dump-help-string "Major mode for editing Python files.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2566 Knows about Python indentation, tokens, comments and continuation lines.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2567 Paragraphs are separated by blank lines only.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2568
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2569 Major sections below begin with the string `@'; specific function and
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2570 variable docs begin with `->'.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2571
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2572 @EXECUTING PYTHON CODE
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2573
8378
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
2574 \\[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
2575 \\[py-execute-buffer]\tsends the entire buffer to the Python interpreter
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2576 \\[py-execute-region]\tsends the current region
8378
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
2577 \\[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
2578 \\[py-execute-string]\tsends an arbitrary string
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2579 \\[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
2580 \tsubsequent Python execution commands
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
2581 %c:py-execute-import-or-reload
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2582 %c:py-execute-buffer
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2583 %c:py-execute-region
8378
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
2584 %c:py-execute-def-or-class
7ac15f1e5302 More ME patches:
Barry Warsaw <barry@python.org>
parents: 8377
diff changeset
2585 %c:py-execute-string
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2586 %c:py-shell
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2587
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2588 @VARIABLES
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2589
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2590 py-indent-offset\tindentation increment
3818
3c5ca7727988 (python-mode): Added menu support, requires easymenu.
Barry Warsaw <barry@python.org>
parents: 3813
diff changeset
2591 py-block-comment-prefix\tcomment string used by comment-region
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2592
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2593 py-python-command\tshell command to invoke Python interpreter
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2594 py-scroll-process-buffer\talways scroll Python process buffer
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2595 py-temp-directory\tdirectory used for temp files (if needed)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2596
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2597 py-beep-if-tab-change\tring the bell if tab-width is changed
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2598 %v:py-indent-offset
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2599 %v:py-block-comment-prefix
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2600 %v:py-python-command
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2601 %v:py-scroll-process-buffer
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2602 %v:py-temp-directory
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2603 %v:py-beep-if-tab-change
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2604
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2605 @KINDS OF LINES
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2606
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2607 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
2608 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
2609 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
2610 non-zero, or both) or an `initial line' (everything else).
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2611
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2612 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
2613 possibly blanks or tabs), a `comment line' (leftmost non-blank
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2614 character is `#'), or a `code line' (everything else).
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 Comment Lines
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2617
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2618 Although all comment lines are treated alike by Python, Python mode
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2619 recognizes two kinds that act differently with respect to indentation.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2620
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2621 An `indenting comment line' is a comment line with a blank, tab or
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2622 nothing after the initial `#'. The indentation commands (see below)
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2623 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
2624 indenting comment line will be indented like the comment line. All
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2625 other comment lines (those with a non-whitespace character immediately
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2626 following the initial `#') are `non-indenting comment lines', and
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2627 their indentation is ignored by the indentation commands.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2628
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2629 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
2630 whenever possible. Non-indenting comment lines are useful in cases
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2631 like these:
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2632
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2633 \ta = b # a very wordy single-line comment that ends up being
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2634 \t #... continued onto another line
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2635
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2636 \tif a == b:
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2637 ##\t\tprint 'panic!' # old code we've `commented out'
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2638 \t\treturn a
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2639
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2640 Since the `#...' and `##' comment lines have a non-whitespace
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2641 character following the initial `#', Python mode ignores them when
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2642 computing the proper indentation for the next line.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2643
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2644 Continuation Lines and Statements
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2645
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2646 The Python-mode commands generally work on statements instead of on
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2647 individual lines, where a `statement' is a comment or blank line, or a
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2648 code line and all of its following continuation lines (if any)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2649 considered as a single logical unit. The commands in this mode
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2650 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
2651 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
2652 of some continuation line.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2653
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2654
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2655 @INDENTATION
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2656
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2657 Primarily for entering new code:
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2658 \t\\[indent-for-tab-command]\t indent line appropriately
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2659 \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
2660 \t\\[py-electric-backspace]\t reduce indentation, or delete single character
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2661
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2662 Primarily for reindenting existing code:
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2663 \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
2664 \t\\[universal-argument] \\[py-guess-indent-offset]\t ditto, but change globally
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2665
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2666 \t\\[py-indent-region]\t reindent region to match its context
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2667 \t\\[py-shift-region-left]\t shift region left by py-indent-offset
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2668 \t\\[py-shift-region-right]\t shift region right by py-indent-offset
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2669
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2670 Unlike most programming languages, Python uses indentation, and only
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2671 indentation, to specify block structure. Hence the indentation supplied
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2672 automatically by Python-mode is just an educated guess: only you know
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2673 the block structure you intend, so only you can supply correct
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2674 indentation.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2675
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2676 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
2677 the indentation of preceding statements. E.g., assuming
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2678 py-indent-offset is 4, after you enter
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2679 \tif a > 0: \\[py-newline-and-indent]
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2680 the cursor will be moved to the position of the `_' (_ is not a
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2681 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
2682 the cursor):
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2683 \tif a > 0:
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2684 \t _
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2685 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
2686 to
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2687 \tif a > 0:
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2688 \t c = d
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2689 \t _
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2690 Python-mode cannot know whether that's what you intended, or whether
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2691 \tif a > 0:
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2692 \t c = d
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2693 \t_
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2694 was your intent. In general, Python-mode either reproduces the
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2695 indentation of the (closest code or indenting-comment) preceding
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2696 statement, or adds an extra py-indent-offset blanks if the preceding
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2697 statement has `:' as its last significant (non-whitespace and non-
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2698 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
2699 \\[py-electric-backspace] to reduce it.
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2700
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2701 Continuation lines are given extra indentation. If you don't like the
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2702 suggested indentation, change it to something you do like, and Python-
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2703 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
2704
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2705 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
2706 paren/bracket/brace structure (`list', for short), the suggested
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2707 indentation depends on whether the current line contains the first item
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2708 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
2709 the indentation of the line containing the open bracket. If you don't
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2710 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
2711 whatever indentation you give to the first item.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2712
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2713 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
2714 a backslash, the third and following lines of the statement inherit their
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2715 indentation from the line preceding them. The indentation of the second
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2716 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
2717 the base line is an assignment statement with anything more interesting
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2718 than the backslash following the leftmost assigning `=', the second line
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2719 is indented two columns beyond that `='. Else it's indented to two
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2720 columns beyond the leftmost solid chunk of non-whitespace characters on
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2721 the base line.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2722
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2723 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
2724 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
2725 structure you intend.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2726 %c:indent-for-tab-command
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2727 %c:py-newline-and-indent
6730
9c9a87b5bb17 Removed redundant eval-when-compile.
Barry Warsaw <barry@python.org>
parents: 6726
diff changeset
2728 %c:py-electric-backspace
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2729
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2730
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2731 The next function may be handy when editing code you didn't write:
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2732 %c:py-guess-indent-offset
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2733
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2734
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2735 The remaining `indent' functions apply to a region of Python code. They
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2736 assume the block structure (equals indentation, in Python) of the region
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2737 is correct, and alter the indentation in various ways while preserving
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2738 the block structure:
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2739 %c:py-indent-region
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2740 %c:py-shift-region-left
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2741 %c:py-shift-region-right
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2742
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2743 @MARKING & MANIPULATING REGIONS OF CODE
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2744
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2745 \\[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
2746 \\[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
2747 \\[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
2748 \\[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
2749 \\[universal-argument] \\[comment-region]\t uncomment region of code
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2750 %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
2751 %c:py-mark-def-or-class
3818
3c5ca7727988 (python-mode): Added menu support, requires easymenu.
Barry Warsaw <barry@python.org>
parents: 3813
diff changeset
2752 %c:comment-region
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2753
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2754 @MOVING POINT
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2755
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2756 \\[py-previous-statement]\t move to statement preceding point
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2757 \\[py-next-statement]\t move to statement following point
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2758 \\[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
2759 \\[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
2760 \\[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
2761 \\[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
2762 \\[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
2763
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2764 The first two move to one statement beyond the statement that contains
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2765 point. A numeric prefix argument tells them to move that many
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2766 statements instead. Blank lines, comment lines, and continuation lines
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2767 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
2768 to the first code statement in a file by entering
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2769 \t\\[beginning-of-buffer]\t to move to the top of the file
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2770 \t\\[py-next-statement]\t to skip over initial comments and blank lines
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2771 Or do `\\[py-previous-statement]' with a huge prefix argument.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2772 %c:py-previous-statement
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2773 %c:py-next-statement
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2774 %c:py-goto-block-up
8377
95f7c52b6399 (beginning-of-python-def-or-class): Renamed to
Barry Warsaw <barry@python.org>
parents: 8371
diff changeset
2775 %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
2776 %c:py-end-of-def-or-class
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2777
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2778 @LITTLE-KNOWN EMACS COMMANDS PARTICULARLY USEFUL IN PYTHON MODE
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2779
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2780 `\\[indent-new-comment-line]' is handy for entering a multi-line comment.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2781
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2782 `\\[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
2783 overall class and def structure of a module.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2784
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2785 `\\[back-to-indentation]' moves point to a line's first non-blank character.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2786
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2787 `\\[indent-relative]' is handy for creating odd indentation.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2788
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2789 @OTHER EMACS HINTS
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2790
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2791 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
2792 whatever you do like by putting a `setq' line in your .emacs file.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2793 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
2794 .emacs:
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2795 \t(setq py-indent-offset 4)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2796 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
2797 name at the prompt.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2798
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2799 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
2800 release the CONTROL key after doing the `C-c' part -- it suffices to
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2801 press the CONTROL key, press and release `c' (while still holding down
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2802 CONTROL), press and release `n' (while still holding down CONTROL), &
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2803 then release CONTROL.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2804
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2805 Entering Python mode calls with no arguments the value of the variable
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2806 `python-mode-hook', if that value exists and is not nil; for backward
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2807 compatibility it also tries `py-mode-hook'; see the `Hooks' section of
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2808 the Elisp manual for details.
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2809
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2810 Obscure: When python-mode is first loaded, it looks for all bindings
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2811 to newline-and-indent in the global keymap, and shadows them with
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2812 local bindings to py-newline-and-indent."))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2813
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2814
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2815 ;; Helper functions
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2816 (defvar py-parse-state-re
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2817 (concat
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2818 "^[ \t]*\\(if\\|elif\\|else\\|while\\|def\\|class\\)\\>"
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2819 "\\|"
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2820 "^[^ #\t\n]"))
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2821
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2822 (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
2823 "Return the parse state at point (see `parse-partial-sexp' docs)."
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2824 (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
2825 (let ((here (point))
7672
1fb868f25459 (py-smart-indentation): New variable which controls the automagic
Barry Warsaw <barry@python.org>
parents: 7481
diff changeset
2826 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
2827 (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
2828 ;; 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
2829 ;; 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
2830 ;; 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
2831 ;; 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
2832 ;; 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
2833 ;; 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
2834 (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
2835 (beginning-of-line)
7262
c09907104092 (py-compute-indentation): Several changes made to improve navigation
Barry Warsaw <barry@python.org>
parents: 7201
diff changeset
2836 ;; 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
2837 ;; 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
2838 ;; 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
2839 ;; 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
2840 ;; no accurate way to determine this otherwise.
c09907104092 (py-compute-indentation): Several changes made to improve navigation
Barry Warsaw <barry@python.org>
parents: 7201
diff changeset
2841 (if (not (fboundp 'buffer-syntactic-context))
c09907104092 (py-compute-indentation): Several changes made to improve navigation
Barry Warsaw <barry@python.org>
parents: 7201
diff changeset
2842 ;; Emacs
7776
db94b15bd640 Two patches for Emacs 20.2 compatibility:
Barry Warsaw <barry@python.org>
parents: 7743
diff changeset
2843 (progn
db94b15bd640 Two patches for Emacs 20.2 compatibility:
Barry Warsaw <barry@python.org>
parents: 7743
diff changeset
2844 (save-excursion (setq pps (parse-partial-sexp (point) here)))
7262
c09907104092 (py-compute-indentation): Several changes made to improve navigation
Barry Warsaw <barry@python.org>
parents: 7201
diff changeset
2845 ;; make sure we don't land inside a triple-quoted string
7672
1fb868f25459 (py-smart-indentation): New variable which controls the automagic
Barry Warsaw <barry@python.org>
parents: 7481
diff changeset
2846 (setq done (or (not (nth 3 pps))
1fb868f25459 (py-smart-indentation): New variable which controls the automagic
Barry Warsaw <barry@python.org>
parents: 7481
diff changeset
2847 (bobp))))
7262
c09907104092 (py-compute-indentation): Several changes made to improve navigation
Barry Warsaw <barry@python.org>
parents: 7201
diff changeset
2848 ;; XEmacs
c09907104092 (py-compute-indentation): Several changes made to improve navigation
Barry Warsaw <barry@python.org>
parents: 7201
diff changeset
2849 (setq done (or (not (buffer-syntactic-context))
c09907104092 (py-compute-indentation): Several changes made to improve navigation
Barry Warsaw <barry@python.org>
parents: 7201
diff changeset
2850 (bobp)))
c09907104092 (py-compute-indentation): Several changes made to improve navigation
Barry Warsaw <barry@python.org>
parents: 7201
diff changeset
2851 (when done
c09907104092 (py-compute-indentation): Several changes made to improve navigation
Barry Warsaw <barry@python.org>
parents: 7201
diff changeset
2852 (setq pps (parse-partial-sexp (point) here)))
c09907104092 (py-compute-indentation): Several changes made to improve navigation
Barry Warsaw <barry@python.org>
parents: 7201
diff changeset
2853 ))
3487
83557153f544 (py-parse-state): make sure we don't land inside a triple-quoted
Barry Warsaw <barry@python.org>
parents: 3480
diff changeset
2854 pps)))
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2855
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2856 (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
2857 "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
2858 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
2859 (let ((status (py-parse-state)))
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2860 (if (zerop (car status))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2861 nil ; not in a nest
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2862 (car (cdr status))))) ; char# of open bracket
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2863
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2864 (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
2865 "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
2866 (save-excursion
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2867 (beginning-of-line)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2868 (and
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2869 ;; use a cheap test first to avoid the regexp if possible
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2870 ;; use 'eq' because char-after may return nil
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2871 (eq (char-after (- (point) 2)) ?\\ )
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2872 ;; 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
2873 (forward-line -1) ; always true -- side effect
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2874 (looking-at py-continued-re))))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2875
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2876 (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
2877 "Return t iff current line is a continuation line."
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2878 (save-excursion
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2879 (beginning-of-line)
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2880 (or (py-backslash-continuation-line-p)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2881 (py-nesting-level))))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2882
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2883 (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
2884 "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
2885 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
2886 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
2887 line of the block."
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2888 ;; 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
2889 ;; 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
2890 ;; 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
2891 ;; in the usual cases.
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2892 ;;
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2893 ;; 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
2894 ;; 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
2895 (let (open-bracket-pos)
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2896 (while (py-continuation-line-p)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2897 (beginning-of-line)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2898 (if (py-backslash-continuation-line-p)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2899 (while (py-backslash-continuation-line-p)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2900 (forward-line -1))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2901 ;; else zip out of nested brackets/braces/parens
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2902 (while (setq open-bracket-pos (py-nesting-level))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2903 (goto-char open-bracket-pos)))))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2904 (beginning-of-line))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2905
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2906 (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
2907 "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
2908 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
2909 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
2910 ;; 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
2911 ;; behavior.
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2912 ;;
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2913 ;; 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
2914 ;; strings
8379
f5ebcc7a5ab2 (py-stringlit-re): Another ME patch to recognize SQTQs and DQTQs
Barry Warsaw <barry@python.org>
parents: 8378
diff changeset
2915 (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
2916 (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
2917 ;;
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2918 (forward-line 1)
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2919 (let (state)
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2920 (while (and (py-continuation-line-p)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2921 (not (eobp)))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2922 ;; skip over the backslash flavor
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2923 (while (and (py-backslash-continuation-line-p)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2924 (not (eobp)))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2925 (forward-line 1))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2926 ;; if in nest, zip to the end of the nest
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2927 (setq state (py-parse-state))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2928 (if (and (not (zerop (car state)))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2929 (not (eobp)))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2930 (progn
6544
d28932d676c8 Changes in preparation for integrating into the Python CVS tree.
Barry Warsaw <barry@python.org>
parents: 6232
diff changeset
2931 (parse-partial-sexp (point) (point-max) 0 nil state)
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2932 (forward-line 1))))))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2933
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2934 (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
2935 "Return t iff the current statement opens a block.
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2936 I.e., iff it ends with a colon that is not in a comment. Point should
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
2937 be at the start of a statement."
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2938 (save-excursion
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2939 (let ((start (point))
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2940 (finish (progn (py-goto-beyond-final-line) (1- (point))))
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2941 (searching t)
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2942 (answer nil)
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2943 state)
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2944 (goto-char start)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2945 (while searching
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2946 ;; look for a colon with nothing after it except whitespace, and
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2947 ;; maybe a comment
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2948 (if (re-search-forward ":\\([ \t]\\|\\\\\n\\)*\\(#.*\\)?$"
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2949 finish t)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2950 (if (eq (point) finish) ; note: no `else' clause; just
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2951 ; keep searching if we're not at
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2952 ; the end yet
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2953 ;; sure looks like it opens a block -- but it might
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2954 ;; be in a comment
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2955 (progn
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2956 (setq searching nil) ; search is done either way
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2957 (setq state (parse-partial-sexp start
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2958 (match-beginning 0)))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2959 (setq answer (not (nth 4 state)))))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2960 ;; search failed: couldn't find another interesting colon
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2961 (setq searching nil)))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2962 answer)))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2963
3900
cba4ce15a0d5 (py-statement-closes-block-p, py-compute-indentation): Outdent one
Barry Warsaw <barry@python.org>
parents: 3818
diff changeset
2964 (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
2965 "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
2966 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
2967 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
2968 (let ((here (point)))
cba4ce15a0d5 (py-statement-closes-block-p, py-compute-indentation): Outdent one
Barry Warsaw <barry@python.org>
parents: 3818
diff changeset
2969 (back-to-indentation)
cba4ce15a0d5 (py-statement-closes-block-p, py-compute-indentation): Outdent one
Barry Warsaw <barry@python.org>
parents: 3818
diff changeset
2970 (prog1
6544
d28932d676c8 Changes in preparation for integrating into the Python CVS tree.
Barry Warsaw <barry@python.org>
parents: 6232
diff changeset
2971 (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
2972 (goto-char here))))
cba4ce15a0d5 (py-statement-closes-block-p, py-compute-indentation): Outdent one
Barry Warsaw <barry@python.org>
parents: 3818
diff changeset
2973
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2974 (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
2975 "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
2976 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
2977 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
2978 Assumes point is at the beginning of the line."
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2979 (if (py-statement-opens-block-p)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2980 (py-mark-block nil 'just-move)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2981 (py-goto-beyond-final-line)))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2982
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2983 (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
2984 "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
2985 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
2986 does not include blank lines, comments, or continuation lines."
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2987 (py-goto-initial-line)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2988 (if (looking-at py-blank-or-comment-re)
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2989 ;; skip back over blank & comment lines
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2990 ;; 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
2991 ;; a continuation line too
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2992 (if (re-search-backward "^[ \t]*[^ \t#\n]" nil t)
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2993 (progn (py-goto-initial-line) t)
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
2994 nil)
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2995 t))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2996
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
2997 (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
2998 "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
2999 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
3000 does not include blank lines, comments, or continuation lines."
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3001 (beginning-of-line)
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3002 (let ((start (point)))
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3003 (py-goto-beyond-final-line)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3004 (while (and
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3005 (looking-at py-blank-or-comment-re)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3006 (not (eobp)))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3007 (forward-line 1))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3008 (if (eobp)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3009 (progn (goto-char start) nil)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3010 t)))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3011
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3012 (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
3013 "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
3014
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3015 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
3016 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
3017 KEY, then stop, otherwise go back to first enclosing block starting
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3018 with KEY. If successful, leave point at the start of the KEY line and
b1d1d8c0071b Huge number of docstring changes, typo fixes, rewordings, GNU standard
Barry Warsaw <barry@python.org>
parents: 8888
diff changeset
3019 return t. Otherwise, leav point at an undefined place and return nil."
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3020 ;; skip blanks and non-indenting #
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3021 (py-goto-initial-line)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3022 (while (and
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3023 (looking-at "[ \t]*\\($\\|#[^ \t\n]\\)")
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3024 (zerop (forward-line -1))) ; go back
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3025 nil)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3026 (py-goto-initial-line)
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3027 (let* ((re (concat "[ \t]*" key "\\b"))
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3028 (case-fold-search nil) ; let* so looking-at sees this
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3029 (found (looking-at re))
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3030 (dead nil))
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3031 (while (not (or found dead))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3032 (condition-case nil ; in case no enclosing block
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3033 (py-goto-block-up 'no-mark)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3034 (error (setq dead t)))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3035 (or dead (setq found (looking-at re))))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3036 (beginning-of-line)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3037 found))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3038
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3039 (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
3040 "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
3041 Prefix with \"...\" if leading whitespace was skipped."
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3042 (save-excursion
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3043 (back-to-indentation)
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3044 (concat
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3045 (if (bolp) "" "...")
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3046 (buffer-substring (point) (progn (end-of-line) (point))))))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3047
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3048 (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
3049 "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
3050 `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
3051 ([a-z]+). Returns nil if none was found."
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3052 (let ((case-fold-search nil))
2018
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3053 (if (looking-at "[ \t]*\\([a-z]+\\)\\b")
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3054 (intern (buffer-substring (match-beginning 1) (match-end 1)))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3055 nil)))
5a0775ce7b31 Initial revision
Barry Warsaw <barry@python.org>
parents:
diff changeset
3056
4195
e3f6ada28ed0 I have been increasingly annoyed about the fact that
Barry Warsaw <barry@python.org>
parents: 4194
diff changeset
3057 (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
3058 "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
3059 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
3060 (save-excursion
e3f6ada28ed0 I have been increasingly annoyed about the fact that
Barry Warsaw <barry@python.org>
parents: 4194
diff changeset
3061 (if (re-search-backward py-defun-start-re nil t)
e3f6ada28ed0 I have been increasingly annoyed about the fact that
Barry Warsaw <barry@python.org>
parents: 4194
diff changeset
3062 (or (match-string 3)
e3f6ada28ed0 I have been increasingly annoyed about the fact that
Barry Warsaw <barry@python.org>
parents: 4194
diff changeset
3063 (let ((method (match-string 2)))
e3f6ada28ed0 I have been increasingly annoyed about the fact that
Barry Warsaw <barry@python.org>
parents: 4194
diff changeset
3064 (if (and (not (zerop (length (match-string 1))))
e3f6ada28ed0 I have been increasingly annoyed about the fact that
Barry Warsaw <barry@python.org>
parents: 4194
diff changeset
3065 (re-search-backward py-class-start-re nil t))
e3f6ada28ed0 I have been increasingly annoyed about the fact that
Barry Warsaw <barry@python.org>
parents: 4194
diff changeset
3066 (concat (match-string 1) "." method)
e3f6ada28ed0 I have been increasingly annoyed about the fact that
Barry Warsaw <barry@python.org>
parents: 4194
diff changeset
3067 method)))
e3f6ada28ed0 I have been increasingly annoyed about the fact that
Barry Warsaw <barry@python.org>
parents: 4194
diff changeset
3068 nil)))
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3069
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3070
2799
4a998b1a331f #changed all email address to go through python.org
Barry Warsaw <barry@python.org>
parents: 2798
diff changeset
3071 (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
3072 "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
3073
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
3074 (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
3075 "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
3076 (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
3077 (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
3078 (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
3079
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
3080 ;; 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
3081 ;(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
3082 ; (require 'reporter))
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3083
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
3084 (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
3085 "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
3086 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
3087 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
3088 (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
3089 (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
3090 "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
3091 (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
3092 "(Very) brief summary: "
1a448dd84edc (py-submit-bug-report): fixed summary querying
Barry Warsaw <barry@python.org>
parents: 2537
diff changeset
3093 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
3094 (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
3095 (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
3096 py-help-address ;address
2543
1a448dd84edc (py-submit-bug-report): fixed summary querying
Barry Warsaw <barry@python.org>
parents: 2537
diff changeset
3097 (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
3098 ;; 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
3099 (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
3100 '(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
3101 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
3102 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
3103 py-scroll-process-buffer
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
3104 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
3105 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
3106 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
3107 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
3108 "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
3109 (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
3110 (set-mark (point))
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
3111 (insert
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
3112 "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
3113 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
3114 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
3115 (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
3116 (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
3117
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
3118
6667
089c04d89151 (py-kill-emacs-hook): Simplification.
Barry Warsaw <barry@python.org>
parents: 6663
diff changeset
3119 (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
3120 "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
3121 These are Python temporary files awaiting execution."
6667
089c04d89151 (py-kill-emacs-hook): Simplification.
Barry Warsaw <barry@python.org>
parents: 6663
diff changeset
3122 (mapcar #'(lambda (filename)
089c04d89151 (py-kill-emacs-hook): Simplification.
Barry Warsaw <barry@python.org>
parents: 6663
diff changeset
3123 (py-safe (delete-file filename)))
089c04d89151 (py-kill-emacs-hook): Simplification.
Barry Warsaw <barry@python.org>
parents: 6663
diff changeset
3124 py-file-queue))
089c04d89151 (py-kill-emacs-hook): Simplification.
Barry Warsaw <barry@python.org>
parents: 6663
diff changeset
3125
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3126 ;; 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
3127 (add-hook 'kill-emacs-hook 'py-kill-emacs-hook)
2493
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3128
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3129
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3130
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3131 (provide 'python-mode)
d9481354fdc3 #initial stylistic rewrite
Barry Warsaw <barry@python.org>
parents: 2041
diff changeset
3132 ;;; python-mode.el ends here