Merge from emacs-24; up to 2012-12-19T13:01:16Z!michael.albinus@gmx.de
[bpt/emacs.git] / lisp / progmodes / python.el
CommitLineData
d617c457 1;;; python.el --- Python's flying circus support for Emacs
45c138ac 2
ab422c4d 3;; Copyright (C) 2003-2013 Free Software Foundation, Inc.
45c138ac
FEG
4
5;; Author: Fabián E. Gallina <fabian@anue.biz>
b7f13559 6;; URL: https://github.com/fgallina/python.el
09268a54 7;; Version: 0.24.2
45c138ac
FEG
8;; Maintainer: FSF
9;; Created: Jul 2010
10;; Keywords: languages
11
09268a54 12;; This file is part of GNU Emacs.
45c138ac 13
09268a54
FEG
14;; GNU Emacs is free software: you can redistribute it and/or modify
15;; it under the terms of the GNU General Public License as published
16;; by the Free Software Foundation, either version 3 of the License,
17;; or (at your option) any later version.
45c138ac 18
09268a54
FEG
19;; GNU Emacs is distributed in the hope that it will be useful, but
20;; WITHOUT ANY WARRANTY; without even the implied warranty of
21;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22;; General Public License for more details.
45c138ac
FEG
23
24;; You should have received a copy of the GNU General Public License
09268a54 25;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
45c138ac
FEG
26
27;;; Commentary:
28
29;; Major mode for editing Python files with some fontification and
30;; indentation bits extracted from original Dave Love's python.el
31;; found in GNU/Emacs.
32
45c138ac 33;; Implements Syntax highlighting, Indentation, Movement, Shell
64348c32
FEG
34;; interaction, Shell completion, Shell virtualenv support, Pdb
35;; tracking, Symbol completion, Skeletons, FFAP, Code Check, Eldoc,
207cb73c 36;; Imenu.
45c138ac
FEG
37
38;; Syntax highlighting: Fontification of code is provided and supports
39;; python's triple quoted strings properly.
40
41;; Indentation: Automatic indentation with indentation cycling is
42;; provided, it allows you to navigate different available levels of
67845102
FEG
43;; indentation by hitting <tab> several times. Also when inserting a
44;; colon the `python-indent-electric-colon' command is invoked and
45;; causes the current line to be dedented automatically if needed.
45c138ac
FEG
46
47;; Movement: `beginning-of-defun' and `end-of-defun' functions are
fc6c545e 48;; properly implemented. There are also specialized
032d23ab
FEG
49;; `forward-sentence' and `backward-sentence' replacements called
50;; `python-nav-forward-block', `python-nav-backward-block'
51;; respectively which navigate between beginning of blocks of code.
52;; Extra functions `python-nav-forward-statement',
bcdc27d7
FEG
53;; `python-nav-backward-statement',
54;; `python-nav-beginning-of-statement', `python-nav-end-of-statement',
55;; `python-nav-beginning-of-block' and `python-nav-end-of-block' are
56;; included but no bound to any key. At last but not least the
ea5f4192
FEG
57;; specialized `python-nav-forward-sexp' allows easy navigation
58;; between code blocks. If you prefer `cc-mode'-like `forward-sexp'
59;; movement, setting `forward-sexp-function' to nil is enough, You can
60;; do that using the `python-mode-hook':
61
62;; (add-hook 'python-mode-hook
63;; (lambda () (setq forward-sexp-function nil)))
45c138ac 64
fc6c545e 65;; Shell interaction: is provided and allows you to execute easily any
45c138ac
FEG
66;; block of code of your current buffer in an inferior Python process.
67
68;; Shell completion: hitting tab will try to complete the current
4e531f7a 69;; word. Shell completion is implemented in a manner that if you
45c138ac
FEG
70;; change the `python-shell-interpreter' to any other (for example
71;; IPython) it should be easy to integrate another way to calculate
57808175 72;; completions. You just need to specify your custom
45c138ac 73;; `python-shell-completion-setup-code' and
4cafacb5 74;; `python-shell-completion-string-code'.
62feb915
FEG
75
76;; Here is a complete example of the settings you would use for
1faf2911 77;; iPython 0.11:
62feb915
FEG
78
79;; (setq
80;; python-shell-interpreter "ipython"
81;; python-shell-interpreter-args ""
82;; python-shell-prompt-regexp "In \\[[0-9]+\\]: "
83;; python-shell-prompt-output-regexp "Out\\[[0-9]+\\]: "
9399498e
FEG
84;; python-shell-completion-setup-code
85;; "from IPython.core.completerlib import module_completion"
f6b59cd1 86;; python-shell-completion-module-string-code
9399498e 87;; "';'.join(module_completion('''%s'''))\n"
62feb915 88;; python-shell-completion-string-code
9399498e 89;; "';'.join(get_ipython().Completer.all_completions('''%s'''))\n")
1faf2911
FEG
90
91;; For iPython 0.10 everything would be the same except for
936bc833
FEG
92;; `python-shell-completion-string-code' and
93;; `python-shell-completion-module-string-code':
1faf2911
FEG
94
95;; (setq python-shell-completion-string-code
936bc833
FEG
96;; "';'.join(__IP.complete('''%s'''))\n"
97;; python-shell-completion-module-string-code "")
45c138ac 98
a1ea6ab8
FEG
99;; Unfortunately running iPython on Windows needs some more tweaking.
100;; The way you must set `python-shell-interpreter' and
101;; `python-shell-interpreter-args' is as follows:
102
103;; (setq
104;; python-shell-interpreter "C:\\Python27\\python.exe"
105;; python-shell-interpreter-args
106;; "-i C:\\Python27\\Scripts\\ipython-script.py")
107
108;; That will spawn the iPython process correctly (Of course you need
109;; to modify the paths according to your system).
110
099bf010
FEG
111;; Please note that the default completion system depends on the
112;; readline module, so if you are using some Operating System that
113;; bundles Python without it (like Windows) just install the
114;; pyreadline from http://ipython.scipy.org/moin/PyReadline/Intro and
115;; you should be good to go.
116
64348c32
FEG
117;; Shell virtualenv support: The shell also contains support for
118;; virtualenvs and other special environment modifications thanks to
66bbb27f
FEG
119;; `python-shell-process-environment' and `python-shell-exec-path'.
120;; These two variables allows you to modify execution paths and
307bd2e8 121;; environment variables to make easy for you to setup virtualenv rules
64348c32 122;; or behavior modifications when running shells. Here is an example
66bbb27f
FEG
123;; of how to make shell processes to be run using the /path/to/env/
124;; virtualenv:
125
126;; (setq python-shell-process-environment
127;; (list
128;; (format "PATH=%s" (mapconcat
129;; 'identity
130;; (reverse
131;; (cons (getenv "PATH")
132;; '("/path/to/env/bin/")))
133;; ":"))
134;; "VIRTUAL_ENV=/path/to/env/"))
135;; (python-shell-exec-path . ("/path/to/env/bin/"))
136
48d1354e 137;; Since the above is cumbersome and can be programmatically
64348c32
FEG
138;; calculated, the variable `python-shell-virtualenv-path' is
139;; provided. When this variable is set with the path of the
140;; virtualenv to use, `process-environment' and `exec-path' get proper
141;; values in order to run shells inside the specified virtualenv. So
142;; the following will achieve the same as the previous example:
143
144;; (setq python-shell-virtualenv-path "/path/to/env/")
145
929036b4
FEG
146;; Also the `python-shell-extra-pythonpaths' variable have been
147;; introduced as simple way of adding paths to the PYTHONPATH without
148;; affecting existing values.
149
45c138ac
FEG
150;; Pdb tracking: when you execute a block of code that contains some
151;; call to pdb (or ipdb) it will prompt the block of code and will
152;; follow the execution of pdb marking the current line with an arrow.
153
4e531f7a 154;; Symbol completion: you can complete the symbol at point. It uses
45c138ac
FEG
155;; the shell completion in background so you should run
156;; `python-shell-send-buffer' from time to time to get better results.
157
e2803784
FEG
158;; Skeletons: 6 skeletons are provided for simple inserting of class,
159;; def, for, if, try and while. These skeletons are integrated with
160;; dabbrev. If you have `dabbrev-mode' activated and
161;; `python-skeleton-autoinsert' is set to t, then whenever you type
162;; the name of any of those defined and hit SPC, they will be
345f866e
FEG
163;; automatically expanded. As an alternative you can use the defined
164;; skeleton commands: `python-skeleton-class', `python-skeleton-def'
165;; `python-skeleton-for', `python-skeleton-if', `python-skeleton-try'
166;; and `python-skeleton-while'.
e2803784 167
2947016a
FEG
168;; FFAP: You can find the filename for a given module when using ffap
169;; out of the box. This feature needs an inferior python shell
170;; running.
171
2d63ad56
FEG
172;; Code check: Check the current file for errors with `python-check'
173;; using the program defined in `python-check-command'.
8b3e0e76 174
45c138ac 175;; Eldoc: returns documentation for object at point by using the
4e531f7a 176;; inferior python subprocess to inspect its documentation. As you
45c138ac
FEG
177;; might guessed you should run `python-shell-send-buffer' from time
178;; to time to get better results too.
179
207cb73c 180;; Imenu: This mode supports Imenu in its most basic form, letting it
758e556a
FEG
181;; build the necessary alist via `imenu-default-create-index-function'
182;; by having set `imenu-extract-index-name-function' to
207cb73c
FEG
183;; `python-info-current-defun' and
184;; `imenu-prev-index-position-function' to
185;; `python-imenu-prev-index-position'.
fc2dc7df 186
57808175
FEG
187;; If you used python-mode.el you probably will miss auto-indentation
188;; when inserting newlines. To achieve the same behavior you have
189;; two options:
190
191;; 1) Use GNU/Emacs' standard binding for `newline-and-indent': C-j.
192
193;; 2) Add the following hook in your .emacs:
194
195;; (add-hook 'python-mode-hook
196;; #'(lambda ()
197;; (define-key python-mode-map "\C-m" 'newline-and-indent)))
198
199;; I'd recommend the first one since you'll get the same behavior for
200;; all modes out-of-the-box.
201
45c138ac
FEG
202;;; Installation:
203
204;; Add this to your .emacs:
205
206;; (add-to-list 'load-path "/folder/containing/file")
207;; (require 'python)
208
209;;; TODO:
210
45c138ac
FEG
211;;; Code:
212
45c138ac 213(require 'ansi-color)
73ed6836 214(require 'comint)
45c138ac 215
14146222
SM
216;; Avoid compiler warnings
217(defvar view-return-to-alist)
218(defvar compilation-error-regexp-alist)
219(defvar outline-heading-end-regexp)
45c138ac
FEG
220
221(autoload 'comint-mode "comint")
222
223;;;###autoload
224(add-to-list 'auto-mode-alist (cons (purecopy "\\.py\\'") 'python-mode))
225;;;###autoload
226(add-to-list 'interpreter-mode-alist (cons (purecopy "python") 'python-mode))
227
228(defgroup python nil
229 "Python Language's flying circus support for Emacs."
230 :group 'languages
5b63c74a 231 :version "24.3"
45c138ac
FEG
232 :link '(emacs-commentary-link "python"))
233
234\f
235;;; Bindings
236
237(defvar python-mode-map
238 (let ((map (make-sparse-keymap)))
9fff1858 239 ;; Movement
55cd00c8
FEG
240 (define-key map [remap backward-sentence] 'python-nav-backward-block)
241 (define-key map [remap forward-sentence] 'python-nav-forward-block)
242 (define-key map [remap backward-up-list] 'python-nav-backward-up-list)
758e556a 243 (define-key map "\C-c\C-j" 'imenu)
45c138ac
FEG
244 ;; Indent specific
245 (define-key map "\177" 'python-indent-dedent-line-backspace)
246 (define-key map (kbd "<backtab>") 'python-indent-dedent-line)
247 (define-key map "\C-c<" 'python-indent-shift-left)
248 (define-key map "\C-c>" 'python-indent-shift-right)
ffdb56c3 249 (define-key map ":" 'python-indent-electric-colon)
e2803784
FEG
250 ;; Skeletons
251 (define-key map "\C-c\C-tc" 'python-skeleton-class)
252 (define-key map "\C-c\C-td" 'python-skeleton-def)
253 (define-key map "\C-c\C-tf" 'python-skeleton-for)
254 (define-key map "\C-c\C-ti" 'python-skeleton-if)
255 (define-key map "\C-c\C-tt" 'python-skeleton-try)
256 (define-key map "\C-c\C-tw" 'python-skeleton-while)
45c138ac 257 ;; Shell interaction
a90dfb95 258 (define-key map "\C-c\C-p" 'run-python)
45c138ac
FEG
259 (define-key map "\C-c\C-s" 'python-shell-send-string)
260 (define-key map "\C-c\C-r" 'python-shell-send-region)
261 (define-key map "\C-\M-x" 'python-shell-send-defun)
262 (define-key map "\C-c\C-c" 'python-shell-send-buffer)
263 (define-key map "\C-c\C-l" 'python-shell-send-file)
264 (define-key map "\C-c\C-z" 'python-shell-switch-to-shell)
8b3e0e76
FEG
265 ;; Some util commands
266 (define-key map "\C-c\C-v" 'python-check)
78334b43 267 (define-key map "\C-c\C-f" 'python-eldoc-at-point)
45c138ac
FEG
268 ;; Utilities
269 (substitute-key-definition 'complete-symbol 'completion-at-point
6cad4c6e 270 map global-map)
45c138ac
FEG
271 (easy-menu-define python-menu map "Python Mode menu"
272 `("Python"
6cad4c6e
FEG
273 :help "Python-specific Features"
274 ["Shift region left" python-indent-shift-left :active mark-active
275 :help "Shift region left by a single indentation step"]
276 ["Shift region right" python-indent-shift-right :active mark-active
277 :help "Shift region right by a single indentation step"]
278 "-"
279 ["Start of def/class" beginning-of-defun
280 :help "Go to start of outermost definition around point"]
281 ["End of def/class" end-of-defun
282 :help "Go to end of definition around point"]
283 ["Mark def/class" mark-defun
284 :help "Mark outermost definition around point"]
758e556a 285 ["Jump to def/class" imenu
6cad4c6e 286 :help "Jump to a class or function definition"]
fc6c545e 287 "--"
6cad4c6e 288 ("Skeletons")
fc6c545e 289 "---"
6cad4c6e
FEG
290 ["Start interpreter" run-python
291 :help "Run inferior Python process in a separate buffer"]
292 ["Switch to shell" python-shell-switch-to-shell
293 :help "Switch to running inferior Python process"]
294 ["Eval string" python-shell-send-string
295 :help "Eval string in inferior Python session"]
296 ["Eval buffer" python-shell-send-buffer
297 :help "Eval buffer in inferior Python session"]
298 ["Eval region" python-shell-send-region
299 :help "Eval region in inferior Python session"]
300 ["Eval defun" python-shell-send-defun
301 :help "Eval defun in inferior Python session"]
302 ["Eval file" python-shell-send-file
303 :help "Eval file in inferior Python session"]
304 ["Debugger" pdb :help "Run pdb under GUD"]
fc6c545e 305 "----"
6cad4c6e
FEG
306 ["Check file" python-check
307 :help "Check file for errors"]
308 ["Help on symbol" python-eldoc-at-point
309 :help "Get help on symbol at point"]
310 ["Complete symbol" completion-at-point
311 :help "Complete symbol before point"]))
45c138ac
FEG
312 map)
313 "Keymap for `python-mode'.")
314
315\f
316;;; Python specialized rx
317
73ed6836
FEG
318(eval-when-compile
319 (defconst python-rx-constituents
25f09295 320 `((block-start . ,(rx symbol-start
73ed6836
FEG
321 (or "def" "class" "if" "elif" "else" "try"
322 "except" "finally" "for" "while" "with")
323 symbol-end))
25f09295 324 (decorator . ,(rx line-start (* space) ?@ (any letter ?_)
6cad4c6e 325 (* (any word ?_))))
25f09295
SM
326 (defun . ,(rx symbol-start (or "def" "class") symbol-end))
327 (if-name-main . ,(rx line-start "if" (+ space) "__name__"
90a41b9d
FEG
328 (+ space) "==" (+ space)
329 (any ?' ?\") "__main__" (any ?' ?\")
330 (* space) ?:))
25f09295
SM
331 (symbol-name . ,(rx (any letter ?_) (* (any word ?_))))
332 (open-paren . ,(rx (or "{" "[" "(")))
333 (close-paren . ,(rx (or "}" "]" ")")))
334 (simple-operator . ,(rx (any ?+ ?- ?/ ?& ?^ ?~ ?| ?* ?< ?> ?= ?%)))
335 ;; FIXME: rx should support (not simple-operator).
336 (not-simple-operator . ,(rx
6cad4c6e
FEG
337 (not
338 (any ?+ ?- ?/ ?& ?^ ?~ ?| ?* ?< ?> ?= ?%))))
25f09295
SM
339 ;; FIXME: Use regexp-opt.
340 (operator . ,(rx (or "+" "-" "/" "&" "^" "~" "|" "*" "<" ">"
73ed6836
FEG
341 "=" "%" "**" "//" "<<" ">>" "<=" "!="
342 "==" ">=" "is" "not")))
25f09295
SM
343 ;; FIXME: Use regexp-opt.
344 (assignment-operator . ,(rx (or "=" "+=" "-=" "*=" "/=" "//=" "%=" "**="
a5b773c4
FEG
345 ">>=" "<<=" "&=" "^=" "|=")))
346 (string-delimiter . ,(rx (and
347 ;; Match even number of backslashes.
348 (or (not (any ?\\ ?\' ?\")) point
349 ;; Quotes might be preceded by a escaped quote.
350 (and (or (not (any ?\\)) point) ?\\
351 (* ?\\ ?\\) (any ?\' ?\")))
352 (* ?\\ ?\\)
353 ;; Match single or triple quotes of any kind.
354 (group (or "\"" "\"\"\"" "'" "'''"))))))
355 "Additional Python specific sexps for `python-rx'")
356
357 (defmacro python-rx (&rest regexps)
358 "Python mode specialized rx macro.
6cad4c6e 359This variant of `rx' supports common python named REGEXPS."
a5b773c4
FEG
360 (let ((rx-constituents (append python-rx-constituents rx-constituents)))
361 (cond ((null regexps)
362 (error "No regexp"))
363 ((cdr regexps)
364 (rx-to-string `(and ,@regexps) t))
365 (t
366 (rx-to-string (car regexps) t))))))
45c138ac
FEG
367
368\f
369;;; Font-lock and syntax
2d79ec42
FEG
370
371(defun python-syntax-context (type &optional syntax-ppss)
372 "Return non-nil if point is on TYPE using SYNTAX-PPSS.
373TYPE can be `comment', `string' or `paren'. It returns the start
374character address of the specified TYPE."
14146222
SM
375 (declare (compiler-macro
376 (lambda (form)
377 (pcase type
378 (`'comment
379 `(let ((ppss (or ,syntax-ppss (syntax-ppss))))
380 (and (nth 4 ppss) (nth 8 ppss))))
381 (`'string
382 `(let ((ppss (or ,syntax-ppss (syntax-ppss))))
383 (and (nth 3 ppss) (nth 8 ppss))))
384 (`'paren
385 `(nth 1 (or ,syntax-ppss (syntax-ppss))))
386 (_ form)))))
2d79ec42 387 (let ((ppss (or syntax-ppss (syntax-ppss))))
14146222
SM
388 (pcase type
389 (`comment (and (nth 4 ppss) (nth 8 ppss)))
390 (`string (and (nth 3 ppss) (nth 8 ppss)))
391 (`paren (nth 1 ppss))
392 (_ nil))))
2d79ec42
FEG
393
394(defun python-syntax-context-type (&optional syntax-ppss)
395 "Return the context type using SYNTAX-PPSS.
396The type returned can be `comment', `string' or `paren'."
397 (let ((ppss (or syntax-ppss (syntax-ppss))))
398 (cond
399 ((nth 8 ppss) (if (nth 4 ppss) 'comment 'string))
400 ((nth 1 ppss) 'paren))))
401
402(defsubst python-syntax-comment-or-string-p ()
403 "Return non-nil if point is inside 'comment or 'string."
404 (nth 8 (syntax-ppss)))
405
406(define-obsolete-function-alias
2a1e2476 407 'python-info-ppss-context #'python-syntax-context "24.3")
2d79ec42
FEG
408
409(define-obsolete-function-alias
2a1e2476 410 'python-info-ppss-context-type #'python-syntax-context-type "24.3")
2d79ec42
FEG
411
412(define-obsolete-function-alias
413 'python-info-ppss-comment-or-string-p
2a1e2476 414 #'python-syntax-comment-or-string-p "24.3")
2d79ec42 415
45c138ac
FEG
416(defvar python-font-lock-keywords
417 ;; Keywords
418 `(,(rx symbol-start
27d7f16f
FEG
419 (or
420 "and" "del" "from" "not" "while" "as" "elif" "global" "or" "with"
421 "assert" "else" "if" "pass" "yield" "break" "except" "import" "class"
422 "in" "raise" "continue" "finally" "is" "return" "def" "for" "lambda"
423 "try"
424 ;; Python 2:
425 "print" "exec"
426 ;; Python 3:
427 ;; False, None, and True are listed as keywords on the Python 3
428 ;; documentation, but since they also qualify as constants they are
429 ;; fontified like that in order to keep font-lock consistent between
430 ;; Python versions.
479a14cc
FEG
431 "nonlocal"
432 ;; Extra:
433 "self")
45c138ac
FEG
434 symbol-end)
435 ;; functions
436 (,(rx symbol-start "def" (1+ space) (group (1+ (or word ?_))))
437 (1 font-lock-function-name-face))
438 ;; classes
439 (,(rx symbol-start "class" (1+ space) (group (1+ (or word ?_))))
440 (1 font-lock-type-face))
441 ;; Constants
c61d750e 442 (,(rx symbol-start
27d7f16f
FEG
443 (or
444 "Ellipsis" "False" "None" "NotImplemented" "True" "__debug__"
445 ;; copyright, license, credits, quit and exit are added by the site
446 ;; module and they are not intended to be used in programs
447 "copyright" "credits" "exit" "license" "quit")
c61d750e 448 symbol-end) . font-lock-constant-face)
45c138ac
FEG
449 ;; Decorators.
450 (,(rx line-start (* (any " \t")) (group "@" (1+ (or word ?_))
451 (0+ "." (1+ (or word ?_)))))
452 (1 font-lock-type-face))
453 ;; Builtin Exceptions
454 (,(rx symbol-start
27d7f16f
FEG
455 (or
456 "ArithmeticError" "AssertionError" "AttributeError" "BaseException"
457 "DeprecationWarning" "EOFError" "EnvironmentError" "Exception"
458 "FloatingPointError" "FutureWarning" "GeneratorExit" "IOError"
459 "ImportError" "ImportWarning" "IndexError" "KeyError"
460 "KeyboardInterrupt" "LookupError" "MemoryError" "NameError"
461 "NotImplementedError" "OSError" "OverflowError"
462 "PendingDeprecationWarning" "ReferenceError" "RuntimeError"
463 "RuntimeWarning" "StopIteration" "SyntaxError" "SyntaxWarning"
464 "SystemError" "SystemExit" "TypeError" "UnboundLocalError"
465 "UnicodeDecodeError" "UnicodeEncodeError" "UnicodeError"
466 "UnicodeTranslateError" "UnicodeWarning" "UserWarning" "VMSError"
467 "ValueError" "Warning" "WindowsError" "ZeroDivisionError"
468 ;; Python 2:
469 "StandardError"
470 ;; Python 3:
471 "BufferError" "BytesWarning" "IndentationError" "ResourceWarning"
472 "TabError")
45c138ac
FEG
473 symbol-end) . font-lock-type-face)
474 ;; Builtins
9438f1ef 475 (,(rx symbol-start
27d7f16f
FEG
476 (or
477 "abs" "all" "any" "bin" "bool" "callable" "chr" "classmethod"
478 "compile" "complex" "delattr" "dict" "dir" "divmod" "enumerate"
479 "eval" "filter" "float" "format" "frozenset" "getattr" "globals"
480 "hasattr" "hash" "help" "hex" "id" "input" "int" "isinstance"
481 "issubclass" "iter" "len" "list" "locals" "map" "max" "memoryview"
482 "min" "next" "object" "oct" "open" "ord" "pow" "print" "property"
483 "range" "repr" "reversed" "round" "set" "setattr" "slice" "sorted"
484 "staticmethod" "str" "sum" "super" "tuple" "type" "vars" "zip"
485 "__import__"
486 ;; Python 2:
487 "basestring" "cmp" "execfile" "file" "long" "raw_input" "reduce"
488 "reload" "unichr" "unicode" "xrange" "apply" "buffer" "coerce"
489 "intern"
490 ;; Python 3:
491 "ascii" "bytearray" "bytes" "exec"
492 ;; Extra:
493 "__all__" "__doc__" "__name__" "__package__")
9438f1ef 494 symbol-end) . font-lock-builtin-face)
48d1354e 495 ;; assignments
45c138ac
FEG
496 ;; support for a = b = c = 5
497 (,(lambda (limit)
d8e594db
FEG
498 (let ((re (python-rx (group (+ (any word ?. ?_)))
499 (? ?\[ (+ (not (any ?\]))) ?\]) (* space)
45c138ac
FEG
500 assignment-operator)))
501 (when (re-search-forward re limit t)
2d79ec42 502 (while (and (python-syntax-context 'paren)
45c138ac 503 (re-search-forward re limit t)))
14146222
SM
504 (if (not (or (python-syntax-context 'paren)
505 (equal (char-after (point-marker)) ?=)))
45c138ac
FEG
506 t
507 (set-match-data nil)))))
508 (1 font-lock-variable-name-face nil nil))
509 ;; support for a, b, c = (1, 2, 3)
510 (,(lambda (limit)
511 (let ((re (python-rx (group (+ (any word ?. ?_))) (* space)
512 (* ?, (* space) (+ (any word ?. ?_)) (* space))
513 ?, (* space) (+ (any word ?. ?_)) (* space)
514 assignment-operator)))
515 (when (and (re-search-forward re limit t)
516 (goto-char (nth 3 (match-data))))
2d79ec42 517 (while (and (python-syntax-context 'paren)
45c138ac
FEG
518 (re-search-forward re limit t))
519 (goto-char (nth 3 (match-data))))
2d79ec42 520 (if (not (python-syntax-context 'paren))
45c138ac
FEG
521 t
522 (set-match-data nil)))))
523 (1 font-lock-variable-name-face nil nil))))
524
aeadd9a4 525(defconst python-syntax-propertize-function
aeadd9a4 526 (syntax-propertize-rules
a5b773c4 527 ((python-rx string-delimiter)
5727eadf 528 (0 (ignore (python-syntax-stringify))))))
8fb8b88f
FEG
529
530(defsubst python-syntax-count-quotes (quote-char &optional point limit)
531 "Count number of quotes around point (max is 3).
532QUOTE-CHAR is the quote char to count. Optional argument POINT is
533the point where scan starts (defaults to current point) and LIMIT
534is used to limit the scan."
535 (let ((i 0))
536 (while (and (< i 3)
537 (or (not limit) (< (+ point i) limit))
538 (eq (char-after (+ point i)) quote-char))
66164d2f 539 (setq i (1+ i)))
8fb8b88f
FEG
540 i))
541
542(defun python-syntax-stringify ()
543 "Put `syntax-table' property correctly on single/triple quotes."
a1a9f411 544 (let* ((num-quotes (length (match-string-no-properties 1)))
8fb8b88f
FEG
545 (ppss (prog2
546 (backward-char num-quotes)
547 (syntax-ppss)
548 (forward-char num-quotes)))
549 (string-start (and (not (nth 4 ppss)) (nth 8 ppss)))
550 (quote-starting-pos (- (point) num-quotes))
551 (quote-ending-pos (point))
552 (num-closing-quotes
553 (and string-start
554 (python-syntax-count-quotes
555 (char-before) string-start quote-starting-pos))))
556 (cond ((and string-start (= num-closing-quotes 0))
557 ;; This set of quotes doesn't match the string starting
558 ;; kind. Do nothing.
559 nil)
560 ((not string-start)
561 ;; This set of quotes delimit the start of a string.
562 (put-text-property quote-starting-pos (1+ quote-starting-pos)
563 'syntax-table (string-to-syntax "|")))
564 ((= num-quotes num-closing-quotes)
565 ;; This set of quotes delimit the end of a string.
566 (put-text-property (1- quote-ending-pos) quote-ending-pos
567 'syntax-table (string-to-syntax "|")))
568 ((> num-quotes num-closing-quotes)
569 ;; This may only happen whenever a triple quote is closing
570 ;; a single quoted string. Add string delimiter syntax to
571 ;; all three quotes.
572 (put-text-property quote-starting-pos quote-ending-pos
573 'syntax-table (string-to-syntax "|"))))))
45c138ac
FEG
574
575(defvar python-mode-syntax-table
576 (let ((table (make-syntax-table)))
577 ;; Give punctuation syntax to ASCII that normally has symbol
578 ;; syntax or has word syntax and isn't a letter.
579 (let ((symbol (string-to-syntax "_"))
6cad4c6e 580 (sst (standard-syntax-table)))
45c138ac 581 (dotimes (i 128)
6cad4c6e
FEG
582 (unless (= i ?_)
583 (if (equal symbol (aref sst i))
584 (modify-syntax-entry i "." table)))))
45c138ac
FEG
585 (modify-syntax-entry ?$ "." table)
586 (modify-syntax-entry ?% "." table)
587 ;; exceptions
588 (modify-syntax-entry ?# "<" table)
589 (modify-syntax-entry ?\n ">" table)
590 (modify-syntax-entry ?' "\"" table)
591 (modify-syntax-entry ?` "$" table)
592 table)
593 "Syntax table for Python files.")
594
595(defvar python-dotty-syntax-table
596 (let ((table (make-syntax-table python-mode-syntax-table)))
597 (modify-syntax-entry ?. "w" table)
598 (modify-syntax-entry ?_ "w" table)
599 table)
600 "Dotty syntax table for Python files.
601It makes underscores and dots word constituent chars.")
602
603\f
604;;; Indentation
605
606(defcustom python-indent-offset 4
607 "Default indentation offset for Python."
608 :group 'python
609 :type 'integer
610 :safe 'integerp)
611
612(defcustom python-indent-guess-indent-offset t
613 "Non-nil tells Python mode to guess `python-indent-offset' value."
614 :type 'boolean
0f55249e
FEG
615 :group 'python
616 :safe 'booleanp)
45c138ac 617
ccb1c17e
FEG
618(defcustom python-indent-trigger-commands
619 '(indent-for-tab-command yas-expand yas/expand)
620 "Commands that might trigger a `python-indent-line' call."
621 :type '(repeat symbol)
622 :group 'python)
623
9ddf3c74 624(define-obsolete-variable-alias
2a1e2476 625 'python-indent 'python-indent-offset "24.3")
9ddf3c74
FEG
626
627(define-obsolete-variable-alias
2a1e2476 628 'python-guess-indent 'python-indent-guess-indent-offset "24.3")
9ddf3c74 629
45c138ac
FEG
630(defvar python-indent-current-level 0
631 "Current indentation level `python-indent-line-function' is using.")
632
633(defvar python-indent-levels '(0)
634 "Levels of indentation available for `python-indent-line-function'.")
635
636(defvar python-indent-dedenters '("else" "elif" "except" "finally")
637 "List of words that should be dedented.
638These make `python-indent-calculate-indentation' subtract the value of
639`python-indent-offset'.")
640
641(defun python-indent-guess-indent-offset ()
954aa7bd 642 "Guess and set `python-indent-offset' for the current buffer."
9ddf3c74 643 (interactive)
6cad4c6e
FEG
644 (save-excursion
645 (save-restriction
646 (widen)
647 (goto-char (point-min))
648 (let ((block-end))
649 (while (and (not block-end)
650 (re-search-forward
651 (python-rx line-start block-start) nil t))
652 (when (and
2d79ec42 653 (not (python-syntax-context-type))
6cad4c6e
FEG
654 (progn
655 (goto-char (line-end-position))
656 (python-util-forward-comment -1)
657 (if (equal (char-before) ?:)
658 t
659 (forward-line 1)
660 (when (python-info-block-continuation-line-p)
661 (while (and (python-info-continuation-line-p)
662 (not (eobp)))
663 (forward-line 1))
664 (python-util-forward-comment -1)
665 (when (equal (char-before) ?:)
666 t)))))
667 (setq block-end (point-marker))))
668 (let ((indentation
669 (when block-end
670 (goto-char block-end)
671 (python-util-forward-comment)
672 (current-indentation))))
673 (if indentation
98f99594 674 (set (make-local-variable 'python-indent-offset) indentation)
6cad4c6e
FEG
675 (message "Can't guess python-indent-offset, using defaults: %s"
676 python-indent-offset)))))))
45c138ac 677
e2d8d479
FEG
678(defun python-indent-context ()
679 "Get information on indentation context.
680Context information is returned with a cons with the form:
681 \(STATUS . START)
45c138ac
FEG
682
683Where status can be any of the following symbols:
45c138ac
FEG
684 * inside-paren: If point in between (), {} or []
685 * inside-string: If point is inside a string
686 * after-backslash: Previous line ends in a backslash
687 * after-beginning-of-block: Point is after beginning of block
688 * after-line: Point is after normal line
689 * no-indent: Point is at beginning of buffer or other special case
45c138ac
FEG
690START is the buffer position where the sexp starts."
691 (save-restriction
692 (widen)
693 (let ((ppss (save-excursion (beginning-of-line) (syntax-ppss)))
694 (start))
695 (cons
696 (cond
69bab1de 697 ;; Beginning of buffer
19b122e4
FEG
698 ((save-excursion
699 (goto-char (line-beginning-position))
700 (bobp))
69bab1de 701 'no-indent)
45c138ac 702 ;; Inside string
2d79ec42 703 ((setq start (python-syntax-context 'string ppss))
45c138ac 704 'inside-string)
be0d5bae
FEG
705 ;; Inside a paren
706 ((setq start (python-syntax-context 'paren ppss))
707 'inside-paren)
45c138ac 708 ;; After backslash
2d79ec42
FEG
709 ((setq start (when (not (or (python-syntax-context 'string ppss)
710 (python-syntax-context 'comment ppss)))
45c138ac 711 (let ((line-beg-pos (line-beginning-position)))
6cad4c6e
FEG
712 (when (python-info-line-ends-backslash-p
713 (1- line-beg-pos))
45c138ac
FEG
714 (- line-beg-pos 2)))))
715 'after-backslash)
716 ;; After beginning of block
717 ((setq start (save-excursion
0674d3fa
FEG
718 (when (progn
719 (back-to-indentation)
720 (python-util-forward-comment -1)
721 (equal (char-before) ?:))
722 ;; Move to the first block start that's not in within
723 ;; a string, comment or paren and that's not a
724 ;; continuation line.
725 (while (and (re-search-backward
726 (python-rx block-start) nil t)
727 (or
2d79ec42 728 (python-syntax-context-type)
0674d3fa
FEG
729 (python-info-continuation-line-p))))
730 (when (looking-at (python-rx block-start))
45c138ac
FEG
731 (point-marker)))))
732 'after-beginning-of-block)
733 ;; After normal line
734 ((setq start (save-excursion
257b0017 735 (back-to-indentation)
be0d5bae 736 (skip-chars-backward (rx (or whitespace ?\n)))
bcdc27d7 737 (python-nav-beginning-of-statement)
45c138ac
FEG
738 (point-marker)))
739 'after-line)
740 ;; Do not indent
741 (t 'no-indent))
742 start))))
743
744(defun python-indent-calculate-indentation ()
745 "Calculate correct indentation offset for the current line."
746 (let* ((indentation-context (python-indent-context))
747 (context-status (car indentation-context))
748 (context-start (cdr indentation-context)))
749 (save-restriction
750 (widen)
751 (save-excursion
14146222
SM
752 (pcase context-status
753 (`no-indent 0)
0674d3fa
FEG
754 ;; When point is after beginning of block just add one level
755 ;; of indentation relative to the context-start
14146222 756 (`after-beginning-of-block
45c138ac
FEG
757 (goto-char context-start)
758 (+ (current-indentation) python-indent-offset))
0674d3fa
FEG
759 ;; When after a simple line just use previous line
760 ;; indentation, in the case current line starts with a
761 ;; `python-indent-dedenters' de-indent one level.
14146222 762 (`after-line
45c138ac
FEG
763 (-
764 (save-excursion
765 (goto-char context-start)
766 (current-indentation))
767 (if (progn
768 (back-to-indentation)
769 (looking-at (regexp-opt python-indent-dedenters)))
770 python-indent-offset
771 0)))
0674d3fa
FEG
772 ;; When inside of a string, do nothing. just use the current
773 ;; indentation. XXX: perhaps it would be a good idea to
774 ;; invoke standard text indentation here
14146222 775 (`inside-string
45c138ac
FEG
776 (goto-char context-start)
777 (current-indentation))
48d1354e 778 ;; After backslash we have several possibilities.
14146222 779 (`after-backslash
0674d3fa
FEG
780 (cond
781 ;; Check if current line is a dot continuation. For this
782 ;; the current line must start with a dot and previous
783 ;; line must contain a dot too.
784 ((save-excursion
785 (back-to-indentation)
786 (when (looking-at "\\.")
dc4f2e53
FEG
787 ;; If after moving one line back point is inside a paren it
788 ;; needs to move back until it's not anymore
789 (while (prog2
790 (forward-line -1)
791 (and (not (bobp))
2d79ec42 792 (python-syntax-context 'paren))))
0674d3fa 793 (goto-char (line-end-position))
6cad4c6e
FEG
794 (while (and (re-search-backward
795 "\\." (line-beginning-position) t)
2d79ec42 796 (python-syntax-context-type)))
0674d3fa 797 (if (and (looking-at "\\.")
2d79ec42 798 (not (python-syntax-context-type)))
0674d3fa
FEG
799 ;; The indentation is the same column of the
800 ;; first matching dot that's not inside a
801 ;; comment, a string or a paren
802 (current-column)
803 ;; No dot found on previous line, just add another
804 ;; indentation level.
805 (+ (current-indentation) python-indent-offset)))))
806 ;; Check if prev line is a block continuation
807 ((let ((block-continuation-start
808 (python-info-block-continuation-line-p)))
809 (when block-continuation-start
810 ;; If block-continuation-start is set jump to that
811 ;; marker and use first column after the block start
812 ;; as indentation value.
813 (goto-char block-continuation-start)
814 (re-search-forward
815 (python-rx block-start (* space))
816 (line-end-position) t)
817 (current-column))))
818 ;; Check if current line is an assignment continuation
819 ((let ((assignment-continuation-start
820 (python-info-assignment-continuation-line-p)))
821 (when assignment-continuation-start
822 ;; If assignment-continuation is set jump to that
823 ;; marker and use first column after the assignment
824 ;; operator as indentation value.
825 (goto-char assignment-continuation-start)
826 (current-column))))
827 (t
828 (forward-line -1)
48d1354e 829 (goto-char (python-info-beginning-of-backslash))
0674d3fa
FEG
830 (if (save-excursion
831 (and
0674d3fa 832 (forward-line -1)
dc4f2e53 833 (goto-char
48d1354e 834 (or (python-info-beginning-of-backslash) (point)))
0674d3fa
FEG
835 (python-info-line-ends-backslash-p)))
836 ;; The two previous lines ended in a backslash so we must
837 ;; respect previous line indentation.
838 (current-indentation)
839 ;; What happens here is that we are dealing with the second
840 ;; line of a backslash continuation, in that case we just going
841 ;; to add one indentation level.
842 (+ (current-indentation) python-indent-offset)))))
843 ;; When inside a paren there's a need to handle nesting
844 ;; correctly
14146222 845 (`inside-paren
0674d3fa 846 (cond
48d1354e 847 ;; If current line closes the outermost open paren use the
0674d3fa
FEG
848 ;; current indentation of the context-start line.
849 ((save-excursion
850 (skip-syntax-forward "\s" (line-end-position))
851 (when (and (looking-at (regexp-opt '(")" "]" "}")))
852 (progn
853 (forward-char 1)
2d79ec42 854 (not (python-syntax-context 'paren))))
0674d3fa
FEG
855 (goto-char context-start)
856 (current-indentation))))
857 ;; If open paren is contained on a line by itself add another
858 ;; indentation level, else look for the first word after the
859 ;; opening paren and use it's column position as indentation
860 ;; level.
861 ((let* ((content-starts-in-newline)
862 (indent
863 (save-excursion
864 (if (setq content-starts-in-newline
865 (progn
866 (goto-char context-start)
867 (forward-char)
868 (save-restriction
869 (narrow-to-region
870 (line-beginning-position)
871 (line-end-position))
872 (python-util-forward-comment))
873 (looking-at "$")))
874 (+ (current-indentation) python-indent-offset)
875 (current-column)))))
876 ;; Adjustments
877 (cond
878 ;; If current line closes a nested open paren de-indent one
879 ;; level.
880 ((progn
17d13b85 881 (back-to-indentation)
0674d3fa
FEG
882 (looking-at (regexp-opt '(")" "]" "}"))))
883 (- indent python-indent-offset))
884 ;; If the line of the opening paren that wraps the current
885 ;; line starts a block add another level of indentation to
886 ;; follow new pep8 recommendation. See: http://ur1.ca/5rojx
887 ((save-excursion
888 (when (and content-starts-in-newline
889 (progn
890 (goto-char context-start)
891 (back-to-indentation)
892 (looking-at (python-rx block-start))))
893 (+ indent python-indent-offset))))
894 (t indent)))))))))))
45c138ac
FEG
895
896(defun python-indent-calculate-levels ()
897 "Calculate `python-indent-levels' and reset `python-indent-current-level'."
898 (let* ((indentation (python-indent-calculate-indentation))
899 (remainder (% indentation python-indent-offset))
900 (steps (/ (- indentation remainder) python-indent-offset)))
65e4f764 901 (setq python-indent-levels (list 0))
45c138ac 902 (dotimes (step steps)
65e4f764 903 (push (* python-indent-offset (1+ step)) python-indent-levels))
45c138ac 904 (when (not (eq 0 remainder))
65e4f764 905 (push (+ (* python-indent-offset steps) remainder) python-indent-levels))
45c138ac
FEG
906 (setq python-indent-levels (nreverse python-indent-levels))
907 (setq python-indent-current-level (1- (length python-indent-levels)))))
908
909(defun python-indent-toggle-levels ()
910 "Toggle `python-indent-current-level' over `python-indent-levels'."
911 (setq python-indent-current-level (1- python-indent-current-level))
912 (when (< python-indent-current-level 0)
913 (setq python-indent-current-level (1- (length python-indent-levels)))))
914
915(defun python-indent-line (&optional force-toggle)
916 "Internal implementation of `python-indent-line-function'.
45c138ac
FEG
917Uses the offset calculated in
918`python-indent-calculate-indentation' and available levels
e2d8d479
FEG
919indicated by the variable `python-indent-levels' to set the
920current indentation.
45c138ac 921
ccb1c17e
FEG
922When the variable `last-command' is equal to one of the symbols
923inside `python-indent-trigger-commands' or FORCE-TOGGLE is
924non-nil it cycles levels indicated in the variable
925`python-indent-levels' by setting the current level in the
926variable `python-indent-current-level'.
927
928When the variable `last-command' is not equal to one of the
929symbols inside `python-indent-trigger-commands' and FORCE-TOGGLE
930is nil it calculates possible indentation levels and saves it in
931the variable `python-indent-levels'. Afterwards it sets the
932variable `python-indent-current-level' correctly so offset is
933equal to (`nth' `python-indent-current-level'
934`python-indent-levels')"
095bb823 935 (or
ccb1c17e 936 (and (or (and (memq this-command python-indent-trigger-commands)
095bb823
FEG
937 (eq last-command this-command))
938 force-toggle)
939 (not (equal python-indent-levels '(0)))
940 (or (python-indent-toggle-levels) t))
941 (python-indent-calculate-levels))
942 (let* ((starting-pos (point-marker))
943 (indent-ending-position
944 (+ (line-beginning-position) (current-indentation)))
945 (follow-indentation-p
946 (or (bolp)
947 (and (<= (line-beginning-position) starting-pos)
948 (>= indent-ending-position starting-pos))))
949 (next-indent (nth python-indent-current-level python-indent-levels)))
950 (unless (= next-indent (current-indentation))
951 (beginning-of-line)
952 (delete-horizontal-space)
953 (indent-to next-indent)
954 (goto-char starting-pos))
955 (and follow-indentation-p (back-to-indentation)))
cd7ab092 956 (python-info-closing-block-message))
45c138ac
FEG
957
958(defun python-indent-line-function ()
959 "`indent-line-function' for Python mode.
e2d8d479 960See `python-indent-line' for details."
45c138ac
FEG
961 (python-indent-line))
962
963(defun python-indent-dedent-line ()
e2d8d479 964 "De-indent current line."
45c138ac 965 (interactive "*")
2d79ec42 966 (when (and (not (python-syntax-comment-or-string-p))
45c138ac
FEG
967 (<= (point-marker) (save-excursion
968 (back-to-indentation)
969 (point-marker)))
970 (> (current-column) 0))
971 (python-indent-line t)
972 t))
973
974(defun python-indent-dedent-line-backspace (arg)
e2d8d479 975 "De-indent current line.
45c138ac 976Argument ARG is passed to `backward-delete-char-untabify' when
e2d8d479 977point is not in between the indentation."
45c138ac
FEG
978 (interactive "*p")
979 (when (not (python-indent-dedent-line))
980 (backward-delete-char-untabify arg)))
183f9296 981(put 'python-indent-dedent-line-backspace 'delete-selection 'supersede)
45c138ac
FEG
982
983(defun python-indent-region (start end)
984 "Indent a python region automagically.
985
986Called from a program, START and END specify the region to indent."
cb42456f
FEG
987 (let ((deactivate-mark nil))
988 (save-excursion
989 (goto-char end)
990 (setq end (point-marker))
991 (goto-char start)
992 (or (bolp) (forward-line 1))
993 (while (< (point) end)
994 (or (and (bolp) (eolp))
995 (let (word)
996 (forward-line -1)
997 (back-to-indentation)
998 (setq word (current-word))
999 (forward-line 1)
be0d5bae
FEG
1000 (when (and word
1001 ;; Don't mess with strings, unless it's the
1002 ;; enclosing set of quotes.
1003 (or (not (python-syntax-context 'string))
1004 (eq
1005 (syntax-after
1006 (+ (1- (point))
1007 (current-indentation)
1008 (python-syntax-count-quotes (char-after) (point))))
1009 (string-to-syntax "|"))))
cb42456f
FEG
1010 (beginning-of-line)
1011 (delete-horizontal-space)
1012 (indent-to (python-indent-calculate-indentation)))))
1013 (forward-line 1))
1014 (move-marker end nil))))
45c138ac
FEG
1015
1016(defun python-indent-shift-left (start end &optional count)
1017 "Shift lines contained in region START END by COUNT columns to the left.
e2d8d479
FEG
1018COUNT defaults to `python-indent-offset'. If region isn't
1019active, the current line is shifted. The shifted region includes
1020the lines in which START and END lie. An error is signaled if
1021any lines in the region are indented less than COUNT columns."
45c138ac
FEG
1022 (interactive
1023 (if mark-active
1024 (list (region-beginning) (region-end) current-prefix-arg)
1025 (list (line-beginning-position) (line-end-position) current-prefix-arg)))
1026 (if count
1027 (setq count (prefix-numeric-value count))
1028 (setq count python-indent-offset))
1029 (when (> count 0)
cb42456f
FEG
1030 (let ((deactivate-mark nil))
1031 (save-excursion
1032 (goto-char start)
1033 (while (< (point) end)
1034 (if (and (< (current-indentation) count)
1035 (not (looking-at "[ \t]*$")))
1036 (error "Can't shift all lines enough"))
1037 (forward-line))
1038 (indent-rigidly start end (- count))))))
45c138ac
FEG
1039
1040(add-to-list 'debug-ignored-errors "^Can't shift all lines enough")
1041
1042(defun python-indent-shift-right (start end &optional count)
1043 "Shift lines contained in region START END by COUNT columns to the left.
e2d8d479
FEG
1044COUNT defaults to `python-indent-offset'. If region isn't
1045active, the current line is shifted. The shifted region includes
1046the lines in which START and END lie."
45c138ac
FEG
1047 (interactive
1048 (if mark-active
1049 (list (region-beginning) (region-end) current-prefix-arg)
1050 (list (line-beginning-position) (line-end-position) current-prefix-arg)))
cb42456f
FEG
1051 (let ((deactivate-mark nil))
1052 (if count
1053 (setq count (prefix-numeric-value count))
1054 (setq count python-indent-offset))
1055 (indent-rigidly start end count)))
45c138ac 1056
ffdb56c3 1057(defun python-indent-electric-colon (arg)
e2d8d479
FEG
1058 "Insert a colon and maybe de-indent the current line.
1059With numeric ARG, just insert that many colons. With
1060\\[universal-argument], just insert a single colon."
ffdb56c3
FEG
1061 (interactive "*P")
1062 (self-insert-command (if (not (integerp arg)) 1 arg))
c43cd8b1
FEG
1063 (when (and (not arg)
1064 (eolp)
1065 (not (equal ?: (char-after (- (point-marker) 2))))
2d79ec42 1066 (not (python-syntax-comment-or-string-p)))
c43cd8b1
FEG
1067 (let ((indentation (current-indentation))
1068 (calculated-indentation (python-indent-calculate-indentation)))
cd7ab092 1069 (python-info-closing-block-message)
c43cd8b1
FEG
1070 (when (> indentation calculated-indentation)
1071 (save-excursion
1072 (indent-line-to calculated-indentation)
cd7ab092 1073 (when (not (python-info-closing-block-message))
c43cd8b1 1074 (indent-line-to indentation)))))))
ffdb56c3
FEG
1075(put 'python-indent-electric-colon 'delete-selection t)
1076
5eae76ae
FEG
1077(defun python-indent-post-self-insert-function ()
1078 "Adjust closing paren line indentation after a char is added.
1079This function is intended to be added to the
1080`post-self-insert-hook.' If a line renders a paren alone, after
1081adding a char before it, the line will be re-indented
1082automatically if needed."
1083 (when (and (eq (char-before) last-command-event)
5eae76ae
FEG
1084 (not (bolp))
1085 (memq (char-after) '(?\) ?\] ?\})))
cd05d2a6
FEG
1086 (save-excursion
1087 (goto-char (line-beginning-position))
1088 ;; If after going to the beginning of line the point
1089 ;; is still inside a paren it's ok to do the trick
2d79ec42 1090 (when (python-syntax-context 'paren)
cd05d2a6
FEG
1091 (let ((indentation (python-indent-calculate-indentation)))
1092 (when (< (current-indentation) indentation)
1093 (indent-line-to indentation)))))))
5eae76ae 1094
45c138ac
FEG
1095\f
1096;;; Navigation
1097
0567effb 1098(defvar python-nav-beginning-of-defun-regexp
af5c1beb 1099 (python-rx line-start (* space) defun (+ space) (group symbol-name))
fc6c545e 1100 "Regexp matching class or function definition.
fc2dc7df
FEG
1101The name of the defun should be grouped so it can be retrieved
1102via `match-string'.")
45c138ac 1103
2e6625b5
FEG
1104(defun python-nav--beginning-of-defun (&optional arg)
1105 "Internal implementation of `python-nav-beginning-of-defun'.
1106With positive ARG search backwards, else search forwards."
8c6f9e60
FEG
1107 (when (or (null arg) (= arg 0)) (setq arg 1))
1108 (let* ((re-search-fn (if (> arg 0)
1109 #'re-search-backward
1110 #'re-search-forward))
1111 (line-beg-pos (line-beginning-position))
1112 (line-content-start (+ line-beg-pos (current-indentation)))
1113 (pos (point-marker))
2e6625b5
FEG
1114 (beg-indentation
1115 (and (> arg 0)
1116 (save-excursion
207cb73c
FEG
1117 (while (and
1118 (not (python-info-looking-at-beginning-of-defun))
1119 (python-nav-backward-block)))
1120 (or (and (python-info-looking-at-beginning-of-defun)
1121 (+ (current-indentation) python-indent-offset))
1122 0))))
8c6f9e60
FEG
1123 (found
1124 (progn
1125 (when (and (< arg 0)
1126 (python-info-looking-at-beginning-of-defun))
1127 (end-of-line 1))
1128 (while (and (funcall re-search-fn
1129 python-nav-beginning-of-defun-regexp nil t)
2e6625b5
FEG
1130 (or (python-syntax-context-type)
1131 ;; Handle nested defuns when moving
1132 ;; backwards by checking indentation.
1133 (and (> arg 0)
1134 (not (= (current-indentation) 0))
1135 (>= (current-indentation) beg-indentation)))))
8c6f9e60
FEG
1136 (and (python-info-looking-at-beginning-of-defun)
1137 (or (not (= (line-number-at-pos pos)
1138 (line-number-at-pos)))
1139 (and (>= (point) line-beg-pos)
1140 (<= (point) line-content-start)
1141 (> pos line-content-start)))))))
1142 (if found
1143 (or (beginning-of-line 1) t)
1144 (and (goto-char pos) nil))))
1145
2e6625b5
FEG
1146(defun python-nav-beginning-of-defun (&optional arg)
1147 "Move point to `beginning-of-defun'.
1148With positive ARG search backwards else search forward. When ARG
1149is nil or 0 defaults to 1. When searching backwards nested
1150defuns are handled with care depending on current point
1151position. Return non-nil if point is moved to
1152`beginning-of-defun'."
0567effb 1153 (when (or (null arg) (= arg 0)) (setq arg 1))
8c6f9e60
FEG
1154 (let ((found))
1155 (cond ((and (eq this-command 'mark-defun)
1156 (python-info-looking-at-beginning-of-defun)))
1157 (t
1158 (dotimes (i (if (> arg 0) arg (- arg)))
2e6625b5 1159 (when (and (python-nav--beginning-of-defun arg)
8c6f9e60
FEG
1160 (not found))
1161 (setq found t)))))
1162 found))
45c138ac 1163
2e6625b5 1164(defun python-nav-end-of-defun ()
45c138ac
FEG
1165 "Move point to the end of def or class.
1166Returns nil if point is not in a def or class."
0567effb 1167 (interactive)
2e6625b5
FEG
1168 (let ((beg-defun-indent)
1169 (beg-pos (point)))
8c6f9e60 1170 (when (or (python-info-looking-at-beginning-of-defun)
2e6625b5
FEG
1171 (python-nav-beginning-of-defun 1)
1172 (python-nav-beginning-of-defun -1))
8c6f9e60 1173 (setq beg-defun-indent (current-indentation))
2e6625b5
FEG
1174 (while (progn
1175 (python-nav-end-of-statement)
1176 (python-util-forward-comment 1)
1177 (and (> (current-indentation) beg-defun-indent)
1178 (not (eobp)))))
1179 (python-util-forward-comment -1)
8c6f9e60 1180 (forward-line 1)
2e6625b5
FEG
1181 ;; Ensure point moves forward.
1182 (and (> beg-pos (point)) (goto-char beg-pos)))))
45c138ac 1183
bcdc27d7 1184(defun python-nav-beginning-of-statement ()
032d23ab 1185 "Move to start of current statement."
3697b531 1186 (interactive "^")
032d23ab 1187 (while (and (or (back-to-indentation) t)
3697b531
FEG
1188 (not (bobp))
1189 (when (or
1190 (save-excursion
1191 (forward-line -1)
1192 (python-info-line-ends-backslash-p))
2d79ec42
FEG
1193 (python-syntax-context 'string)
1194 (python-syntax-context 'paren))
8dbce54c
FEG
1195 (forward-line -1))))
1196 (point-marker))
3697b531 1197
6861432e
FEG
1198(defun python-nav-end-of-statement (&optional noend)
1199 "Move to end of current statement.
1200Optional argument NOEND is internal and makes the logic to not
1201jump to the end of line when moving forward searching for the end
1202of the statement."
3697b531 1203 (interactive "^")
6861432e
FEG
1204 (let (string-start bs-pos)
1205 (while (and (or noend (goto-char (line-end-position)))
1206 (not (eobp))
1207 (cond ((setq string-start (python-syntax-context 'string))
1208 (goto-char string-start)
50620051
FEG
1209 (if (python-syntax-context 'paren)
1210 ;; Ended up inside a paren, roll again.
1211 (python-nav-end-of-statement t)
1212 ;; This is not inside a paren, move to the
1213 ;; end of this string.
1214 (goto-char (+ (point)
1215 (python-syntax-count-quotes
1216 (char-after (point)) (point))))
1217 (or (re-search-forward (rx (syntax string-delimiter)) nil t)
1218 (goto-char (point-max)))))
6861432e
FEG
1219 ((python-syntax-context 'paren)
1220 ;; The statement won't end before we've escaped
1221 ;; at least one level of parenthesis.
1222 (condition-case err
1223 (goto-char (scan-lists (point) 1 -1))
1224 (scan-error (goto-char (nth 3 err)))))
1225 ((setq bs-pos (python-info-line-ends-backslash-p))
1226 (goto-char bs-pos)
1227 (forward-line 1))))))
8dbce54c 1228 (point-marker))
3697b531 1229
032d23ab
FEG
1230(defun python-nav-backward-statement (&optional arg)
1231 "Move backward to previous statement.
1232With ARG, repeat. See `python-nav-forward-statement'."
9fff1858
FEG
1233 (interactive "^p")
1234 (or arg (setq arg 1))
032d23ab 1235 (python-nav-forward-statement (- arg)))
9fff1858 1236
032d23ab
FEG
1237(defun python-nav-forward-statement (&optional arg)
1238 "Move forward to next statement.
1239With ARG, repeat. With negative argument, move ARG times
1240backward to previous statement."
9fff1858
FEG
1241 (interactive "^p")
1242 (or arg (setq arg 1))
1243 (while (> arg 0)
bcdc27d7 1244 (python-nav-end-of-statement)
0674d3fa 1245 (python-util-forward-comment)
bcdc27d7 1246 (python-nav-beginning-of-statement)
9fff1858
FEG
1247 (setq arg (1- arg)))
1248 (while (< arg 0)
bcdc27d7 1249 (python-nav-beginning-of-statement)
0674d3fa 1250 (python-util-forward-comment -1)
bcdc27d7 1251 (python-nav-beginning-of-statement)
032d23ab
FEG
1252 (setq arg (1+ arg))))
1253
bcdc27d7 1254(defun python-nav-beginning-of-block ()
032d23ab
FEG
1255 "Move to start of current block."
1256 (interactive "^")
1257 (let ((starting-pos (point))
1258 (block-regexp (python-rx
1259 line-start (* whitespace) block-start)))
1260 (if (progn
bcdc27d7 1261 (python-nav-beginning-of-statement)
032d23ab
FEG
1262 (looking-at (python-rx block-start)))
1263 (point-marker)
1264 ;; Go to first line beginning a statement
1265 (while (and (not (bobp))
bcdc27d7 1266 (or (and (python-nav-beginning-of-statement) nil)
032d23ab
FEG
1267 (python-info-current-line-comment-p)
1268 (python-info-current-line-empty-p)))
1269 (forward-line -1))
1270 (let ((block-matching-indent
1271 (- (current-indentation) python-indent-offset)))
1272 (while
1273 (and (python-nav-backward-block)
1274 (> (current-indentation) block-matching-indent)))
1275 (if (and (looking-at (python-rx block-start))
1276 (= (current-indentation) block-matching-indent))
1277 (point-marker)
1278 (and (goto-char starting-pos) nil))))))
1279
bcdc27d7 1280(defun python-nav-end-of-block ()
032d23ab
FEG
1281 "Move to end of current block."
1282 (interactive "^")
bcdc27d7 1283 (when (python-nav-beginning-of-block)
032d23ab 1284 (let ((block-indentation (current-indentation)))
bcdc27d7 1285 (python-nav-end-of-statement)
032d23ab
FEG
1286 (while (and (forward-line 1)
1287 (not (eobp))
1288 (or (and (> (current-indentation) block-indentation)
bcdc27d7 1289 (or (python-nav-end-of-statement) t))
032d23ab
FEG
1290 (python-info-current-line-comment-p)
1291 (python-info-current-line-empty-p))))
1292 (python-util-forward-comment -1)
1293 (point-marker))))
1294
1295(defun python-nav-backward-block (&optional arg)
1296 "Move backward to previous block of code.
1297With ARG, repeat. See `python-nav-forward-block'."
1298 (interactive "^p")
1299 (or arg (setq arg 1))
1300 (python-nav-forward-block (- arg)))
1301
1302(defun python-nav-forward-block (&optional arg)
1303 "Move forward to next block of code.
1304With ARG, repeat. With negative argument, move ARG times
1305backward to previous block."
1306 (interactive "^p")
1307 (or arg (setq arg 1))
1308 (let ((block-start-regexp
1309 (python-rx line-start (* whitespace) block-start))
1310 (starting-pos (point)))
1311 (while (> arg 0)
bcdc27d7 1312 (python-nav-end-of-statement)
032d23ab
FEG
1313 (while (and
1314 (re-search-forward block-start-regexp nil t)
2d79ec42 1315 (python-syntax-context-type)))
032d23ab
FEG
1316 (setq arg (1- arg)))
1317 (while (< arg 0)
bcdc27d7 1318 (python-nav-beginning-of-statement)
032d23ab
FEG
1319 (while (and
1320 (re-search-backward block-start-regexp nil t)
2d79ec42 1321 (python-syntax-context-type)))
032d23ab 1322 (setq arg (1+ arg)))
bcdc27d7 1323 (python-nav-beginning-of-statement)
032d23ab
FEG
1324 (if (not (looking-at (python-rx block-start)))
1325 (and (goto-char starting-pos) nil)
1326 (and (not (= (point) starting-pos)) (point-marker)))))
1327
489af14f
FEG
1328(defun python-nav-lisp-forward-sexp-safe (&optional arg)
1329 "Safe version of standard `forward-sexp'.
1330When ARG > 0 move forward, else if ARG is < 0."
1331 (or arg (setq arg 1))
50620051 1332 (let ((forward-sexp-function)
489af14f
FEG
1333 (paren-regexp
1334 (if (> arg 0) (python-rx close-paren) (python-rx open-paren)))
1335 (search-fn
1336 (if (> arg 0) #'re-search-forward #'re-search-backward)))
1337 (condition-case nil
1338 (forward-sexp arg)
1339 (error
1340 (while (and (funcall search-fn paren-regexp nil t)
1341 (python-syntax-context 'paren)))))))
1342
8dbce54c
FEG
1343(defun python-nav--forward-sexp (&optional dir)
1344 "Move to forward sexp.
1345With positive Optional argument DIR direction move forward, else
1346backwards."
1347 (setq dir (or dir 1))
1348 (unless (= dir 0)
1349 (let* ((forward-p (if (> dir 0)
1350 (and (setq dir 1) t)
1351 (and (setq dir -1) nil)))
1352 (re-search-fn (if forward-p
1353 're-search-forward
1354 're-search-backward))
1355 (context-type (python-syntax-context-type)))
1356 (cond
ea5f4192 1357 ((memq context-type '(string comment))
8dbce54c 1358 ;; Inside of a string, get out of it.
ea5f4192
FEG
1359 (let ((forward-sexp-function))
1360 (forward-sexp dir)))
8dbce54c
FEG
1361 ((or (eq context-type 'paren)
1362 (and forward-p (looking-at (python-rx open-paren)))
1363 (and (not forward-p)
1364 (eq (syntax-class (syntax-after (1- (point))))
1365 (car (string-to-syntax ")")))))
1366 ;; Inside a paren or looking at it, lisp knows what to do.
1367 (python-nav-lisp-forward-sexp-safe dir))
1368 (t
1369 ;; This part handles the lispy feel of
1370 ;; `python-nav-forward-sexp'. Knowing everything about the
1371 ;; current context and the context of the next sexp tries to
1372 ;; follow the lisp sexp motion commands in a symmetric manner.
1373 (let* ((context
1374 (cond
1375 ((python-info-beginning-of-block-p) 'block-start)
1376 ((python-info-end-of-block-p) 'block-end)
1377 ((python-info-beginning-of-statement-p) 'statement-start)
1378 ((python-info-end-of-statement-p) 'statement-end)))
1379 (next-sexp-pos
1380 (save-excursion
1381 (python-nav-lisp-forward-sexp-safe dir)
1382 (point)))
ea5f4192
FEG
1383 (next-sexp-context
1384 (save-excursion
1385 (goto-char next-sexp-pos)
1386 (cond
1387 ((python-info-beginning-of-block-p) 'block-start)
1388 ((python-info-end-of-block-p) 'block-end)
1389 ((python-info-beginning-of-statement-p) 'statement-start)
1390 ((python-info-end-of-statement-p) 'statement-end)
1391 ((python-info-statement-starts-block-p) 'starts-block)
1392 ((python-info-statement-ends-block-p) 'ends-block)))))
8dbce54c
FEG
1393 (if forward-p
1394 (cond ((and (not (eobp))
1395 (python-info-current-line-empty-p))
1396 (python-util-forward-comment dir)
1397 (python-nav--forward-sexp dir))
1398 ((eq context 'block-start)
1399 (python-nav-end-of-block))
1400 ((eq context 'statement-start)
1401 (python-nav-end-of-statement))
1402 ((and (memq context '(statement-end block-end))
1403 (eq next-sexp-context 'ends-block))
1404 (goto-char next-sexp-pos)
1405 (python-nav-end-of-block))
1406 ((and (memq context '(statement-end block-end))
1407 (eq next-sexp-context 'starts-block))
1408 (goto-char next-sexp-pos)
1409 (python-nav-end-of-block))
1410 ((memq context '(statement-end block-end))
1411 (goto-char next-sexp-pos)
1412 (python-nav-end-of-statement))
1413 (t (goto-char next-sexp-pos)))
1414 (cond ((and (not (bobp))
1415 (python-info-current-line-empty-p))
ea5f4192
FEG
1416 (python-util-forward-comment dir)
1417 (python-nav--forward-sexp dir))
8dbce54c
FEG
1418 ((eq context 'block-end)
1419 (python-nav-beginning-of-block))
1420 ((eq context 'statement-end)
1421 (python-nav-beginning-of-statement))
1422 ((and (memq context '(statement-start block-start))
1423 (eq next-sexp-context 'starts-block))
1424 (goto-char next-sexp-pos)
1425 (python-nav-beginning-of-block))
1426 ((and (memq context '(statement-start block-start))
1427 (eq next-sexp-context 'ends-block))
1428 (goto-char next-sexp-pos)
1429 (python-nav-beginning-of-block))
1430 ((memq context '(statement-start block-start))
1431 (goto-char next-sexp-pos)
1432 (python-nav-beginning-of-statement))
1433 (t (goto-char next-sexp-pos))))))))))
489af14f
FEG
1434
1435(defun python-nav--backward-sexp ()
1436 "Move to backward sexp."
8dbce54c 1437 (python-nav--forward-sexp -1))
489af14f
FEG
1438
1439(defun python-nav-forward-sexp (&optional arg)
032d23ab
FEG
1440 "Move forward across one block of code.
1441With ARG, do it that many times. Negative arg -N means
1442move backward N times."
1443 (interactive "^p")
1444 (or arg (setq arg 1))
1445 (while (> arg 0)
489af14f
FEG
1446 (python-nav--forward-sexp)
1447 (setq arg (1- arg)))
032d23ab 1448 (while (< arg 0)
489af14f 1449 (python-nav--backward-sexp)
9fff1858
FEG
1450 (setq arg (1+ arg))))
1451
a4ff7fe1
FEG
1452(defun python-nav--up-list (&optional dir)
1453 "Internal implementation of `python-nav-up-list'.
1454DIR is always 1 or -1 and comes sanitized from
1455`python-nav-up-list' calls."
1456 (let ((context (python-syntax-context-type))
1457 (forward-p (> dir 0)))
1458 (cond
1459 ((memq context '(string comment)))
1460 ((eq context 'paren)
1461 (let ((forward-sexp-function))
1462 (up-list dir)))
1463 ((and forward-p (python-info-end-of-block-p))
1464 (let ((parent-end-pos
1465 (save-excursion
1466 (let ((indentation (and
1467 (python-nav-beginning-of-block)
1468 (current-indentation))))
1469 (while (and indentation
1470 (> indentation 0)
1471 (>= (current-indentation) indentation)
1472 (python-nav-backward-block)))
1473 (python-nav-end-of-block)))))
1474 (and (> (or parent-end-pos (point)) (point))
1475 (goto-char parent-end-pos))))
1476 (forward-p (python-nav-end-of-block))
1477 ((and (not forward-p)
1478 (> (current-indentation) 0)
1479 (python-info-beginning-of-block-p))
1480 (let ((prev-block-pos
1481 (save-excursion
1482 (let ((indentation (current-indentation)))
1483 (while (and (python-nav-backward-block)
55cd00c8 1484 (>= (current-indentation) indentation))))
a4ff7fe1
FEG
1485 (point))))
1486 (and (> (point) prev-block-pos)
1487 (goto-char prev-block-pos))))
1488 ((not forward-p) (python-nav-beginning-of-block)))))
1489
1490(defun python-nav-up-list (&optional arg)
1491 "Move forward out of one level of parentheses (or blocks).
1492With ARG, do this that many times.
1493A negative argument means move backward but still to a less deep spot.
1494This command assumes point is not in a string or comment."
1495 (interactive "^p")
1496 (or arg (setq arg 1))
1497 (while (> arg 0)
1498 (python-nav--up-list 1)
1499 (setq arg (1- arg)))
1500 (while (< arg 0)
1501 (python-nav--up-list -1)
1502 (setq arg (1+ arg))))
1503
1504(defun python-nav-backward-up-list (&optional arg)
1505 "Move backward out of one level of parentheses (or blocks).
1506With ARG, do this that many times.
1507A negative argument means move backward but still to a less deep spot.
1508This command assumes point is not in a string or comment."
1509 (interactive "^p")
1510 (or arg (setq arg 1))
1511 (python-nav-up-list (- arg)))
1512
45c138ac
FEG
1513\f
1514;;; Shell integration
1515
0f55249e
FEG
1516(defcustom python-shell-buffer-name "Python"
1517 "Default buffer name for Python interpreter."
1518 :type 'string
1519 :group 'python
1520 :safe 'stringp)
45c138ac
FEG
1521
1522(defcustom python-shell-interpreter "python"
1523 "Default Python interpreter for shell."
45c138ac 1524 :type 'string
c4b155cb 1525 :group 'python)
45c138ac 1526
0f55249e
FEG
1527(defcustom python-shell-internal-buffer-name "Python Internal"
1528 "Default buffer name for the Internal Python interpreter."
1529 :type 'string
1530 :group 'python
1531 :safe 'stringp)
1fe1b5aa 1532
45c138ac
FEG
1533(defcustom python-shell-interpreter-args "-i"
1534 "Default arguments for the Python interpreter."
45c138ac 1535 :type 'string
c4b155cb 1536 :group 'python)
45c138ac
FEG
1537
1538(defcustom python-shell-prompt-regexp ">>> "
e2d8d479
FEG
1539 "Regular Expression matching top\-level input prompt of python shell.
1540It should not contain a caret (^) at the beginning."
45c138ac
FEG
1541 :type 'string
1542 :group 'python
1543 :safe 'stringp)
1544
1545(defcustom python-shell-prompt-block-regexp "[.][.][.] "
e2d8d479
FEG
1546 "Regular Expression matching block input prompt of python shell.
1547It should not contain a caret (^) at the beginning."
45c138ac
FEG
1548 :type 'string
1549 :group 'python
1550 :safe 'stringp)
1551
0f55249e 1552(defcustom python-shell-prompt-output-regexp ""
e2d8d479
FEG
1553 "Regular Expression matching output prompt of python shell.
1554It should not contain a caret (^) at the beginning."
62feb915
FEG
1555 :type 'string
1556 :group 'python
1557 :safe 'stringp)
1558
45c138ac 1559(defcustom python-shell-prompt-pdb-regexp "[(<]*[Ii]?[Pp]db[>)]+ "
e2d8d479
FEG
1560 "Regular Expression matching pdb input prompt of python shell.
1561It should not contain a caret (^) at the beginning."
45c138ac
FEG
1562 :type 'string
1563 :group 'python
1564 :safe 'stringp)
1565
a7a6d8ff 1566(defcustom python-shell-enable-font-lock t
b4b661d8
DD
1567 "Should syntax highlighting be enabled in the python shell buffer?
1568Restart the python shell after changing this variable for it to take effect."
1569 :type 'boolean
1570 :group 'python
1571 :safe 'booleanp)
1572
66bbb27f 1573(defcustom python-shell-process-environment nil
307bd2e8
FEG
1574 "List of environment variables for Python shell.
1575This variable follows the same rules as `process-environment'
66bbb27f
FEG
1576since it merges with it before the process creation routines are
1577called. When this variable is nil, the Python shell is run with
307bd2e8 1578the default `process-environment'."
66bbb27f
FEG
1579 :type '(repeat string)
1580 :group 'python
1581 :safe 'listp)
1582
929036b4
FEG
1583(defcustom python-shell-extra-pythonpaths nil
1584 "List of extra pythonpaths for Python shell.
1585The values of this variable are added to the existing value of
1586PYTHONPATH in the `process-environment' variable."
1587 :type '(repeat string)
1588 :group 'python
1589 :safe 'listp)
1590
66bbb27f
FEG
1591(defcustom python-shell-exec-path nil
1592 "List of path to search for binaries.
1593This variable follows the same rules as `exec-path' since it
1594merges with it before the process creation routines are called.
1595When this variable is nil, the Python shell is run with the
1596default `exec-path'."
1597 :type '(repeat string)
1598 :group 'python
1599 :safe 'listp)
1600
64348c32
FEG
1601(defcustom python-shell-virtualenv-path nil
1602 "Path to virtualenv root.
1603This variable, when set to a string, makes the values stored in
1604`python-shell-process-environment' and `python-shell-exec-path'
1605to be modified properly so shells are started with the specified
1606virtualenv."
1607 :type 'string
1608 :group 'python
1609 :safe 'stringp)
1610
c0428ba0
FEG
1611(defcustom python-shell-setup-codes '(python-shell-completion-setup-code
1612 python-ffap-setup-code
1613 python-eldoc-setup-code)
279c9272 1614 "List of code run by `python-shell-send-setup-codes'."
c0428ba0
FEG
1615 :type '(repeat symbol)
1616 :group 'python
1617 :safe 'listp)
1618
45c138ac
FEG
1619(defcustom python-shell-compilation-regexp-alist
1620 `((,(rx line-start (1+ (any " \t")) "File \""
6cad4c6e
FEG
1621 (group (1+ (not (any "\"<")))) ; avoid `<stdin>' &c
1622 "\", line " (group (1+ digit)))
45c138ac
FEG
1623 1 2)
1624 (,(rx " in file " (group (1+ not-newline)) " on line "
6cad4c6e 1625 (group (1+ digit)))
45c138ac
FEG
1626 1 2)
1627 (,(rx line-start "> " (group (1+ (not (any "(\"<"))))
6cad4c6e 1628 "(" (group (1+ digit)) ")" (1+ (not (any "("))) "()")
45c138ac
FEG
1629 1 2))
1630 "`compilation-error-regexp-alist' for inferior Python."
1631 :type '(alist string)
1632 :group 'python)
1633
1634(defun python-shell-get-process-name (dedicated)
e37a4551 1635 "Calculate the appropriate process name for inferior Python process.
45c138ac
FEG
1636If DEDICATED is t and the variable `buffer-file-name' is non-nil
1637returns a string with the form
1638`python-shell-buffer-name'[variable `buffer-file-name'] else
1530c98e 1639returns the value of `python-shell-buffer-name'."
45c138ac
FEG
1640 (let ((process-name
1641 (if (and dedicated
1642 buffer-file-name)
1643 (format "%s[%s]" python-shell-buffer-name buffer-file-name)
1644 (format "%s" python-shell-buffer-name))))
45c138ac
FEG
1645 process-name))
1646
1fe1b5aa 1647(defun python-shell-internal-get-process-name ()
e37a4551 1648 "Calculate the appropriate process name for Internal Python process.
1fe1b5aa
FEG
1649The name is calculated from `python-shell-global-buffer-name' and
1650a hash of all relevant global shell settings in order to ensure
1651uniqueness for different types of configurations."
1652 (format "%s [%s]"
1653 python-shell-internal-buffer-name
1654 (md5
1655 (concat
1656 (python-shell-parse-command)
279c9272
FEG
1657 python-shell-prompt-regexp
1658 python-shell-prompt-block-regexp
1659 python-shell-prompt-output-regexp
1fe1b5aa 1660 (mapconcat #'symbol-value python-shell-setup-codes "")
2bdce388
FEG
1661 (mapconcat #'identity python-shell-process-environment "")
1662 (mapconcat #'identity python-shell-extra-pythonpaths "")
1663 (mapconcat #'identity python-shell-exec-path "")
64348c32 1664 (or python-shell-virtualenv-path "")
2bdce388 1665 (mapconcat #'identity python-shell-exec-path "")))))
1fe1b5aa 1666
45c138ac 1667(defun python-shell-parse-command ()
e2d8d479 1668 "Calculate the string used to execute the inferior Python process."
e4497086
FEG
1669 (let ((process-environment (python-shell-calculate-process-environment))
1670 (exec-path (python-shell-calculate-exec-path)))
1671 (format "%s %s"
1672 (executable-find python-shell-interpreter)
1673 python-shell-interpreter-args)))
45c138ac 1674
307bd2e8
FEG
1675(defun python-shell-calculate-process-environment ()
1676 "Calculate process environment given `python-shell-virtualenv-path'."
40417cb3
FEG
1677 (let ((process-environment (append
1678 python-shell-process-environment
1679 process-environment nil))
64348c32
FEG
1680 (virtualenv (if python-shell-virtualenv-path
1681 (directory-file-name python-shell-virtualenv-path)
1682 nil)))
929036b4
FEG
1683 (when python-shell-extra-pythonpaths
1684 (setenv "PYTHONPATH"
1685 (format "%s%s%s"
1686 (mapconcat 'identity
1687 python-shell-extra-pythonpaths
1688 path-separator)
1689 path-separator
1690 (or (getenv "PYTHONPATH") ""))))
64348c32 1691 (if (not virtualenv)
40417cb3
FEG
1692 process-environment
1693 (setenv "PYTHONHOME" nil)
1694 (setenv "PATH" (format "%s/bin%s%s"
929036b4
FEG
1695 virtualenv path-separator
1696 (or (getenv "PATH") "")))
40417cb3
FEG
1697 (setenv "VIRTUAL_ENV" virtualenv))
1698 process-environment))
64348c32
FEG
1699
1700(defun python-shell-calculate-exec-path ()
1701 "Calculate exec path given `python-shell-virtualenv-path'."
40417cb3
FEG
1702 (let ((path (append python-shell-exec-path
1703 exec-path nil)))
64348c32
FEG
1704 (if (not python-shell-virtualenv-path)
1705 path
1706 (cons (format "%s/bin"
1707 (directory-file-name python-shell-virtualenv-path))
1708 path))))
1709
45c138ac
FEG
1710(defun python-comint-output-filter-function (output)
1711 "Hook run after content is put into comint buffer.
1712OUTPUT is a string with the contents of the buffer."
1713 (ansi-color-filter-apply output))
1714
f27c99dc
FEG
1715(defvar python-shell--parent-buffer nil)
1716
a5b773c4
FEG
1717(defvar python-shell-output-syntax-table
1718 (let ((table (make-syntax-table python-dotty-syntax-table)))
1719 (modify-syntax-entry ?\' "." table)
1720 (modify-syntax-entry ?\" "." table)
1721 (modify-syntax-entry ?\( "." table)
1722 (modify-syntax-entry ?\[ "." table)
1723 (modify-syntax-entry ?\{ "." table)
1724 (modify-syntax-entry ?\) "." table)
1725 (modify-syntax-entry ?\] "." table)
1726 (modify-syntax-entry ?\} "." table)
1727 table)
1728 "Syntax table for shell output.
1729It makes parens and quotes be treated as punctuation chars.")
1730
45c138ac 1731(define-derived-mode inferior-python-mode comint-mode "Inferior Python"
62feb915 1732 "Major mode for Python inferior process.
e2d8d479
FEG
1733Runs a Python interpreter as a subprocess of Emacs, with Python
1734I/O through an Emacs buffer. Variables
1735`python-shell-interpreter' and `python-shell-interpreter-args'
1736controls which Python interpreter is run. Variables
1737`python-shell-prompt-regexp',
1738`python-shell-prompt-output-regexp',
1739`python-shell-prompt-block-regexp',
a7a6d8ff 1740`python-shell-enable-font-lock',
e2d8d479 1741`python-shell-completion-setup-code',
9399498e 1742`python-shell-completion-string-code',
f6b59cd1 1743`python-shell-completion-module-string-code',
9399498e
FEG
1744`python-eldoc-setup-code', `python-eldoc-string-code',
1745`python-ffap-setup-code' and `python-ffap-string-code' can
1746customize this mode for different Python interpreters.
e2d8d479
FEG
1747
1748You can also add additional setup code to be run at
1749initialization of the interpreter via `python-shell-setup-codes'
1750variable.
1751
1752\(Type \\[describe-mode] in the process buffer for a list of commands.)"
f27c99dc
FEG
1753 (and python-shell--parent-buffer
1754 (python-util-clone-local-variables python-shell--parent-buffer))
1755 (setq comint-prompt-regexp (format "^\\(?:%s\\|%s\\|%s\\)"
1756 python-shell-prompt-regexp
1757 python-shell-prompt-block-regexp
1758 python-shell-prompt-pdb-regexp))
45c138ac 1759 (setq mode-line-process '(":%s"))
45c138ac
FEG
1760 (make-local-variable 'comint-output-filter-functions)
1761 (add-hook 'comint-output-filter-functions
1762 'python-comint-output-filter-function)
1763 (add-hook 'comint-output-filter-functions
1764 'python-pdbtrack-comint-output-filter-function)
1765 (set (make-local-variable 'compilation-error-regexp-alist)
1766 python-shell-compilation-regexp-alist)
ed0eb594
FEG
1767 (define-key inferior-python-mode-map [remap complete-symbol]
1768 'completion-at-point)
1769 (add-hook 'completion-at-point-functions
1770 'python-shell-completion-complete-at-point nil 'local)
62feb915
FEG
1771 (add-to-list (make-local-variable 'comint-dynamic-complete-functions)
1772 'python-shell-completion-complete-at-point)
aa81af71 1773 (define-key inferior-python-mode-map "\t"
62feb915 1774 'python-shell-completion-complete-or-indent)
e0cc4efa
FEG
1775 (make-local-variable 'python-pdbtrack-buffers-to-kill)
1776 (make-local-variable 'python-pdbtrack-tracked-buffer)
1777 (make-local-variable 'python-shell-internal-last-output)
a7a6d8ff 1778 (when python-shell-enable-font-lock
a5b773c4 1779 (set-syntax-table python-mode-syntax-table)
aeadd9a4
FEG
1780 (set (make-local-variable 'font-lock-defaults)
1781 '(python-font-lock-keywords nil nil nil nil))
1782 (set (make-local-variable 'syntax-propertize-function)
12fd5ee1
FEG
1783 (eval
1784 ;; XXX: Unfortunately eval is needed here to make use of the
1785 ;; dynamic value of `comint-prompt-regexp'.
1786 `(syntax-propertize-rules
1787 (,comint-prompt-regexp
1788 (0 (ignore
1789 (put-text-property
1790 comint-last-input-start end 'syntax-table
1791 python-shell-output-syntax-table)
1792 ;; XXX: This might look weird, but it is the easiest
1793 ;; way to ensure font lock gets cleaned up before the
1794 ;; current prompt, which is needed for unclosed
1795 ;; strings to not mess up with current input.
1796 (font-lock-unfontify-region comint-last-input-start end))))
1797 (,(python-rx string-delimiter)
1798 (0 (ignore
1799 (and (not (eq (get-text-property start 'field) 'output))
1800 (python-syntax-stringify)))))))))
45c138ac
FEG
1801 (compilation-shell-minor-mode 1))
1802
ba7b0154 1803(defun python-shell-make-comint (cmd proc-name &optional pop internal)
77afb61a 1804 "Create a python shell comint buffer.
96eeb83a 1805CMD is the python command to be executed and PROC-NAME is the
77afb61a 1806process name the comint buffer will get. After the comint buffer
ba7b0154
FEG
1807is created the `inferior-python-mode' is activated. When
1808optional argument POP is non-nil the buffer is shown. When
1809optional argument INTERNAL is non-nil this process is run on a
1810buffer with a name that starts with a space, following the Emacs
1811convention for temporary/internal buffers, and also makes sure
1812the user is not queried for confirmation when the process is
1813killed."
77afb61a 1814 (save-excursion
ba7b0154
FEG
1815 (let* ((proc-buffer-name
1816 (format (if (not internal) "*%s*" " *%s*") proc-name))
307bd2e8 1817 (process-environment (python-shell-calculate-process-environment))
77afb61a
FEG
1818 (exec-path (python-shell-calculate-exec-path)))
1819 (when (not (comint-check-proc proc-buffer-name))
96eeb83a 1820 (let* ((cmdlist (split-string-and-unquote cmd))
ba7b0154
FEG
1821 (buffer (apply #'make-comint-in-buffer proc-name proc-buffer-name
1822 (car cmdlist) nil (cdr cmdlist)))
f27c99dc 1823 (python-shell--parent-buffer (current-buffer))
ba7b0154 1824 (process (get-buffer-process buffer)))
96eeb83a 1825 (with-current-buffer buffer
f27c99dc 1826 (inferior-python-mode))
ba7b0154
FEG
1827 (accept-process-output process)
1828 (and pop (pop-to-buffer buffer t))
1829 (and internal (set-process-query-on-exit-flag process nil))))
a0686d71 1830 proc-buffer-name)))
77afb61a 1831
a90dfb95
FEG
1832;;;###autoload
1833(defun run-python (cmd &optional dedicated show)
45c138ac 1834 "Run an inferior Python process.
e2d8d479
FEG
1835Input and output via buffer named after
1836`python-shell-buffer-name'. If there is a process already
1837running in that buffer, just switch to it.
a90dfb95
FEG
1838
1839With argument, allows you to define CMD so you can edit the
1840command used to call the interpreter and define DEDICATED, so a
1841dedicated process for the current buffer is open. When numeric
1842prefix arg is other than 0 or 4 do not SHOW.
1843
1844Runs the hook `inferior-python-mode-hook' (after the
1845`comint-mode-hook' is run). \(Type \\[describe-mode] in the
1846process buffer for a list of commands.)"
45c138ac
FEG
1847 (interactive
1848 (if current-prefix-arg
1849 (list
a90dfb95 1850 (read-string "Run Python: " (python-shell-parse-command))
45c138ac 1851 (y-or-n-p "Make dedicated process? ")
a90dfb95
FEG
1852 (= (prefix-numeric-value current-prefix-arg) 4))
1853 (list (python-shell-parse-command) nil t)))
1854 (python-shell-make-comint
1855 cmd (python-shell-get-process-name dedicated) show)
45c138ac
FEG
1856 dedicated)
1857
1fe1b5aa
FEG
1858(defun run-python-internal ()
1859 "Run an inferior Internal Python process.
1860Input and output via buffer named after
1861`python-shell-internal-buffer-name' and what
0d49da68
FEG
1862`python-shell-internal-get-process-name' returns.
1863
1864This new kind of shell is intended to be used for generic
1865communication related to defined configurations, the main
1866difference with global or dedicated shells is that these ones are
1867attached to a configuration, not a buffer. This means that can
1868be used for example to retrieve the sys.path and other stuff,
1869without messing with user shells. Note that
1870`python-shell-enable-font-lock' and `inferior-python-mode-hook'
1871are set to nil for these shells, so setup codes are not sent at
1872startup."
1873 (let ((python-shell-enable-font-lock nil)
1874 (inferior-python-mode-hook nil))
ba7b0154
FEG
1875 (get-buffer-process
1876 (python-shell-make-comint
1877 (python-shell-parse-command)
1878 (python-shell-internal-get-process-name) nil t))))
1fe1b5aa 1879
45c138ac
FEG
1880(defun python-shell-get-process ()
1881 "Get inferior Python process for current buffer and return it."
1882 (let* ((dedicated-proc-name (python-shell-get-process-name t))
1883 (dedicated-proc-buffer-name (format "*%s*" dedicated-proc-name))
1884 (global-proc-name (python-shell-get-process-name nil))
1885 (global-proc-buffer-name (format "*%s*" global-proc-name))
1886 (dedicated-running (comint-check-proc dedicated-proc-buffer-name))
1887 (global-running (comint-check-proc global-proc-buffer-name)))
1888 ;; Always prefer dedicated
1889 (get-buffer-process (or (and dedicated-running dedicated-proc-buffer-name)
1890 (and global-running global-proc-buffer-name)))))
1891
1892(defun python-shell-get-or-create-process ()
1893 "Get or create an inferior Python process for current buffer and return it."
035c45e3 1894 (let* ((dedicated-proc-name (python-shell-get-process-name t))
45c138ac
FEG
1895 (dedicated-proc-buffer-name (format "*%s*" dedicated-proc-name))
1896 (global-proc-name (python-shell-get-process-name nil))
1897 (global-proc-buffer-name (format "*%s*" global-proc-name))
1898 (dedicated-running (comint-check-proc dedicated-proc-buffer-name))
1899 (global-running (comint-check-proc global-proc-buffer-name))
a90dfb95 1900 (current-prefix-arg 16))
45c138ac
FEG
1901 (when (and (not dedicated-running) (not global-running))
1902 (if (call-interactively 'run-python)
1903 (setq dedicated-running t)
1904 (setq global-running t)))
1905 ;; Always prefer dedicated
1906 (get-buffer-process (if dedicated-running
1907 dedicated-proc-buffer-name
1908 global-proc-buffer-name))))
1909
722c985b
FEG
1910(defvar python-shell-internal-buffer nil
1911 "Current internal shell buffer for the current buffer.
1912This is really not necessary at all for the code to work but it's
1913there for compatibility with CEDET.")
722c985b 1914
0d49da68
FEG
1915(defvar python-shell-internal-last-output nil
1916 "Last output captured by the internal shell.
1917This is really not necessary at all for the code to work but it's
1918there for compatibility with CEDET.")
0d49da68 1919
1fe1b5aa
FEG
1920(defun python-shell-internal-get-or-create-process ()
1921 "Get or create an inferior Internal Python process."
1922 (let* ((proc-name (python-shell-internal-get-process-name))
ba7b0154 1923 (proc-buffer-name (format " *%s*" proc-name)))
0d49da68
FEG
1924 (when (not (process-live-p proc-name))
1925 (run-python-internal)
1926 (setq python-shell-internal-buffer proc-buffer-name)
1927 ;; XXX: Why is this `sit-for' needed?
1928 ;; `python-shell-make-comint' calls `accept-process-output'
1929 ;; already but it is not helping to get proper output on
1930 ;; 'gnu/linux when the internal shell process is not running and
1931 ;; a call to `python-shell-internal-send-string' is issued.
1932 (sit-for 0.1 t))
1fe1b5aa
FEG
1933 (get-buffer-process proc-buffer-name)))
1934
722c985b 1935(define-obsolete-function-alias
2a1e2476 1936 'python-proc 'python-shell-internal-get-or-create-process "24.3")
722c985b
FEG
1937
1938(define-obsolete-variable-alias
2a1e2476 1939 'python-buffer 'python-shell-internal-buffer "24.3")
722c985b 1940
0d49da68 1941(define-obsolete-variable-alias
2a1e2476 1942 'python-preoutput-result 'python-shell-internal-last-output "24.3")
0d49da68 1943
9ce938be
FEG
1944(defun python-shell-send-string (string &optional process msg)
1945 "Send STRING to inferior Python PROCESS.
1946When MSG is non-nil messages the first line of STRING."
45c138ac 1947 (interactive "sPython command: ")
9ce938be
FEG
1948 (let ((process (or process (python-shell-get-or-create-process)))
1949 (lines (split-string string "\n" t)))
925411b4 1950 (and msg (message "Sent: %s..." (nth 0 lines)))
9ce938be 1951 (if (> (length lines) 1)
9dd40b00
MM
1952 (let* ((temporary-file-directory
1953 (if (file-remote-p default-directory)
1954 (concat (file-remote-p default-directory) "/tmp")
1955 temporary-file-directory))
1956 (temp-file-name (make-temp-file "py"))
9ce938be
FEG
1957 (file-name (or (buffer-file-name) temp-file-name)))
1958 (with-temp-file temp-file-name
1959 (insert string)
1960 (delete-trailing-whitespace))
1961 (python-shell-send-file file-name process temp-file-name))
1962 (comint-send-string process string)
1963 (when (or (not (string-match "\n$" string))
1964 (string-match "\n[ \t].*\n?$" string))
1965 (comint-send-string process "\n")))))
1966
08f18c3d
FEG
1967(defvar python-shell-output-filter-in-progress nil)
1968(defvar python-shell-output-filter-buffer nil)
1969
1970(defun python-shell-output-filter (string)
1971 "Filter used in `python-shell-send-string-no-output' to grab output.
1972STRING is the output received to this point from the process.
1973This filter saves received output from the process in
1974`python-shell-output-filter-buffer' and stops receiving it after
1975detecting a prompt at the end of the buffer."
1976 (setq
1977 string (ansi-color-filter-apply string)
1978 python-shell-output-filter-buffer
1979 (concat python-shell-output-filter-buffer string))
1980 (when (string-match
51867ae2
FEG
1981 ;; XXX: It seems on OSX an extra carriage return is attached
1982 ;; at the end of output, this handles that too.
1983 (format "\r?\n\\(?:%s\\|%s\\|%s\\)$"
08f18c3d
FEG
1984 python-shell-prompt-regexp
1985 python-shell-prompt-block-regexp
1986 python-shell-prompt-pdb-regexp)
1987 python-shell-output-filter-buffer)
1988 ;; Output ends when `python-shell-output-filter-buffer' contains
1989 ;; the prompt attached at the end of it.
1990 (setq python-shell-output-filter-in-progress nil
1991 python-shell-output-filter-buffer
1992 (substring python-shell-output-filter-buffer
1993 0 (match-beginning 0)))
1994 (when (and (> (length python-shell-prompt-output-regexp) 0)
1995 (string-match (concat "^" python-shell-prompt-output-regexp)
1996 python-shell-output-filter-buffer))
1997 ;; Some shells, like iPython might append a prompt before the
1998 ;; output, clean that.
1999 (setq python-shell-output-filter-buffer
2000 (substring python-shell-output-filter-buffer (match-end 0)))))
2001 "")
0478776b 2002
9ce938be
FEG
2003(defun python-shell-send-string-no-output (string &optional process msg)
2004 "Send STRING to PROCESS and inhibit output.
e2d8d479
FEG
2005When MSG is non-nil messages the first line of STRING. Return
2006the output."
0478776b
FEG
2007 (let ((process (or process (python-shell-get-or-create-process)))
2008 (comint-preoutput-filter-functions
08f18c3d
FEG
2009 '(python-shell-output-filter))
2010 (python-shell-output-filter-in-progress t)
0478776b 2011 (inhibit-quit t))
191da00e
FEG
2012 (or
2013 (with-local-quit
2014 (python-shell-send-string string process msg)
08f18c3d
FEG
2015 (while python-shell-output-filter-in-progress
2016 ;; `python-shell-output-filter' takes care of setting
2017 ;; `python-shell-output-filter-in-progress' to NIL after it
2018 ;; detects end of output.
0478776b
FEG
2019 (accept-process-output process))
2020 (prog1
08f18c3d
FEG
2021 python-shell-output-filter-buffer
2022 (setq python-shell-output-filter-buffer nil)))
191da00e
FEG
2023 (with-current-buffer (process-buffer process)
2024 (comint-interrupt-subjob)))))
45c138ac 2025
1fe1b5aa
FEG
2026(defun python-shell-internal-send-string (string)
2027 "Send STRING to the Internal Python interpreter.
2028Returns the output. See `python-shell-send-string-no-output'."
0d49da68
FEG
2029 ;; XXX Remove `python-shell-internal-last-output' once CEDET is
2030 ;; updated to support this new mode.
2031 (setq python-shell-internal-last-output
2032 (python-shell-send-string-no-output
2033 ;; Makes this function compatible with the old
2034 ;; python-send-receive. (At least for CEDET).
2035 (replace-regexp-in-string "_emacs_out +" "" string)
2036 (python-shell-internal-get-or-create-process) nil)))
1fe1b5aa
FEG
2037
2038(define-obsolete-function-alias
2a1e2476 2039 'python-send-receive 'python-shell-internal-send-string "24.3")
722c985b
FEG
2040
2041(define-obsolete-function-alias
2a1e2476 2042 'python-send-string 'python-shell-internal-send-string "24.3")
1fe1b5aa 2043
45c138ac
FEG
2044(defun python-shell-send-region (start end)
2045 "Send the region delimited by START and END to inferior Python process."
2046 (interactive "r")
16768034
FEG
2047 (python-shell-send-string
2048 (concat
2049 (let ((line-num (line-number-at-pos start)))
2050 ;; When sending a region, add blank lines for non sent code so
2051 ;; backtraces remain correct.
2052 (make-string (1- line-num) ?\n))
2053 (buffer-substring start end))
2054 nil t))
45c138ac 2055
6da55e59
DD
2056(defun python-shell-send-buffer (&optional arg)
2057 "Send the entire buffer to inferior Python process.
dc4f818b
FEG
2058With prefix ARG allow execution of code inside blocks delimited
2059by \"if __name__== '__main__':\""
6da55e59 2060 (interactive "P")
45c138ac
FEG
2061 (save-restriction
2062 (widen)
dc4f818b
FEG
2063 (let ((str (buffer-substring (point-min) (point-max))))
2064 (and
2065 (not arg)
2066 (setq str (replace-regexp-in-string
2067 (python-rx if-name-main)
2068 "if __name__ == '__main__ ':" str)))
2069 (python-shell-send-string str))))
45c138ac
FEG
2070
2071(defun python-shell-send-defun (arg)
2ed294c5 2072 "Send the current defun to inferior Python process.
8c6f9e60 2073When argument ARG is non-nil do not include decorators."
45c138ac
FEG
2074 (interactive "P")
2075 (save-excursion
2ed294c5
FEG
2076 (python-shell-send-region
2077 (progn
8c6f9e60 2078 (end-of-line 1)
2e6625b5 2079 (while (and (or (python-nav-beginning-of-defun)
8c6f9e60
FEG
2080 (beginning-of-line 1))
2081 (> (current-indentation) 0)))
2082 (when (not arg)
2083 (while (and (forward-line -1)
2084 (looking-at (python-rx decorator))))
2085 (forward-line 1))
1dae378f 2086 (point-marker))
2ed294c5 2087 (progn
2e6625b5 2088 (or (python-nav-end-of-defun)
8c6f9e60 2089 (end-of-line 1))
1dae378f 2090 (point-marker)))))
45c138ac 2091
d439cda5
FEG
2092(defun python-shell-send-file (file-name &optional process temp-file-name)
2093 "Send FILE-NAME to inferior Python PROCESS.
2094If TEMP-FILE-NAME is passed then that file is used for processing
2095instead, while internally the shell will continue to use
2096FILE-NAME."
45c138ac 2097 (interactive "fFile to send: ")
9ce938be
FEG
2098 (let* ((process (or process (python-shell-get-or-create-process)))
2099 (temp-file-name (when temp-file-name
9dd40b00
MM
2100 (expand-file-name
2101 (or (file-remote-p temp-file-name 'localname)
2102 temp-file-name))))
2103 (file-name (or (when file-name
2104 (expand-file-name
2105 (or (file-remote-p file-name 'localname)
2106 file-name)))
2107 temp-file-name)))
9ce938be
FEG
2108 (when (not file-name)
2109 (error "If FILE-NAME is nil then TEMP-FILE-NAME must be non-nil"))
13d914ed 2110 (python-shell-send-string
b962ebad 2111 (format
d439cda5
FEG
2112 (concat "__pyfile = open('''%s''');"
2113 "exec(compile(__pyfile.read(), '''%s''', 'exec'));"
2114 "__pyfile.close()")
2115 (or temp-file-name file-name) file-name)
13d914ed 2116 process)))
45c138ac
FEG
2117
2118(defun python-shell-switch-to-shell ()
2119 "Switch to inferior Python process buffer."
2120 (interactive)
2121 (pop-to-buffer (process-buffer (python-shell-get-or-create-process)) t))
2122
c0428ba0
FEG
2123(defun python-shell-send-setup-code ()
2124 "Send all setup code for shell.
2125This function takes the list of setup code to send from the
2126`python-shell-setup-codes' list."
925411b4 2127 (let ((process (get-buffer-process (current-buffer))))
c0428ba0
FEG
2128 (dolist (code python-shell-setup-codes)
2129 (when code
925411b4 2130 (message "Sent %s" code)
a1ea6ab8 2131 (python-shell-send-string
c0428ba0
FEG
2132 (symbol-value code) process)))))
2133
2134(add-hook 'inferior-python-mode-hook
2135 #'python-shell-send-setup-code)
2136
45c138ac
FEG
2137\f
2138;;; Shell completion
2139
0f55249e 2140(defcustom python-shell-completion-setup-code
45c138ac
FEG
2141 "try:
2142 import readline
2143except ImportError:
2144 def __COMPLETER_all_completions(text): []
2145else:
2146 import rlcompleter
2147 readline.set_completer(rlcompleter.Completer().complete)
2148 def __COMPLETER_all_completions(text):
2149 import sys
2150 completions = []
2151 try:
2152 i = 0
2153 while True:
2154 res = readline.get_completer()(text, i)
2155 if not res: break
2156 i += 1
2157 completions.append(res)
2158 except NameError:
2159 pass
2160 return completions"
0f55249e
FEG
2161 "Code used to setup completion in inferior Python processes."
2162 :type 'string
c4b155cb 2163 :group 'python)
45c138ac 2164
0f55249e 2165(defcustom python-shell-completion-string-code
45c138ac 2166 "';'.join(__COMPLETER_all_completions('''%s'''))\n"
0f55249e
FEG
2167 "Python code used to get a string of completions separated by semicolons."
2168 :type 'string
c4b155cb 2169 :group 'python)
45c138ac 2170
f6b59cd1 2171(defcustom python-shell-completion-module-string-code ""
8386d830 2172 "Python code used to get completions separated by semicolons for imports.
9253ea69
DD
2173
2174For IPython v0.11, add the following line to
2175`python-shell-completion-setup-code':
2176
2177from IPython.core.completerlib import module_completion
2178
2179and use the following as the value of this variable:
2180
2181';'.join(module_completion('''%s'''))\n"
2182 :type 'string
c4b155cb 2183 :group 'python)
9253ea69 2184
aa409935
FEG
2185(defcustom python-shell-completion-pdb-string-code
2186 "';'.join(globals().keys() + locals().keys())"
2187 "Python code used to get completions separated by semicolons for [i]pdb."
2188 :type 'string
c4b155cb 2189 :group 'python)
aa409935 2190
5beed586
FEG
2191(defun python-shell-completion-get-completions (process line input)
2192 "Do completion at point for PROCESS.
2193LINE is used to detect the context on how to complete given
2194INPUT."
2195 (let* ((prompt
2196 ;; Get the last prompt for the inferior process
2197 ;; buffer. This is used for the completion code selection
2198 ;; heuristic.
2199 (with-current-buffer (process-buffer process)
2200 (buffer-substring-no-properties
2201 (overlay-start comint-last-prompt-overlay)
2202 (overlay-end comint-last-prompt-overlay))))
2203 (completion-context
2204 ;; Check whether a prompt matches a pdb string, an import
2205 ;; statement or just the standard prompt and use the
2206 ;; correct python-shell-completion-*-code string
2207 (cond ((and (> (length python-shell-completion-pdb-string-code) 0)
2208 (string-match
2209 (concat "^" python-shell-prompt-pdb-regexp) prompt))
2210 'pdb)
2211 ((and (>
2212 (length python-shell-completion-module-string-code) 0)
2213 (string-match
2214 (concat "^" python-shell-prompt-regexp) prompt)
2215 (string-match "^[ \t]*\\(from\\|import\\)[ \t]" line))
2216 'import)
2217 ((string-match
2218 (concat "^" python-shell-prompt-regexp) prompt)
2219 'default)
2220 (t nil)))
2221 (completion-code
14146222
SM
2222 (pcase completion-context
2223 (`pdb python-shell-completion-pdb-string-code)
2224 (`import python-shell-completion-module-string-code)
2225 (`default python-shell-completion-string-code)
2226 (_ nil)))
5beed586
FEG
2227 (input
2228 (if (eq completion-context 'import)
2229 (replace-regexp-in-string "^[ \t]+" "" line)
2230 input)))
2231 (and completion-code
2232 (> (length input) 0)
2233 (with-current-buffer (process-buffer process)
2234 (let ((completions (python-shell-send-string-no-output
2235 (format completion-code input) process)))
2236 (and (> (length completions) 2)
2237 (split-string completions
2238 "^'\\|^\"\\|;\\|'$\\|\"$" t)))))))
2239
2240(defun python-shell-completion-complete-at-point (&optional process)
2241 "Perform completion at point in inferior Python.
2242Optional argument PROCESS forces completions to be retrieved
2243using that one instead of current buffer's process."
2244 (setq process (or process (get-buffer-process (current-buffer))))
2245 (let* ((start
2246 (save-excursion
2247 (with-syntax-table python-dotty-syntax-table
cb37c7e3
FEG
2248 (let* ((paren-depth (car (syntax-ppss)))
2249 (syntax-string "w_")
2250 (syntax-list (string-to-syntax syntax-string)))
5beed586
FEG
2251 ;; Stop scanning for the beginning of the completion
2252 ;; subject after the char before point matches a
2253 ;; delimiter
2254 (while (member
2255 (car (syntax-after (1- (point)))) syntax-list)
cb37c7e3
FEG
2256 (skip-syntax-backward syntax-string)
2257 (when (or (equal (char-before) ?\))
2258 (equal (char-before) ?\"))
2259 (forward-char -1))
2260 (while (or
2261 ;; honor initial paren depth
2262 (> (car (syntax-ppss)) paren-depth)
2d79ec42 2263 (python-syntax-context 'string))
5beed586
FEG
2264 (forward-char -1)))
2265 (point)))))
2266 (end (point)))
2267 (list start end
2268 (completion-table-dynamic
2269 (apply-partially
2270 #'python-shell-completion-get-completions
2271 process (buffer-substring-no-properties
2272 (line-beginning-position) end))))))
45c138ac 2273
45c138ac
FEG
2274(defun python-shell-completion-complete-or-indent ()
2275 "Complete or indent depending on the context.
e2d8d479
FEG
2276If content before pointer is all whitespace indent. If not try
2277to complete."
45c138ac
FEG
2278 (interactive)
2279 (if (string-match "^[[:space:]]*$"
2280 (buffer-substring (comint-line-beginning-position)
2281 (point-marker)))
2282 (indent-for-tab-command)
799aa2af 2283 (completion-at-point)))
45c138ac 2284
45c138ac
FEG
2285\f
2286;;; PDB Track integration
2287
76a9ea3b
FEG
2288(defcustom python-pdbtrack-activate t
2289 "Non-nil makes python shell enable pdbtracking."
2290 :type 'boolean
2291 :group 'python
2292 :safe 'booleanp)
2293
0f55249e 2294(defcustom python-pdbtrack-stacktrace-info-regexp
aeac8c27 2295 "^> \\([^\"(<]+\\)(\\([0-9]+\\))\\([?a-zA-Z0-9_<>]+\\)()"
e2d8d479 2296 "Regular Expression matching stacktrace information.
aeac8c27 2297Used to extract the current line and module being inspected."
0f55249e
FEG
2298 :type 'string
2299 :group 'python
2300 :safe 'stringp)
45c138ac 2301
e1f00930
FEG
2302(defvar python-pdbtrack-tracked-buffer nil
2303 "Variable containing the value of the current tracked buffer.
2304Never set this variable directly, use
2305`python-pdbtrack-set-tracked-buffer' instead.")
e1f00930
FEG
2306
2307(defvar python-pdbtrack-buffers-to-kill nil
2308 "List of buffers to be deleted after tracking finishes.")
e1f00930
FEG
2309
2310(defun python-pdbtrack-set-tracked-buffer (file-name)
2311 "Set the buffer for FILE-NAME as the tracked buffer.
2312Internally it uses the `python-pdbtrack-tracked-buffer' variable.
2313Returns the tracked buffer."
2314 (let ((file-buffer (get-file-buffer file-name)))
2315 (if file-buffer
2316 (setq python-pdbtrack-tracked-buffer file-buffer)
2317 (setq file-buffer (find-file-noselect file-name))
2318 (when (not (member file-buffer python-pdbtrack-buffers-to-kill))
2319 (add-to-list 'python-pdbtrack-buffers-to-kill file-buffer)))
2320 file-buffer))
45c138ac
FEG
2321
2322(defun python-pdbtrack-comint-output-filter-function (output)
2323 "Move overlay arrow to current pdb line in tracked buffer.
2324Argument OUTPUT is a string with the output from the comint process."
76a9ea3b 2325 (when (and python-pdbtrack-activate (not (string= output "")))
aeac8c27
FEG
2326 (let* ((full-output (ansi-color-filter-apply
2327 (buffer-substring comint-last-input-end (point-max))))
2328 (line-number)
2329 (file-name
2330 (with-temp-buffer
aeac8c27 2331 (insert full-output)
6ff930c3
FEG
2332 ;; When the debugger encounters a pdb.set_trace()
2333 ;; command, it prints a single stack frame. Sometimes
2334 ;; it prints a bit of extra information about the
2335 ;; arguments of the present function. When ipdb
2336 ;; encounters an exception, it prints the _entire_ stack
2337 ;; trace. To handle all of these cases, we want to find
2338 ;; the _last_ stack frame printed in the most recent
d9c287e5 2339 ;; batch of output, then jump to the corresponding
6ff930c3
FEG
2340 ;; file/line number.
2341 (goto-char (point-max))
2342 (when (re-search-backward python-pdbtrack-stacktrace-info-regexp nil t)
aeac8c27
FEG
2343 (setq line-number (string-to-number
2344 (match-string-no-properties 2)))
2345 (match-string-no-properties 1)))))
2346 (if (and file-name line-number)
6cad4c6e
FEG
2347 (let* ((tracked-buffer
2348 (python-pdbtrack-set-tracked-buffer file-name))
e1f00930
FEG
2349 (shell-buffer (current-buffer))
2350 (tracked-buffer-window (get-buffer-window tracked-buffer))
45c138ac 2351 (tracked-buffer-line-pos))
e1f00930 2352 (with-current-buffer tracked-buffer
aeac8c27
FEG
2353 (set (make-local-variable 'overlay-arrow-string) "=>")
2354 (set (make-local-variable 'overlay-arrow-position) (make-marker))
2355 (setq tracked-buffer-line-pos (progn
2356 (goto-char (point-min))
2357 (forward-line (1- line-number))
2358 (point-marker)))
2359 (when tracked-buffer-window
2360 (set-window-point
2361 tracked-buffer-window tracked-buffer-line-pos))
2362 (set-marker overlay-arrow-position tracked-buffer-line-pos))
e1f00930
FEG
2363 (pop-to-buffer tracked-buffer)
2364 (switch-to-buffer-other-window shell-buffer))
2365 (when python-pdbtrack-tracked-buffer
2366 (with-current-buffer python-pdbtrack-tracked-buffer
2367 (set-marker overlay-arrow-position nil))
2368 (mapc #'(lambda (buffer)
2369 (ignore-errors (kill-buffer buffer)))
2370 python-pdbtrack-buffers-to-kill)
2371 (setq python-pdbtrack-tracked-buffer nil
2372 python-pdbtrack-buffers-to-kill nil)))))
45c138ac
FEG
2373 output)
2374
2375\f
2376;;; Symbol completion
2377
2378(defun python-completion-complete-at-point ()
2379 "Complete current symbol at point.
2380For this to work the best as possible you should call
2381`python-shell-send-buffer' from time to time so context in
2382inferior python process is updated properly."
45c138ac
FEG
2383 (let ((process (python-shell-get-process)))
2384 (if (not process)
4289485a 2385 (error "Completion needs an inferior Python process running")
5beed586 2386 (python-shell-completion-complete-at-point process))))
45c138ac 2387
6cad4c6e
FEG
2388(add-to-list 'debug-ignored-errors
2389 "^Completion needs an inferior Python process running.")
45c138ac
FEG
2390
2391\f
2392;;; Fill paragraph
2393
c2cb97ae
FEG
2394(defcustom python-fill-comment-function 'python-fill-comment
2395 "Function to fill comments.
24517d82 2396This is the function used by `python-fill-paragraph' to
c2cb97ae
FEG
2397fill comments."
2398 :type 'symbol
fc345011 2399 :group 'python)
c2cb97ae
FEG
2400
2401(defcustom python-fill-string-function 'python-fill-string
2402 "Function to fill strings.
24517d82 2403This is the function used by `python-fill-paragraph' to
c2cb97ae
FEG
2404fill strings."
2405 :type 'symbol
fc345011 2406 :group 'python)
c2cb97ae
FEG
2407
2408(defcustom python-fill-decorator-function 'python-fill-decorator
2409 "Function to fill decorators.
24517d82 2410This is the function used by `python-fill-paragraph' to
c2cb97ae
FEG
2411fill decorators."
2412 :type 'symbol
fc345011 2413 :group 'python)
c2cb97ae
FEG
2414
2415(defcustom python-fill-paren-function 'python-fill-paren
2416 "Function to fill parens.
24517d82 2417This is the function used by `python-fill-paragraph' to
c2cb97ae
FEG
2418fill parens."
2419 :type 'symbol
fc345011
FEG
2420 :group 'python)
2421
7fa36ccb 2422(defcustom python-fill-docstring-style 'pep-257
fc345011
FEG
2423 "Style used to fill docstrings.
2424This affects `python-fill-string' behavior with regards to
2425triple quotes positioning.
2426
7fa36ccb
FEG
2427Possible values are DJANGO, ONETWO, PEP-257, PEP-257-NN,
2428SYMMETRIC, and NIL. A value of NIL won't care about quotes
2429position and will treat docstrings a normal string, any other
2430value may result in one of the following docstring styles:
fc345011
FEG
2431
2432DJANGO:
2433
2434 \"\"\"
2435 Process foo, return bar.
2436 \"\"\"
2437
2438 \"\"\"
2439 Process foo, return bar.
2440
2441 If processing fails throw ProcessingError.
2442 \"\"\"
2443
7fa36ccb
FEG
2444ONETWO:
2445
2446 \"\"\"Process foo, return bar.\"\"\"
2447
2448 \"\"\"
2449 Process foo, return bar.
2450
2451 If processing fails throw ProcessingError.
2452
2453 \"\"\"
2454
fc345011
FEG
2455PEP-257:
2456
2457 \"\"\"Process foo, return bar.\"\"\"
2458
2459 \"\"\"Process foo, return bar.
2460
2461 If processing fails throw ProcessingError.
2462
2463 \"\"\"
2464
2465PEP-257-NN:
2466
2467 \"\"\"Process foo, return bar.\"\"\"
2468
2469 \"\"\"Process foo, return bar.
2470
2471 If processing fails throw ProcessingError.
2472 \"\"\"
2473
2474SYMMETRIC:
2475
2476 \"\"\"Process foo, return bar.\"\"\"
2477
2478 \"\"\"
2479 Process foo, return bar.
2480
2481 If processing fails throw ProcessingError.
2482 \"\"\""
7fa36ccb
FEG
2483 :type '(choice
2484 (const :tag "Don't format docstrings" nil)
2485 (const :tag "Django's coding standards style." django)
2486 (const :tag "One newline and start and Two at end style." onetwo)
2487 (const :tag "PEP-257 with 2 newlines at end of string." pep-257)
2488 (const :tag "PEP-257 with 1 newline at end of string." pep-257-nn)
2489 (const :tag "Symmetric style." symmetric))
c2cb97ae 2490 :group 'python
7fa36ccb
FEG
2491 :safe (lambda (val)
2492 (memq val '(django onetwo pep-257 pep-257-nn symmetric nil))))
c2cb97ae 2493
24517d82 2494(defun python-fill-paragraph (&optional justify)
45c138ac
FEG
2495 "`fill-paragraph-function' handling multi-line strings and possibly comments.
2496If any of the current line is in or at the end of a multi-line string,
2497fill the string or the paragraph of it that point is in, preserving
4e531f7a
FEG
2498the string's indentation.
2499Optional argument JUSTIFY defines if the paragraph should be justified."
45c138ac
FEG
2500 (interactive "P")
2501 (save-excursion
45c138ac
FEG
2502 (cond
2503 ;; Comments
fc345011
FEG
2504 ((python-syntax-context 'comment)
2505 (funcall python-fill-comment-function justify))
c2cb97ae 2506 ;; Strings/Docstrings
fc345011
FEG
2507 ((save-excursion (or (python-syntax-context 'string)
2508 (equal (string-to-syntax "|")
2509 (syntax-after (point)))))
c2cb97ae 2510 (funcall python-fill-string-function justify))
45c138ac
FEG
2511 ;; Decorators
2512 ((equal (char-after (save-excursion
24517d82 2513 (python-nav-beginning-of-statement))) ?@)
c2cb97ae 2514 (funcall python-fill-decorator-function justify))
45c138ac 2515 ;; Parens
2d79ec42 2516 ((or (python-syntax-context 'paren)
45c138ac
FEG
2517 (looking-at (python-rx open-paren))
2518 (save-excursion
2519 (skip-syntax-forward "^(" (line-end-position))
2520 (looking-at (python-rx open-paren))))
c2cb97ae 2521 (funcall python-fill-paren-function justify))
45c138ac
FEG
2522 (t t))))
2523
c2cb97ae 2524(defun python-fill-comment (&optional justify)
24517d82 2525 "Comment fill function for `python-fill-paragraph'.
053a6c72 2526JUSTIFY should be used (if applicable) as in `fill-paragraph'."
c2cb97ae
FEG
2527 (fill-comment-paragraph justify))
2528
2529(defun python-fill-string (&optional justify)
24517d82 2530 "String fill function for `python-fill-paragraph'.
053a6c72 2531JUSTIFY should be used (if applicable) as in `fill-paragraph'."
fc345011
FEG
2532 (let* ((marker (point-marker))
2533 (str-start-pos
66164d2f
FEG
2534 (set-marker
2535 (make-marker)
2536 (or (python-syntax-context 'string)
2537 (and (equal (string-to-syntax "|")
2538 (syntax-after (point)))
2539 (point)))))
fc345011
FEG
2540 (num-quotes (python-syntax-count-quotes
2541 (char-after str-start-pos) str-start-pos))
2542 (str-end-pos
2543 (save-excursion
2544 (goto-char (+ str-start-pos num-quotes))
2545 (or (re-search-forward (rx (syntax string-delimiter)) nil t)
2546 (goto-char (point-max)))
2547 (point-marker)))
2548 (multi-line-p
2549 ;; Docstring styles may vary for oneliners and multi-liners.
2550 (> (count-matches "\n" str-start-pos str-end-pos) 0))
2551 (delimiters-style
14146222 2552 (pcase python-fill-docstring-style
fc345011
FEG
2553 ;; delimiters-style is a cons cell with the form
2554 ;; (START-NEWLINES . END-NEWLINES). When any of the sexps
2555 ;; is NIL means to not add any newlines for start or end
7fa36ccb 2556 ;; of docstring. See `python-fill-docstring-style' for a
fc345011 2557 ;; graphic idea of each style.
14146222
SM
2558 (`django (cons 1 1))
2559 (`onetwo (and multi-line-p (cons 1 2)))
2560 (`pep-257 (and multi-line-p (cons nil 2)))
2561 (`pep-257-nn (and multi-line-p (cons nil 1)))
2562 (`symmetric (and multi-line-p (cons 1 1)))))
fc345011
FEG
2563 (docstring-p (save-excursion
2564 ;; Consider docstrings those strings which
2565 ;; start on a line by themselves.
7fa36ccb
FEG
2566 (python-nav-beginning-of-statement)
2567 (and (= (point) str-start-pos))))
fc345011 2568 (fill-paragraph-function))
c2cb97ae 2569 (save-restriction
fc345011
FEG
2570 (narrow-to-region str-start-pos str-end-pos)
2571 (fill-paragraph justify))
2572 (save-excursion
7fa36ccb 2573 (when (and docstring-p python-fill-docstring-style)
fc345011
FEG
2574 ;; Add the number of newlines indicated by the selected style
2575 ;; at the start of the docstring.
2576 (goto-char (+ str-start-pos num-quotes))
2577 (delete-region (point) (progn
2578 (skip-syntax-forward "> ")
2579 (point)))
2580 (and (car delimiters-style)
2581 (or (newline (car delimiters-style)) t)
2582 ;; Indent only if a newline is added.
2583 (indent-according-to-mode))
2584 ;; Add the number of newlines indicated by the selected style
2585 ;; at the end of the docstring.
2586 (goto-char (if (not (= str-end-pos (point-max)))
2587 (- str-end-pos num-quotes)
2588 str-end-pos))
2589 (delete-region (point) (progn
2590 (skip-syntax-backward "> ")
2591 (point)))
2592 (and (cdr delimiters-style)
2593 ;; Add newlines only if string ends.
2594 (not (= str-end-pos (point-max)))
2595 (or (newline (cdr delimiters-style)) t)
2596 ;; Again indent only if a newline is added.
2597 (indent-according-to-mode))))) t)
c2cb97ae
FEG
2598
2599(defun python-fill-decorator (&optional justify)
24517d82 2600 "Decorator fill function for `python-fill-paragraph'.
053a6c72 2601JUSTIFY should be used (if applicable) as in `fill-paragraph'."
c2cb97ae
FEG
2602 t)
2603
2604(defun python-fill-paren (&optional justify)
24517d82 2605 "Paren fill function for `python-fill-paragraph'.
053a6c72 2606JUSTIFY should be used (if applicable) as in `fill-paragraph'."
c2cb97ae
FEG
2607 (save-restriction
2608 (narrow-to-region (progn
2d79ec42 2609 (while (python-syntax-context 'paren)
c2cb97ae
FEG
2610 (goto-char (1- (point-marker))))
2611 (point-marker)
2612 (line-beginning-position))
2613 (progn
2d79ec42 2614 (when (not (python-syntax-context 'paren))
c2cb97ae 2615 (end-of-line)
2d79ec42 2616 (when (not (python-syntax-context 'paren))
c2cb97ae 2617 (skip-syntax-backward "^)")))
2d79ec42 2618 (while (python-syntax-context 'paren)
c2cb97ae
FEG
2619 (goto-char (1+ (point-marker))))
2620 (point-marker)))
2621 (let ((paragraph-start "\f\\|[ \t]*$")
2622 (paragraph-separate ",")
2623 (fill-paragraph-function))
2624 (goto-char (point-min))
2625 (fill-paragraph justify))
2626 (while (not (eobp))
2627 (forward-line 1)
2628 (python-indent-line)
2629 (goto-char (line-end-position)))) t)
2630
45c138ac 2631\f
e2803784
FEG
2632;;; Skeletons
2633
2634(defcustom python-skeleton-autoinsert nil
2635 "Non-nil means template skeletons will be automagically inserted.
2636This happens when pressing \"if<SPACE>\", for example, to prompt for
2637the if condition."
2638 :type 'boolean
0f55249e
FEG
2639 :group 'python
2640 :safe 'booleanp)
e2803784 2641
9ddf3c74 2642(define-obsolete-variable-alias
2a1e2476 2643 'python-use-skeletons 'python-skeleton-autoinsert "24.3")
9ddf3c74 2644
e2803784
FEG
2645(defvar python-skeleton-available '()
2646 "Internal list of available skeletons.")
e2803784
FEG
2647
2648(define-abbrev-table 'python-mode-abbrev-table ()
2649 "Abbrev table for Python mode."
2650 :case-fixed t
2651 ;; Allow / inside abbrevs.
2652 :regexp "\\(?:^\\|[^/]\\)\\<\\([[:word:]/]+\\)\\W*"
2653 ;; Only expand in code.
2654 :enable-function (lambda ()
e2803784 2655 (and
2d79ec42 2656 (not (python-syntax-comment-or-string-p))
e2803784
FEG
2657 python-skeleton-autoinsert)))
2658
2659(defmacro python-skeleton-define (name doc &rest skel)
2660 "Define a `python-mode' skeleton using NAME DOC and SKEL.
2661The skeleton will be bound to python-skeleton-NAME and will
2662be added to `python-mode-abbrev-table'."
25f09295 2663 (declare (indent 2))
e2803784 2664 (let* ((name (symbol-name name))
6cad4c6e 2665 (function-name (intern (concat "python-skeleton-" name))))
73ed6836 2666 `(progn
0e9e6c6a 2667 (define-abbrev python-mode-abbrev-table ,name "" ',function-name
d617c457 2668 :system t)
73ed6836
FEG
2669 (setq python-skeleton-available
2670 (cons ',function-name python-skeleton-available))
2671 (define-skeleton ,function-name
2672 ,(or doc
2673 (format "Insert %s statement." name))
2674 ,@skel))))
e2803784
FEG
2675
2676(defmacro python-define-auxiliary-skeleton (name doc &optional &rest skel)
2677 "Define a `python-mode' auxiliary skeleton using NAME DOC and SKEL.
2678The skeleton will be bound to python-skeleton-NAME."
25f09295 2679 (declare (indent 2))
e2803784 2680 (let* ((name (symbol-name name))
6cad4c6e 2681 (function-name (intern (concat "python-skeleton--" name)))
e2803784
FEG
2682 (msg (format
2683 "Add '%s' clause? " name)))
2684 (when (not skel)
2685 (setq skel
2686 `(< ,(format "%s:" name) \n \n
2687 > _ \n)))
2688 `(define-skeleton ,function-name
2689 ,(or doc
2690 (format "Auxiliary skeleton for %s statement." name))
2691 nil
2692 (unless (y-or-n-p ,msg)
2693 (signal 'quit t))
2694 ,@skel)))
e2803784
FEG
2695
2696(python-define-auxiliary-skeleton else nil)
2697
2698(python-define-auxiliary-skeleton except nil)
2699
2700(python-define-auxiliary-skeleton finally nil)
2701
2702(python-skeleton-define if nil
2703 "Condition: "
2704 "if " str ":" \n
2705 _ \n
2706 ("other condition, %s: "
2707 <
2708 "elif " str ":" \n
2709 > _ \n nil)
2710 '(python-skeleton--else) | ^)
2711
2712(python-skeleton-define while nil
2713 "Condition: "
2714 "while " str ":" \n
2715 > _ \n
2716 '(python-skeleton--else) | ^)
2717
2718(python-skeleton-define for nil
2719 "Iteration spec: "
2720 "for " str ":" \n
2721 > _ \n
2722 '(python-skeleton--else) | ^)
2723
2724(python-skeleton-define try nil
2725 nil
2726 "try:" \n
2727 > _ \n
2728 ("Exception, %s: "
2729 <
2730 "except " str ":" \n
2731 > _ \n nil)
2732 resume:
2733 '(python-skeleton--except)
2734 '(python-skeleton--else)
2735 '(python-skeleton--finally) | ^)
2736
2737(python-skeleton-define def nil
2738 "Function name: "
2c43a9ad
FEG
2739 "def " str "(" ("Parameter, %s: "
2740 (unless (equal ?\( (char-before)) ", ")
2741 str) "):" \n
2742 "\"\"\"" - "\"\"\"" \n
2743 > _ \n)
e2803784
FEG
2744
2745(python-skeleton-define class nil
2746 "Class name: "
2c43a9ad
FEG
2747 "class " str "(" ("Inheritance, %s: "
2748 (unless (equal ?\( (char-before)) ", ")
2749 str)
e2803784
FEG
2750 & ")" | -2
2751 ":" \n
2752 "\"\"\"" - "\"\"\"" \n
2753 > _ \n)
2754
2755(defun python-skeleton-add-menu-items ()
2756 "Add menu items to Python->Skeletons menu."
2757 (let ((skeletons (sort python-skeleton-available 'string<))
2758 (items))
2759 (dolist (skeleton skeletons)
2760 (easy-menu-add-item
2761 nil '("Python" "Skeletons")
2762 `[,(format
14146222 2763 "Insert %s" (nth 2 (split-string (symbol-name skeleton) "-")))
e2803784
FEG
2764 ,skeleton t]))))
2765\f
046428d3
FEG
2766;;; FFAP
2767
0f55249e 2768(defcustom python-ffap-setup-code
046428d3
FEG
2769 "def __FFAP_get_module_path(module):
2770 try:
2771 import os
2772 path = __import__(module).__file__
2773 if path[-4:] == '.pyc' and os.path.exists(path[0:-1]):
2774 path = path[:-1]
2775 return path
2776 except:
2777 return ''"
0f55249e
FEG
2778 "Python code to get a module path."
2779 :type 'string
c4b155cb 2780 :group 'python)
046428d3 2781
0f55249e 2782(defcustom python-ffap-string-code
046428d3 2783 "__FFAP_get_module_path('''%s''')\n"
0f55249e
FEG
2784 "Python code used to get a string with the path of a module."
2785 :type 'string
c4b155cb 2786 :group 'python)
046428d3 2787
046428d3
FEG
2788(defun python-ffap-module-path (module)
2789 "Function for `ffap-alist' to return path for MODULE."
2790 (let ((process (or
2791 (and (eq major-mode 'inferior-python-mode)
2792 (get-buffer-process (current-buffer)))
2793 (python-shell-get-process))))
2794 (if (not process)
2795 nil
2796 (let ((module-file
9ce938be 2797 (python-shell-send-string-no-output
046428d3
FEG
2798 (format python-ffap-string-code module) process)))
2799 (when module-file
6cad4c6e 2800 (substring-no-properties module-file 1 -1))))))
046428d3
FEG
2801
2802(eval-after-load "ffap"
2803 '(progn
2804 (push '(python-mode . python-ffap-module-path) ffap-alist)
2805 (push '(inferior-python-mode . python-ffap-module-path) ffap-alist)))
2806
046428d3 2807\f
8b3e0e76
FEG
2808;;; Code check
2809
0f55249e 2810(defcustom python-check-command
bba416bc 2811 "pyflakes"
0f55249e
FEG
2812 "Command used to check a Python file."
2813 :type 'string
c4b155cb 2814 :group 'python)
8b3e0e76 2815
bbd27e07
FEG
2816(defcustom python-check-buffer-name
2817 "*Python check: %s*"
2818 "Buffer name used for check commands."
2819 :type 'string
2820 :group 'python)
2821
8b3e0e76
FEG
2822(defvar python-check-custom-command nil
2823 "Internal use.")
2824
2825(defun python-check (command)
2826 "Check a Python file (default current buffer's file).
2827Runs COMMAND, a shell command, as if by `compile'. See
2828`python-check-command' for the default."
2829 (interactive
2830 (list (read-string "Check command: "
6cad4c6e
FEG
2831 (or python-check-custom-command
2832 (concat python-check-command " "
8b3e0e76
FEG
2833 (shell-quote-argument
2834 (or
2835 (let ((name (buffer-file-name)))
2836 (and name
2837 (file-name-nondirectory name)))
2838 "")))))))
2839 (setq python-check-custom-command command)
2840 (save-some-buffers (not compilation-ask-about-save) nil)
bba416bc
FEG
2841 (let ((process-environment (python-shell-calculate-process-environment))
2842 (exec-path (python-shell-calculate-exec-path)))
bbd27e07
FEG
2843 (compilation-start command nil
2844 (lambda (mode-name)
2845 (format python-check-buffer-name command)))))
8b3e0e76
FEG
2846
2847\f
45c138ac
FEG
2848;;; Eldoc
2849
0f55249e 2850(defcustom python-eldoc-setup-code
45c138ac
FEG
2851 "def __PYDOC_get_help(obj):
2852 try:
15cc40b8 2853 import inspect
9e662938
FEG
2854 if hasattr(obj, 'startswith'):
2855 obj = eval(obj, globals())
15cc40b8
FEG
2856 doc = inspect.getdoc(obj)
2857 if not doc and callable(obj):
2858 target = None
2859 if inspect.isclass(obj) and hasattr(obj, '__init__'):
2860 target = obj.__init__
2861 objtype = 'class'
2862 else:
2863 target = obj
2864 objtype = 'def'
2865 if target:
2866 args = inspect.formatargspec(
2867 *inspect.getargspec(target)
2868 )
2869 name = obj.__name__
2870 doc = '{objtype} {name}{args}'.format(
2871 objtype=objtype, name=name, args=args
2872 )
2873 else:
2874 doc = doc.splitlines()[0]
45c138ac 2875 except:
9e662938
FEG
2876 doc = ''
2877 try:
2878 exec('print doc')
2879 except SyntaxError:
2880 print(doc)"
0f55249e
FEG
2881 "Python code to setup documentation retrieval."
2882 :type 'string
c4b155cb 2883 :group 'python)
45c138ac 2884
0f55249e 2885(defcustom python-eldoc-string-code
9e662938 2886 "__PYDOC_get_help('''%s''')\n"
0f55249e
FEG
2887 "Python code used to get a string with the documentation of an object."
2888 :type 'string
c4b155cb 2889 :group 'python)
45c138ac 2890
78334b43 2891(defun python-eldoc--get-doc-at-point (&optional force-input force-process)
d439cda5 2892 "Internal implementation to get documentation at point.
d583cbe6
FEG
2893If not FORCE-INPUT is passed then what
2894`python-info-current-symbol' returns will be used. If not
2895FORCE-PROCESS is passed what `python-shell-get-process' returns
2896is used."
78334b43 2897 (let ((process (or force-process (python-shell-get-process))))
45c138ac 2898 (if (not process)
d583cbe6
FEG
2899 (error "Eldoc needs an inferior Python process running")
2900 (let ((input (or force-input
2901 (python-info-current-symbol t))))
2902 (and input
2903 (python-shell-send-string-no-output
2904 (format python-eldoc-string-code input)
2905 process))))))
45c138ac 2906
78334b43
FEG
2907(defun python-eldoc-function ()
2908 "`eldoc-documentation-function' for Python.
2909For this to work the best as possible you should call
2910`python-shell-send-buffer' from time to time so context in
2911inferior python process is updated properly."
2912 (python-eldoc--get-doc-at-point))
2913
2914(defun python-eldoc-at-point (symbol)
2915 "Get help on SYMBOL using `help'.
2916Interactively, prompt for symbol."
6cad4c6e 2917 (interactive
d583cbe6 2918 (let ((symbol (python-info-current-symbol t))
6cad4c6e
FEG
2919 (enable-recursive-minibuffers t))
2920 (list (read-string (if symbol
2921 (format "Describe symbol (default %s): " symbol)
2922 "Describe symbol: ")
2923 nil nil symbol))))
d583cbe6
FEG
2924 (message (python-eldoc--get-doc-at-point symbol)))
2925
2926(add-to-list 'debug-ignored-errors
2927 "^Eldoc needs an inferior Python process running.")
78334b43 2928
45c138ac 2929\f
207cb73c
FEG
2930;;; Imenu
2931
2932(defun python-imenu-prev-index-position ()
2933 "Python mode's `imenu-prev-index-position-function'."
2934 (let ((found))
2935 (while (and (setq found
2936 (re-search-backward python-nav-beginning-of-defun-regexp nil t))
2937 (not (python-info-looking-at-beginning-of-defun))))
2938 (and found
2939 (python-info-looking-at-beginning-of-defun)
2940 (python-info-current-defun))))
2941
2942\f
45c138ac
FEG
2943;;; Misc helpers
2944
fc2dc7df 2945(defun python-info-current-defun (&optional include-type)
45c138ac 2946 "Return name of surrounding function with Python compatible dotty syntax.
fc2dc7df 2947Optional argument INCLUDE-TYPE indicates to include the type of the defun.
45c138ac
FEG
2948This function is compatible to be used as
2949`add-log-current-defun-function' since it returns nil if point is
2950not inside a defun."
dcbec5e2
FEG
2951 (save-restriction
2952 (widen)
2953 (save-excursion
2954 (end-of-line 1)
2955 (let ((names)
2956 (starting-indentation (current-indentation))
2957 (starting-pos (point))
2958 (first-run t)
2959 (last-indent)
2960 (type))
2961 (catch 'exit
2962 (while (python-nav-beginning-of-defun 1)
2963 (when (and
2964 (or (not last-indent)
2965 (< (current-indentation) last-indent))
2966 (or
2967 (and first-run
2e6625b5 2968 (save-excursion
dcbec5e2
FEG
2969 ;; If this is the first run, we may add
2970 ;; the current defun at point.
2971 (setq first-run nil)
2972 (goto-char starting-pos)
2973 (python-nav-beginning-of-statement)
2974 (beginning-of-line 1)
2975 (looking-at-p
2976 python-nav-beginning-of-defun-regexp)))
2977 (< starting-pos
2978 (save-excursion
2979 (let ((min-indent
2980 (+ (current-indentation)
2981 python-indent-offset)))
2982 (if (< starting-indentation min-indent)
2983 ;; If the starting indentation is not
2984 ;; within the min defun indent make the
2985 ;; check fail.
2986 starting-pos
2987 ;; Else go to the end of defun and add
2988 ;; up the current indentation to the
2989 ;; ending position.
2990 (python-nav-end-of-defun)
2991 (+ (point)
2992 (if (>= (current-indentation) min-indent)
2993 (1+ (current-indentation))
2994 0))))))))
2995 (setq last-indent (current-indentation))
2996 (if (or (not include-type) type)
2997 (setq names (cons (match-string-no-properties 1) names))
2998 (let ((match (split-string (match-string-no-properties 0))))
2999 (setq type (car match))
3000 (setq names (cons (cadr match) names)))))
3001 ;; Stop searching ASAP.
3002 (and (= (current-indentation) 0) (throw 'exit t))))
3003 (and names
3004 (concat (and type (format "%s " type))
3005 (mapconcat 'identity names ".")))))))
45c138ac 3006
d583cbe6
FEG
3007(defun python-info-current-symbol (&optional replace-self)
3008 "Return current symbol using dotty syntax.
3009With optional argument REPLACE-SELF convert \"self\" to current
3010parent defun name."
3011 (let ((name
2d79ec42 3012 (and (not (python-syntax-comment-or-string-p))
d583cbe6
FEG
3013 (with-syntax-table python-dotty-syntax-table
3014 (let ((sym (symbol-at-point)))
3015 (and sym
3016 (substring-no-properties (symbol-name sym))))))))
3017 (when name
3018 (if (not replace-self)
3019 name
3020 (let ((current-defun (python-info-current-defun)))
3021 (if (not current-defun)
3022 name
3023 (replace-regexp-in-string
3024 (python-rx line-start word-start "self" word-end ?.)
3025 (concat
3026 (mapconcat 'identity
3027 (butlast (split-string current-defun "\\."))
3028 ".") ".")
3029 name)))))))
3030
8dbce54c 3031(defun python-info-statement-starts-block-p ()
0a60bc10
FEG
3032 "Return non-nil if current statement opens a block."
3033 (save-excursion
3034 (python-nav-beginning-of-statement)
3035 (looking-at (python-rx block-start))))
3036
8dbce54c
FEG
3037(defun python-info-statement-ends-block-p ()
3038 "Return non-nil if point is at end of block."
3039 (let ((end-of-block-pos (save-excursion
3040 (python-nav-end-of-block)))
3041 (end-of-statement-pos (save-excursion
3042 (python-nav-end-of-statement))))
3043 (and end-of-block-pos end-of-statement-pos
3044 (= end-of-block-pos end-of-statement-pos))))
3045
3046(defun python-info-beginning-of-statement-p ()
3047 "Return non-nil if point is at beginning of statement."
3048 (= (point) (save-excursion
3049 (python-nav-beginning-of-statement)
3050 (point))))
3051
3052(defun python-info-end-of-statement-p ()
3053 "Return non-nil if point is at end of statement."
3054 (= (point) (save-excursion
3055 (python-nav-end-of-statement)
3056 (point))))
3057
3058(defun python-info-beginning-of-block-p ()
3059 "Return non-nil if point is at beginning of block."
3060 (and (python-info-beginning-of-statement-p)
3061 (python-info-statement-starts-block-p)))
3062
3063(defun python-info-end-of-block-p ()
3064 "Return non-nil if point is at end of block."
3065 (and (python-info-end-of-statement-p)
3066 (python-info-statement-ends-block-p)))
3067
45c138ac 3068(defun python-info-closing-block ()
e2d8d479 3069 "Return the point of the block the current line closes."
45c138ac
FEG
3070 (let ((closing-word (save-excursion
3071 (back-to-indentation)
3072 (current-word)))
3073 (indentation (current-indentation)))
3074 (when (member closing-word python-indent-dedenters)
3075 (save-excursion
3076 (forward-line -1)
3077 (while (and (> (current-indentation) indentation)
3078 (not (bobp))
3079 (not (back-to-indentation))
3080 (forward-line -1)))
3081 (back-to-indentation)
3082 (cond
3083 ((not (equal indentation (current-indentation))) nil)
3084 ((string= closing-word "elif")
3085 (when (member (current-word) '("if" "elif"))
3086 (point-marker)))
3087 ((string= closing-word "else")
3088 (when (member (current-word) '("if" "elif" "except" "for" "while"))
3089 (point-marker)))
3090 ((string= closing-word "except")
3091 (when (member (current-word) '("try"))
3092 (point-marker)))
3093 ((string= closing-word "finally")
3094 (when (member (current-word) '("except" "else"))
3095 (point-marker))))))))
3096
cd7ab092
FEG
3097(defun python-info-closing-block-message (&optional closing-block-point)
3098 "Message the contents of the block the current line closes.
3099With optional argument CLOSING-BLOCK-POINT use that instead of
3100recalculating it calling `python-info-closing-block'."
3101 (let ((point (or closing-block-point (python-info-closing-block))))
3102 (when point
3103 (save-restriction
3104 (widen)
3105 (message "Closes %s" (save-excursion
3106 (goto-char point)
3107 (back-to-indentation)
3108 (buffer-substring
3109 (point) (line-end-position))))))))
3110
0674d3fa 3111(defun python-info-line-ends-backslash-p (&optional line-number)
6cad4c6e 3112 "Return non-nil if current line ends with backslash.
0674d3fa 3113With optional argument LINE-NUMBER, check that line instead."
6cad4c6e
FEG
3114 (save-excursion
3115 (save-restriction
dc4f2e53 3116 (widen)
6cad4c6e
FEG
3117 (when line-number
3118 (goto-char line-number))
dc4f2e53
FEG
3119 (while (and (not (eobp))
3120 (goto-char (line-end-position))
2d79ec42 3121 (python-syntax-context 'paren)
dc4f2e53
FEG
3122 (not (equal (char-before (point)) ?\\)))
3123 (forward-line 1))
3124 (when (equal (char-before) ?\\)
3125 (point-marker)))))
3126
48d1354e
PE
3127(defun python-info-beginning-of-backslash (&optional line-number)
3128 "Return the point where the backslashed line start.
4289485a 3129Optional argument LINE-NUMBER forces the line number to check against."
dc4f2e53
FEG
3130 (save-excursion
3131 (save-restriction
6cad4c6e 3132 (widen)
dc4f2e53
FEG
3133 (when line-number
3134 (goto-char line-number))
3135 (when (python-info-line-ends-backslash-p)
3136 (while (save-excursion
3137 (goto-char (line-beginning-position))
2d79ec42 3138 (python-syntax-context 'paren))
dc4f2e53
FEG
3139 (forward-line -1))
3140 (back-to-indentation)
3141 (point-marker)))))
45c138ac
FEG
3142
3143(defun python-info-continuation-line-p ()
0674d3fa
FEG
3144 "Check if current line is continuation of another.
3145When current line is continuation of another return the point
3146where the continued line ends."
3147 (save-excursion
3148 (save-restriction
3149 (widen)
3150 (let* ((context-type (progn
3151 (back-to-indentation)
2d79ec42 3152 (python-syntax-context-type)))
0674d3fa
FEG
3153 (line-start (line-number-at-pos))
3154 (context-start (when context-type
2d79ec42 3155 (python-syntax-context context-type))))
0674d3fa
FEG
3156 (cond ((equal context-type 'paren)
3157 ;; Lines inside a paren are always a continuation line
3158 ;; (except the first one).
1d29cc7d
FEG
3159 (python-util-forward-comment -1)
3160 (point-marker))
3161 ((member context-type '(string comment))
0674d3fa
FEG
3162 ;; move forward an roll again
3163 (goto-char context-start)
3164 (python-util-forward-comment)
3165 (python-info-continuation-line-p))
3166 (t
1d29cc7d
FEG
3167 ;; Not within a paren, string or comment, the only way
3168 ;; we are dealing with a continuation line is that
3169 ;; previous line contains a backslash, and this can
3170 ;; only be the previous line from current
0674d3fa
FEG
3171 (back-to-indentation)
3172 (python-util-forward-comment -1)
0674d3fa
FEG
3173 (when (and (equal (1- line-start) (line-number-at-pos))
3174 (python-info-line-ends-backslash-p))
3175 (point-marker))))))))
45c138ac
FEG
3176
3177(defun python-info-block-continuation-line-p ()
3178 "Return non-nil if current line is a continuation of a block."
3179 (save-excursion
0674d3fa
FEG
3180 (when (python-info-continuation-line-p)
3181 (forward-line -1)
3182 (back-to-indentation)
3183 (when (looking-at (python-rx block-start))
3184 (point-marker)))))
45c138ac
FEG
3185
3186(defun python-info-assignment-continuation-line-p ()
0674d3fa
FEG
3187 "Check if current line is a continuation of an assignment.
3188When current line is continuation of another with an assignment
3189return the point of the first non-blank character after the
3190operator."
45c138ac 3191 (save-excursion
0674d3fa
FEG
3192 (when (python-info-continuation-line-p)
3193 (forward-line -1)
3194 (back-to-indentation)
3195 (when (and (not (looking-at (python-rx block-start)))
45c138ac
FEG
3196 (and (re-search-forward (python-rx not-simple-operator
3197 assignment-operator
3198 not-simple-operator)
3199 (line-end-position) t)
2d79ec42 3200 (not (python-syntax-context-type))))
0674d3fa
FEG
3201 (skip-syntax-forward "\s")
3202 (point-marker)))))
45c138ac 3203
8c6f9e60 3204(defun python-info-looking-at-beginning-of-defun (&optional syntax-ppss)
4289485a 3205 "Check if point is at `beginning-of-defun' using SYNTAX-PPSS."
2d79ec42 3206 (and (not (python-syntax-context-type (or syntax-ppss (syntax-ppss))))
8c6f9e60
FEG
3207 (save-excursion
3208 (beginning-of-line 1)
3209 (looking-at python-nav-beginning-of-defun-regexp))))
3210
032d23ab
FEG
3211(defun python-info-current-line-comment-p ()
3212 "Check if current line is a comment line."
3213 (char-equal (or (char-after (+ (point) (current-indentation))) ?_) ?#))
3214
3215(defun python-info-current-line-empty-p ()
3216 "Check if current line is empty, ignoring whitespace."
3217 (save-excursion
3218 (beginning-of-line 1)
3219 (looking-at
3220 (python-rx line-start (* whitespace)
3221 (group (* not-newline))
3222 (* whitespace) line-end))
3223 (string-equal "" (match-string-no-properties 1))))
3224
45c138ac 3225\f
c942de99
FEG
3226;;; Utility functions
3227
c942de99
FEG
3228(defun python-util-position (item seq)
3229 "Find the first occurrence of ITEM in SEQ.
3230Return the index of the matching item, or nil if not found."
3231 (let ((member-result (member item seq)))
3232 (when member-result
3233 (- (length seq) (length member-result)))))
3234
d2190c57 3235;; Stolen from org-mode
fbc39529 3236(defun python-util-clone-local-variables (from-buffer &optional regexp)
d2190c57
FEG
3237 "Clone local variables from FROM-BUFFER.
3238Optional argument REGEXP selects variables to clone and defaults
3239to \"^python-\"."
3240 (mapc
3241 (lambda (pair)
3242 (and (symbolp (car pair))
3243 (string-match (or regexp "^python-")
3244 (symbol-name (car pair)))
6cad4c6e
FEG
3245 (set (make-local-variable (car pair))
3246 (cdr pair))))
d2190c57
FEG
3247 (buffer-local-variables from-buffer)))
3248
0674d3fa 3249(defun python-util-forward-comment (&optional direction)
4289485a
FEG
3250 "Python mode specific version of `forward-comment'.
3251Optional argument DIRECTION defines the direction to move to."
2d79ec42 3252 (let ((comment-start (python-syntax-context 'comment))
0674d3fa
FEG
3253 (factor (if (< (or direction 0) 0)
3254 -99999
3255 99999)))
3256 (when comment-start
3257 (goto-char comment-start))
3258 (forward-comment factor)))
3259
c942de99 3260\f
45c138ac 3261;;;###autoload
68f12411 3262(define-derived-mode python-mode prog-mode "Python"
e2d8d479
FEG
3263 "Major mode for editing Python files.
3264
3265\\{python-mode-map}
3266Entry to this mode calls the value of `python-mode-hook'
3267if that value is non-nil."
45c138ac
FEG
3268 (set (make-local-variable 'tab-width) 8)
3269 (set (make-local-variable 'indent-tabs-mode) nil)
3270
3271 (set (make-local-variable 'comment-start) "# ")
3272 (set (make-local-variable 'comment-start-skip) "#+\\s-*")
3273
3274 (set (make-local-variable 'parse-sexp-lookup-properties) t)
3275 (set (make-local-variable 'parse-sexp-ignore-comments) t)
3276
032d23ab 3277 (set (make-local-variable 'forward-sexp-function)
489af14f 3278 'python-nav-forward-sexp)
032d23ab 3279
45c138ac 3280 (set (make-local-variable 'font-lock-defaults)
aeadd9a4
FEG
3281 '(python-font-lock-keywords nil nil nil nil))
3282
3283 (set (make-local-variable 'syntax-propertize-function)
3284 python-syntax-propertize-function)
45c138ac 3285
6cad4c6e
FEG
3286 (set (make-local-variable 'indent-line-function)
3287 #'python-indent-line-function)
45c138ac
FEG
3288 (set (make-local-variable 'indent-region-function) #'python-indent-region)
3289
3290 (set (make-local-variable 'paragraph-start) "\\s-*$")
6cad4c6e 3291 (set (make-local-variable 'fill-paragraph-function)
24517d82 3292 'python-fill-paragraph)
45c138ac
FEG
3293
3294 (set (make-local-variable 'beginning-of-defun-function)
2e6625b5 3295 #'python-nav-beginning-of-defun)
45c138ac 3296 (set (make-local-variable 'end-of-defun-function)
2e6625b5 3297 #'python-nav-end-of-defun)
45c138ac
FEG
3298
3299 (add-hook 'completion-at-point-functions
3300 'python-completion-complete-at-point nil 'local)
3301
5eae76ae
FEG
3302 (add-hook 'post-self-insert-hook
3303 'python-indent-post-self-insert-function nil 'local)
3304
758e556a
FEG
3305 (set (make-local-variable 'imenu-extract-index-name-function)
3306 #'python-info-current-defun)
fc2dc7df 3307
207cb73c
FEG
3308 (set (make-local-variable 'imenu-prev-index-position-function)
3309 #'python-imenu-prev-index-position)
3310
45c138ac
FEG
3311 (set (make-local-variable 'add-log-current-defun-function)
3312 #'python-info-current-defun)
3313
c6d3df36
FEG
3314 (add-hook 'which-func-functions #'python-info-current-defun nil t)
3315
e2803784
FEG
3316 (set (make-local-variable 'skeleton-further-elements)
3317 '((abbrev-mode nil)
3318 (< '(backward-delete-char-untabify (min python-indent-offset
6cad4c6e
FEG
3319 (current-column))))
3320 (^ '(- (1+ (current-indentation))))))
e2803784 3321
45c138ac
FEG
3322 (set (make-local-variable 'eldoc-documentation-function)
3323 #'python-eldoc-function)
3324
3325 (add-to-list 'hs-special-modes-alist
6cad4c6e 3326 `(python-mode "^\\s-*\\(?:def\\|class\\)\\>" nil "#"
45c138ac 3327 ,(lambda (arg)
2e6625b5 3328 (python-nav-end-of-defun)) nil))
45c138ac 3329
82c2b0de
FEG
3330 (set (make-local-variable 'mode-require-final-newline) t)
3331
45c138ac
FEG
3332 (set (make-local-variable 'outline-regexp)
3333 (python-rx (* space) block-start))
3334 (set (make-local-variable 'outline-heading-end-regexp) ":\\s-*\n")
3335 (set (make-local-variable 'outline-level)
3336 #'(lambda ()
3337 "`outline-level' function for Python mode."
3338 (1+ (/ (current-indentation) python-indent-offset))))
3339
e2803784
FEG
3340 (python-skeleton-add-menu-items)
3341
e0cc4efa
FEG
3342 (make-local-variable 'python-shell-internal-buffer)
3343
45c138ac
FEG
3344 (when python-indent-guess-indent-offset
3345 (python-indent-guess-indent-offset)))
3346
3347
3348(provide 'python)
d617c457
FEG
3349
3350;; Local Variables:
3351;; coding: utf-8
3352;; indent-tabs-mode: nil
3353;; End:
3354
45c138ac 3355;;; python.el ends here