Enhancements to internal python shell naming.
[bpt/emacs.git] / lisp / progmodes / python.el
CommitLineData
33d0aec1 1;;; python.el --- Python's flying circus support for Emacs
45c138ac 2
e2d8d479 3;; Copyright (C) 2010, 2011 Free Software Foundation, Inc.
45c138ac
FEG
4
5;; Author: Fabián E. Gallina <fabian@anue.biz>
b7f13559
FEG
6;; URL: https://github.com/fgallina/python.el
7;; Version: 0.23.1
45c138ac
FEG
8;; Maintainer: FSF
9;; Created: Jul 2010
10;; Keywords: languages
11
12;; This file is NOT part of GNU Emacs.
13
14;; python.el is free software: you can redistribute it and/or modify
15;; it under the terms of the GNU General Public License as published by
16;; the Free Software Foundation, either version 3 of the License, or
17;; (at your option) any later version.
18
19;; python.el is distributed in the hope that it will be useful,
20;; but WITHOUT ANY WARRANTY; without even the implied warranty of
21;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22;; GNU General Public License for more details.
23
24;; You should have received a copy of the GNU General Public License
25;; along with python.el. If not, see <http://www.gnu.org/licenses/>.
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
33;; While it probably has less features than Dave Love's python.el and
34;; PSF's python-mode.el it provides the main stuff you'll need while
35;; keeping it simple :)
36
37;; Implements Syntax highlighting, Indentation, Movement, Shell
64348c32
FEG
38;; interaction, Shell completion, Shell virtualenv support, Pdb
39;; tracking, Symbol completion, Skeletons, FFAP, Code Check, Eldoc,
40;; imenu.
45c138ac
FEG
41
42;; Syntax highlighting: Fontification of code is provided and supports
43;; python's triple quoted strings properly.
44
45;; Indentation: Automatic indentation with indentation cycling is
46;; provided, it allows you to navigate different available levels of
67845102
FEG
47;; indentation by hitting <tab> several times. Also when inserting a
48;; colon the `python-indent-electric-colon' command is invoked and
49;; causes the current line to be dedented automatically if needed.
45c138ac
FEG
50
51;; Movement: `beginning-of-defun' and `end-of-defun' functions are
fc6c545e 52;; properly implemented. There are also specialized
4cafacb5
FEG
53;; `forward-sentence' and `backward-sentence' replacements
54;; (`python-nav-forward-sentence', `python-nav-backward-sentence'
55;; respectively). Extra functions `python-nav-sentence-start' and
56;; `python-nav-sentence-end' are included to move to the beginning and
57;; to the end of a setence while taking care of multiline definitions.
fc6c545e
FEG
58;; `python-nav-jump-to-defun' is provided and allows jumping to a
59;; function or class definition quickly in the current buffer.
45c138ac 60
fc6c545e 61;; Shell interaction: is provided and allows you to execute easily any
45c138ac
FEG
62;; block of code of your current buffer in an inferior Python process.
63
64;; Shell completion: hitting tab will try to complete the current
4e531f7a 65;; word. Shell completion is implemented in a manner that if you
45c138ac
FEG
66;; change the `python-shell-interpreter' to any other (for example
67;; IPython) it should be easy to integrate another way to calculate
57808175 68;; completions. You just need to specify your custom
45c138ac 69;; `python-shell-completion-setup-code' and
4cafacb5 70;; `python-shell-completion-string-code'.
62feb915
FEG
71
72;; Here is a complete example of the settings you would use for
1faf2911 73;; iPython 0.11:
62feb915
FEG
74
75;; (setq
76;; python-shell-interpreter "ipython"
77;; python-shell-interpreter-args ""
78;; python-shell-prompt-regexp "In \\[[0-9]+\\]: "
79;; python-shell-prompt-output-regexp "Out\\[[0-9]+\\]: "
80;; python-shell-completion-setup-code ""
81;; python-shell-completion-string-code
1faf2911
FEG
82;; "';'.join(get_ipython().Completer.all_completions('''%s'''))\n")
83
84;; For iPython 0.10 everything would be the same except for
85;; `python-shell-completion-string-code':
86
87;; (setq python-shell-completion-string-code
88;; "';'.join(__IP.complete('''%s'''))\n")
45c138ac 89
099bf010
FEG
90;; Please note that the default completion system depends on the
91;; readline module, so if you are using some Operating System that
92;; bundles Python without it (like Windows) just install the
93;; pyreadline from http://ipython.scipy.org/moin/PyReadline/Intro and
94;; you should be good to go.
95
64348c32
FEG
96;; Shell virtualenv support: The shell also contains support for
97;; virtualenvs and other special environment modifications thanks to
66bbb27f
FEG
98;; `python-shell-process-environment' and `python-shell-exec-path'.
99;; These two variables allows you to modify execution paths and
307bd2e8 100;; environment variables to make easy for you to setup virtualenv rules
64348c32 101;; or behavior modifications when running shells. Here is an example
66bbb27f
FEG
102;; of how to make shell processes to be run using the /path/to/env/
103;; virtualenv:
104
105;; (setq python-shell-process-environment
106;; (list
107;; (format "PATH=%s" (mapconcat
108;; 'identity
109;; (reverse
110;; (cons (getenv "PATH")
111;; '("/path/to/env/bin/")))
112;; ":"))
113;; "VIRTUAL_ENV=/path/to/env/"))
114;; (python-shell-exec-path . ("/path/to/env/bin/"))
115
64348c32
FEG
116;; Since the above is cumbersome and can be programatically
117;; calculated, the variable `python-shell-virtualenv-path' is
118;; provided. When this variable is set with the path of the
119;; virtualenv to use, `process-environment' and `exec-path' get proper
120;; values in order to run shells inside the specified virtualenv. So
121;; the following will achieve the same as the previous example:
122
123;; (setq python-shell-virtualenv-path "/path/to/env/")
124
929036b4
FEG
125;; Also the `python-shell-extra-pythonpaths' variable have been
126;; introduced as simple way of adding paths to the PYTHONPATH without
127;; affecting existing values.
128
45c138ac
FEG
129;; Pdb tracking: when you execute a block of code that contains some
130;; call to pdb (or ipdb) it will prompt the block of code and will
131;; follow the execution of pdb marking the current line with an arrow.
132
4e531f7a 133;; Symbol completion: you can complete the symbol at point. It uses
45c138ac
FEG
134;; the shell completion in background so you should run
135;; `python-shell-send-buffer' from time to time to get better results.
136
e2803784
FEG
137;; Skeletons: 6 skeletons are provided for simple inserting of class,
138;; def, for, if, try and while. These skeletons are integrated with
139;; dabbrev. If you have `dabbrev-mode' activated and
140;; `python-skeleton-autoinsert' is set to t, then whenever you type
141;; the name of any of those defined and hit SPC, they will be
142;; automatically expanded.
143
2947016a
FEG
144;; FFAP: You can find the filename for a given module when using ffap
145;; out of the box. This feature needs an inferior python shell
146;; running.
147
2d63ad56
FEG
148;; Code check: Check the current file for errors with `python-check'
149;; using the program defined in `python-check-command'.
8b3e0e76 150
45c138ac 151;; Eldoc: returns documentation for object at point by using the
4e531f7a 152;; inferior python subprocess to inspect its documentation. As you
45c138ac
FEG
153;; might guessed you should run `python-shell-send-buffer' from time
154;; to time to get better results too.
155
4cafacb5
FEG
156;; imenu: This mode supports imenu. It builds a plain or tree menu
157;; depending on the value of `python-imenu-make-tree'. Also you can
fc2dc7df
FEG
158;; customize if menu items should include its type using
159;; `python-imenu-include-defun-type'.
160
57808175
FEG
161;; If you used python-mode.el you probably will miss auto-indentation
162;; when inserting newlines. To achieve the same behavior you have
163;; two options:
164
165;; 1) Use GNU/Emacs' standard binding for `newline-and-indent': C-j.
166
167;; 2) Add the following hook in your .emacs:
168
169;; (add-hook 'python-mode-hook
170;; #'(lambda ()
171;; (define-key python-mode-map "\C-m" 'newline-and-indent)))
172
173;; I'd recommend the first one since you'll get the same behavior for
174;; all modes out-of-the-box.
175
45c138ac
FEG
176;;; Installation:
177
178;; Add this to your .emacs:
179
180;; (add-to-list 'load-path "/folder/containing/file")
181;; (require 'python)
182
183;;; TODO:
184
45c138ac
FEG
185;;; Code:
186
45c138ac 187(require 'ansi-color)
73ed6836 188(require 'comint)
45c138ac
FEG
189
190(eval-when-compile
73ed6836
FEG
191 (require 'cl)
192 ;; Avoid compiler warnings
193 (defvar view-return-to-alist)
194 (defvar compilation-error-regexp-alist)
195 (defvar outline-heading-end-regexp))
45c138ac
FEG
196
197(autoload 'comint-mode "comint")
198
199;;;###autoload
200(add-to-list 'auto-mode-alist (cons (purecopy "\\.py\\'") 'python-mode))
201;;;###autoload
202(add-to-list 'interpreter-mode-alist (cons (purecopy "python") 'python-mode))
203
204(defgroup python nil
205 "Python Language's flying circus support for Emacs."
206 :group 'languages
207 :version "23.2"
208 :link '(emacs-commentary-link "python"))
209
210\f
211;;; Bindings
212
213(defvar python-mode-map
214 (let ((map (make-sparse-keymap)))
9fff1858
FEG
215 ;; Movement
216 (substitute-key-definition 'backward-sentence
217 'python-nav-backward-sentence
218 map global-map)
219 (substitute-key-definition 'forward-sentence
220 'python-nav-forward-sentence
221 map global-map)
fc6c545e 222 (define-key map "\C-c\C-j" 'python-nav-jump-to-defun)
45c138ac
FEG
223 ;; Indent specific
224 (define-key map "\177" 'python-indent-dedent-line-backspace)
225 (define-key map (kbd "<backtab>") 'python-indent-dedent-line)
226 (define-key map "\C-c<" 'python-indent-shift-left)
227 (define-key map "\C-c>" 'python-indent-shift-right)
ffdb56c3 228 (define-key map ":" 'python-indent-electric-colon)
e2803784
FEG
229 ;; Skeletons
230 (define-key map "\C-c\C-tc" 'python-skeleton-class)
231 (define-key map "\C-c\C-td" 'python-skeleton-def)
232 (define-key map "\C-c\C-tf" 'python-skeleton-for)
233 (define-key map "\C-c\C-ti" 'python-skeleton-if)
234 (define-key map "\C-c\C-tt" 'python-skeleton-try)
235 (define-key map "\C-c\C-tw" 'python-skeleton-while)
45c138ac
FEG
236 ;; Shell interaction
237 (define-key map "\C-c\C-s" 'python-shell-send-string)
238 (define-key map "\C-c\C-r" 'python-shell-send-region)
239 (define-key map "\C-\M-x" 'python-shell-send-defun)
240 (define-key map "\C-c\C-c" 'python-shell-send-buffer)
241 (define-key map "\C-c\C-l" 'python-shell-send-file)
242 (define-key map "\C-c\C-z" 'python-shell-switch-to-shell)
8b3e0e76
FEG
243 ;; Some util commands
244 (define-key map "\C-c\C-v" 'python-check)
78334b43 245 (define-key map "\C-c\C-f" 'python-eldoc-at-point)
45c138ac
FEG
246 ;; Utilities
247 (substitute-key-definition 'complete-symbol 'completion-at-point
248 map global-map)
249 (easy-menu-define python-menu map "Python Mode menu"
250 `("Python"
251 :help "Python-specific Features"
252 ["Shift region left" python-indent-shift-left :active mark-active
253 :help "Shift region left by a single indentation step"]
254 ["Shift region right" python-indent-shift-right :active mark-active
255 :help "Shift region right by a single indentation step"]
256 "-"
45c138ac
FEG
257 ["Start of def/class" beginning-of-defun
258 :help "Go to start of outermost definition around point"]
45c138ac
FEG
259 ["End of def/class" end-of-defun
260 :help "Go to end of definition around point"]
fc6c545e
FEG
261 ["Mark def/class" mark-defun
262 :help "Mark outermost definition around point"]
263 ["Jump to def/class" python-nav-jump-to-defun
264 :help "Jump to a class or function definition"]
265 "--"
e2803784 266 ("Skeletons")
fc6c545e 267 "---"
45c138ac
FEG
268 ["Start interpreter" run-python
269 :help "Run inferior Python process in a separate buffer"]
270 ["Switch to shell" python-shell-switch-to-shell
271 :help "Switch to running inferior Python process"]
272 ["Eval string" python-shell-send-string
273 :help "Eval string in inferior Python session"]
274 ["Eval buffer" python-shell-send-buffer
275 :help "Eval buffer in inferior Python session"]
276 ["Eval region" python-shell-send-region
277 :help "Eval region in inferior Python session"]
278 ["Eval defun" python-shell-send-defun
279 :help "Eval defun in inferior Python session"]
280 ["Eval file" python-shell-send-file
281 :help "Eval file in inferior Python session"]
282 ["Debugger" pdb :help "Run pdb under GUD"]
fc6c545e 283 "----"
8b3e0e76
FEG
284 ["Check file" python-check
285 :help "Check file for errors"]
78334b43
FEG
286 ["Help on symbol" python-eldoc-at-point
287 :help "Get help on symbol at point"]
45c138ac
FEG
288 ["Complete symbol" completion-at-point
289 :help "Complete symbol before point"]))
290 map)
291 "Keymap for `python-mode'.")
292
293\f
294;;; Python specialized rx
295
73ed6836
FEG
296(eval-when-compile
297 (defconst python-rx-constituents
298 (list
299 `(block-start . ,(rx symbol-start
300 (or "def" "class" "if" "elif" "else" "try"
301 "except" "finally" "for" "while" "with")
302 symbol-end))
0567effb
FEG
303 `(decorator . ,(rx line-start (* space) ?@ (any letter ?_)
304 (* (any word ?_))))
73ed6836 305 `(defun . ,(rx symbol-start (or "def" "class") symbol-end))
0567effb 306 `(symbol-name . ,(rx (any letter ?_) (* (any word ?_))))
73ed6836
FEG
307 `(open-paren . ,(rx (or "{" "[" "(")))
308 `(close-paren . ,(rx (or "}" "]" ")")))
309 `(simple-operator . ,(rx (any ?+ ?- ?/ ?& ?^ ?~ ?| ?* ?< ?> ?= ?%)))
310 `(not-simple-operator . ,(rx (not (any ?+ ?- ?/ ?& ?^ ?~ ?| ?* ?< ?> ?= ?%))))
311 `(operator . ,(rx (or "+" "-" "/" "&" "^" "~" "|" "*" "<" ">"
312 "=" "%" "**" "//" "<<" ">>" "<=" "!="
313 "==" ">=" "is" "not")))
314 `(assignment-operator . ,(rx (or "=" "+=" "-=" "*=" "/=" "//=" "%=" "**="
e2d8d479
FEG
315 ">>=" "<<=" "&=" "^=" "|="))))
316 "Additional Python specific sexps for `python-rx'"))
45c138ac
FEG
317
318(defmacro python-rx (&rest regexps)
4cafacb5 319 "Python mode specialized rx macro which supports common python named REGEXPS."
45c138ac
FEG
320 (let ((rx-constituents (append python-rx-constituents rx-constituents)))
321 (cond ((null regexps)
322 (error "No regexp"))
323 ((cdr regexps)
324 (rx-to-string `(and ,@regexps) t))
325 (t
326 (rx-to-string (car regexps) t)))))
327
328\f
329;;; Font-lock and syntax
330
331(defvar python-font-lock-keywords
332 ;; Keywords
333 `(,(rx symbol-start
334 (or "and" "del" "from" "not" "while" "as" "elif" "global" "or" "with"
335 "assert" "else" "if" "pass" "yield" "break" "except" "import"
336 "print" "class" "exec" "in" "raise" "continue" "finally" "is"
337 "return" "def" "for" "lambda" "try" "self")
338 symbol-end)
339 ;; functions
340 (,(rx symbol-start "def" (1+ space) (group (1+ (or word ?_))))
341 (1 font-lock-function-name-face))
342 ;; classes
343 (,(rx symbol-start "class" (1+ space) (group (1+ (or word ?_))))
344 (1 font-lock-type-face))
345 ;; Constants
c61d750e
FEG
346 (,(rx symbol-start
347 ;; copyright, license, credits, quit, exit are added by the
348 ;; site module and since they are not intended to be used in
349 ;; programs they are not added here either.
350 (or "None" "True" "False" "Ellipsis" "__debug__" "NotImplemented")
351 symbol-end) . font-lock-constant-face)
45c138ac
FEG
352 ;; Decorators.
353 (,(rx line-start (* (any " \t")) (group "@" (1+ (or word ?_))
354 (0+ "." (1+ (or word ?_)))))
355 (1 font-lock-type-face))
356 ;; Builtin Exceptions
357 (,(rx symbol-start
358 (or "ArithmeticError" "AssertionError" "AttributeError"
359 "BaseException" "BufferError" "BytesWarning" "DeprecationWarning"
360 "EOFError" "EnvironmentError" "Exception" "FloatingPointError"
361 "FutureWarning" "GeneratorExit" "IOError" "ImportError"
362 "ImportWarning" "IndentationError" "IndexError" "KeyError"
363 "KeyboardInterrupt" "LookupError" "MemoryError" "NameError"
c61d750e 364 "NotImplementedError" "OSError" "OverflowError"
45c138ac
FEG
365 "PendingDeprecationWarning" "ReferenceError" "RuntimeError"
366 "RuntimeWarning" "StandardError" "StopIteration" "SyntaxError"
367 "SyntaxWarning" "SystemError" "SystemExit" "TabError" "TypeError"
368 "UnboundLocalError" "UnicodeDecodeError" "UnicodeEncodeError"
369 "UnicodeError" "UnicodeTranslateError" "UnicodeWarning"
370 "UserWarning" "ValueError" "Warning" "ZeroDivisionError")
371 symbol-end) . font-lock-type-face)
372 ;; Builtins
9438f1ef
FEG
373 (,(rx symbol-start
374 (or "_" "__doc__" "__import__" "__name__" "__package__" "abs" "all"
375 "any" "apply" "basestring" "bin" "bool" "buffer" "bytearray"
376 "bytes" "callable" "chr" "classmethod" "cmp" "coerce" "compile"
377 "complex" "delattr" "dict" "dir" "divmod" "enumerate" "eval"
378 "execfile" "file" "filter" "float" "format" "frozenset"
379 "getattr" "globals" "hasattr" "hash" "help" "hex" "id" "input"
380 "int" "intern" "isinstance" "issubclass" "iter" "len" "list"
381 "locals" "long" "map" "max" "min" "next" "object" "oct" "open"
382 "ord" "pow" "print" "property" "range" "raw_input" "reduce"
383 "reload" "repr" "reversed" "round" "set" "setattr" "slice"
384 "sorted" "staticmethod" "str" "sum" "super" "tuple" "type"
385 "unichr" "unicode" "vars" "xrange" "zip")
386 symbol-end) . font-lock-builtin-face)
45c138ac
FEG
387 ;; asignations
388 ;; support for a = b = c = 5
389 (,(lambda (limit)
d8e594db
FEG
390 (let ((re (python-rx (group (+ (any word ?. ?_)))
391 (? ?\[ (+ (not (any ?\]))) ?\]) (* space)
45c138ac
FEG
392 assignment-operator)))
393 (when (re-search-forward re limit t)
14a78495 394 (while (and (python-info-ppss-context 'paren)
45c138ac 395 (re-search-forward re limit t)))
14a78495 396 (if (and (not (python-info-ppss-context 'paren))
534e2438 397 (not (equal (char-after (point-marker)) ?=)))
45c138ac
FEG
398 t
399 (set-match-data nil)))))
400 (1 font-lock-variable-name-face nil nil))
401 ;; support for a, b, c = (1, 2, 3)
402 (,(lambda (limit)
403 (let ((re (python-rx (group (+ (any word ?. ?_))) (* space)
404 (* ?, (* space) (+ (any word ?. ?_)) (* space))
405 ?, (* space) (+ (any word ?. ?_)) (* space)
406 assignment-operator)))
407 (when (and (re-search-forward re limit t)
408 (goto-char (nth 3 (match-data))))
14a78495 409 (while (and (python-info-ppss-context 'paren)
45c138ac
FEG
410 (re-search-forward re limit t))
411 (goto-char (nth 3 (match-data))))
14a78495 412 (if (not (python-info-ppss-context 'paren))
45c138ac
FEG
413 t
414 (set-match-data nil)))))
415 (1 font-lock-variable-name-face nil nil))))
416
45c138ac 417(defconst python-font-lock-syntactic-keywords
ecf24fd7
FEG
418 ;; Make outer chars of matching triple-quote sequences into generic
419 ;; string delimiters. Fixme: Is there a better way?
45c138ac 420 ;; First avoid a sequence preceded by an odd number of backslashes.
ecf24fd7
FEG
421 `((,(concat "\\(?:\\([RUru]\\)[Rr]?\\|^\\|[^\\]\\(?:\\\\.\\)*\\)" ;Prefix.
422 "\\(?:\\('\\)'\\('\\)\\|\\(?2:\"\\)\"\\(?3:\"\\)\\)")
423 (3 (python-quote-syntax)))))
424
425(defun python-quote-syntax ()
45c138ac
FEG
426 "Put `syntax-table' property correctly on triple quote.
427Used for syntactic keywords. N is the match number (1, 2 or 3)."
428 ;; Given a triple quote, we have to check the context to know
429 ;; whether this is an opening or closing triple or whether it's
430 ;; quoted anyhow, and should be ignored. (For that we need to do
431 ;; the same job as `syntax-ppss' to be correct and it seems to be OK
432 ;; to use it here despite initial worries.) We also have to sort
433 ;; out a possible prefix -- well, we don't _have_ to, but I think it
434 ;; should be treated as part of the string.
435
436 ;; Test cases:
437 ;; ur"""ar""" x='"' # """
438 ;; x = ''' """ ' a
439 ;; '''
440 ;; x '"""' x """ \"""" x
441 (save-excursion
442 (goto-char (match-beginning 0))
ecf24fd7
FEG
443 (let ((syntax (save-match-data (syntax-ppss))))
444 (cond
445 ((eq t (nth 3 syntax)) ; after unclosed fence
446 ;; Consider property for the last char if in a fenced string.
447 (goto-char (nth 8 syntax)) ; fence position
448 (skip-chars-forward "uUrR") ; skip any prefix
449 ;; Is it a matching sequence?
450 (if (eq (char-after) (char-after (match-beginning 2)))
451 (put-text-property (match-beginning 3) (match-end 3)
452 'syntax-table (string-to-syntax "|"))))
453 ((match-end 1)
454 ;; Consider property for initial char, accounting for prefixes.
455 (put-text-property (match-beginning 1) (match-end 1)
456 'syntax-table (string-to-syntax "|")))
457 (t
458 ;; Consider property for initial char, accounting for prefixes.
459 (put-text-property (match-beginning 2) (match-end 2)
460 'syntax-table (string-to-syntax "|"))))
461 )))
45c138ac
FEG
462
463(defvar python-mode-syntax-table
464 (let ((table (make-syntax-table)))
465 ;; Give punctuation syntax to ASCII that normally has symbol
466 ;; syntax or has word syntax and isn't a letter.
467 (let ((symbol (string-to-syntax "_"))
468 (sst (standard-syntax-table)))
469 (dotimes (i 128)
470 (unless (= i ?_)
471 (if (equal symbol (aref sst i))
472 (modify-syntax-entry i "." table)))))
473 (modify-syntax-entry ?$ "." table)
474 (modify-syntax-entry ?% "." table)
475 ;; exceptions
476 (modify-syntax-entry ?# "<" table)
477 (modify-syntax-entry ?\n ">" table)
478 (modify-syntax-entry ?' "\"" table)
479 (modify-syntax-entry ?` "$" table)
480 table)
481 "Syntax table for Python files.")
482
483(defvar python-dotty-syntax-table
484 (let ((table (make-syntax-table python-mode-syntax-table)))
485 (modify-syntax-entry ?. "w" table)
486 (modify-syntax-entry ?_ "w" table)
487 table)
488 "Dotty syntax table for Python files.
489It makes underscores and dots word constituent chars.")
490
491\f
492;;; Indentation
493
494(defcustom python-indent-offset 4
495 "Default indentation offset for Python."
496 :group 'python
497 :type 'integer
498 :safe 'integerp)
499
500(defcustom python-indent-guess-indent-offset t
501 "Non-nil tells Python mode to guess `python-indent-offset' value."
502 :type 'boolean
0f55249e
FEG
503 :group 'python
504 :safe 'booleanp)
45c138ac
FEG
505
506(defvar python-indent-current-level 0
507 "Current indentation level `python-indent-line-function' is using.")
508
509(defvar python-indent-levels '(0)
510 "Levels of indentation available for `python-indent-line-function'.")
511
512(defvar python-indent-dedenters '("else" "elif" "except" "finally")
513 "List of words that should be dedented.
514These make `python-indent-calculate-indentation' subtract the value of
515`python-indent-offset'.")
516
517(defun python-indent-guess-indent-offset ()
954aa7bd 518 "Guess and set `python-indent-offset' for the current buffer."
bbac1eb8
FEG
519 (save-excursion
520 (save-restriction
521 (widen)
522 (goto-char (point-min))
523 (let ((found-block))
524 (while (and (not found-block)
525 (re-search-forward
526 (python-rx line-start block-start) nil t))
14a78495
FEG
527 (when (and (not (python-info-ppss-context 'string))
528 (not (python-info-ppss-context 'comment))
bbac1eb8
FEG
529 (progn
530 (goto-char (line-end-position))
589cefd7 531 (forward-comment -9999)
bbac1eb8
FEG
532 (eq ?: (char-before))))
533 (setq found-block t)))
534 (if (not found-block)
535 (message "Can't guess python-indent-offset, using defaults: %s"
536 python-indent-offset)
537 (while (and (progn
538 (goto-char (line-end-position))
539 (python-info-continuation-line-p))
540 (not (eobp)))
541 (forward-line 1))
542 (forward-line 1)
589cefd7 543 (forward-comment 9999)
14d9f80c
FEG
544 (let ((indent-offset (current-indentation)))
545 (when (> indent-offset 0)
546 (setq python-indent-offset indent-offset))))))))
45c138ac 547
e2d8d479
FEG
548(defun python-indent-context ()
549 "Get information on indentation context.
550Context information is returned with a cons with the form:
551 \(STATUS . START)
45c138ac
FEG
552
553Where status can be any of the following symbols:
45c138ac
FEG
554 * inside-paren: If point in between (), {} or []
555 * inside-string: If point is inside a string
556 * after-backslash: Previous line ends in a backslash
557 * after-beginning-of-block: Point is after beginning of block
558 * after-line: Point is after normal line
559 * no-indent: Point is at beginning of buffer or other special case
45c138ac
FEG
560START is the buffer position where the sexp starts."
561 (save-restriction
562 (widen)
563 (let ((ppss (save-excursion (beginning-of-line) (syntax-ppss)))
564 (start))
565 (cons
566 (cond
69bab1de 567 ;; Beginning of buffer
19b122e4
FEG
568 ((save-excursion
569 (goto-char (line-beginning-position))
570 (bobp))
69bab1de 571 'no-indent)
45c138ac 572 ;; Inside a paren
14a78495 573 ((setq start (python-info-ppss-context 'paren ppss))
45c138ac
FEG
574 'inside-paren)
575 ;; Inside string
14a78495 576 ((setq start (python-info-ppss-context 'string ppss))
45c138ac
FEG
577 'inside-string)
578 ;; After backslash
14a78495
FEG
579 ((setq start (when (not (or (python-info-ppss-context 'string ppss)
580 (python-info-ppss-context 'comment ppss)))
45c138ac
FEG
581 (let ((line-beg-pos (line-beginning-position)))
582 (when (eq ?\\ (char-before (1- line-beg-pos)))
583 (- line-beg-pos 2)))))
584 'after-backslash)
585 ;; After beginning of block
586 ((setq start (save-excursion
587 (let ((block-regexp (python-rx block-start))
588 (block-start-line-end ":[[:space:]]*$"))
589 (back-to-indentation)
257b0017 590 (forward-comment -9999)
45c138ac
FEG
591 (back-to-indentation)
592 (when (or (python-info-continuation-line-p)
593 (and (not (looking-at block-regexp))
594 (save-excursion
595 (re-search-forward
596 block-start-line-end
597 (line-end-position) t))))
598 (while (and (forward-line -1)
599 (python-info-continuation-line-p)
600 (not (bobp))))
fad22dec 601 (back-to-indentation)
45c138ac
FEG
602 (when (not (looking-at block-regexp))
603 (forward-line 1)))
604 (back-to-indentation)
605 (when (and (looking-at block-regexp)
606 (or (re-search-forward
607 block-start-line-end
608 (line-end-position) t)
fad22dec
FEG
609 (save-excursion
610 (goto-char (line-end-position))
611 (python-info-continuation-line-p))))
45c138ac
FEG
612 (point-marker)))))
613 'after-beginning-of-block)
614 ;; After normal line
615 ((setq start (save-excursion
257b0017
FEG
616 (back-to-indentation)
617 (forward-comment -9999)
3697b531 618 (python-nav-sentence-start)
45c138ac
FEG
619 (point-marker)))
620 'after-line)
621 ;; Do not indent
622 (t 'no-indent))
623 start))))
624
625(defun python-indent-calculate-indentation ()
626 "Calculate correct indentation offset for the current line."
627 (let* ((indentation-context (python-indent-context))
628 (context-status (car indentation-context))
629 (context-start (cdr indentation-context)))
630 (save-restriction
631 (widen)
632 (save-excursion
633 (case context-status
634 ('no-indent 0)
635 ('after-beginning-of-block
636 (goto-char context-start)
637 (+ (current-indentation) python-indent-offset))
638 ('after-line
639 (-
640 (save-excursion
641 (goto-char context-start)
642 (current-indentation))
643 (if (progn
644 (back-to-indentation)
645 (looking-at (regexp-opt python-indent-dedenters)))
646 python-indent-offset
647 0)))
648 ('inside-string
649 (goto-char context-start)
650 (current-indentation))
651 ('after-backslash
652 (let* ((block-continuation
653 (save-excursion
654 (forward-line -1)
655 (python-info-block-continuation-line-p)))
656 (assignment-continuation
657 (save-excursion
658 (forward-line -1)
659 (python-info-assignment-continuation-line-p)))
9f1537ef
FEG
660 (dot-continuation
661 (save-excursion
662 (back-to-indentation)
663 (when (looking-at "\\.")
664 (forward-line -1)
107c2439
FEG
665 (goto-char (line-end-position))
666 (while (and (re-search-backward "\\." (line-beginning-position) t)
667 (or (python-info-ppss-context 'comment)
668 (python-info-ppss-context 'string)
669 (python-info-ppss-context 'paren))))
670 (if (and (looking-at "\\.")
671 (not (or (python-info-ppss-context 'comment)
672 (python-info-ppss-context 'string)
673 (python-info-ppss-context 'paren))))
674 (current-column)
675 (+ (current-indentation) python-indent-offset)))))
676 (indentation (cond
677 (dot-continuation
678 dot-continuation)
679 (block-continuation
680 (goto-char block-continuation)
681 (re-search-forward
682 (python-rx block-start (* space))
683 (line-end-position) t)
684 (current-column))
685 (assignment-continuation
686 (goto-char assignment-continuation)
687 (re-search-forward
688 (python-rx simple-operator)
689 (line-end-position) t)
690 (forward-char 1)
691 (re-search-forward
692 (python-rx (* space))
693 (line-end-position) t)
694 (current-column))
695 (t
696 (goto-char context-start)
9787f829
FEG
697 (if (not
698 (save-excursion
699 (back-to-indentation)
700 (looking-at
701 "\\(?:return\\|from\\|import\\)\s+")))
107c2439
FEG
702 (current-indentation)
703 (+ (current-indentation)
9787f829
FEG
704 (length
705 (match-string-no-properties 0))))))))
45c138ac
FEG
706 indentation))
707 ('inside-paren
17d13b85 708 (or (save-excursion
f8994527 709 (skip-syntax-forward "\s" (line-end-position))
f9471190
FEG
710 (when (and (looking-at (regexp-opt '(")" "]" "}")))
711 (not (forward-char 1))
712 (not (python-info-ppss-context 'paren)))
17d13b85
FEG
713 (goto-char context-start)
714 (back-to-indentation)
715 (current-column)))
716 (-
717 (save-excursion
718 (goto-char context-start)
719 (forward-char)
720 (save-restriction
721 (narrow-to-region
722 (line-beginning-position)
723 (line-end-position))
589cefd7 724 (forward-comment 9999))
17d13b85
FEG
725 (if (looking-at "$")
726 (+ (current-indentation) python-indent-offset)
589cefd7 727 (forward-comment 9999)
17d13b85
FEG
728 (current-column)))
729 (if (progn
730 (back-to-indentation)
731 (looking-at (regexp-opt '(")" "]" "}"))))
732 python-indent-offset
733 0)))))))))
45c138ac
FEG
734
735(defun python-indent-calculate-levels ()
736 "Calculate `python-indent-levels' and reset `python-indent-current-level'."
737 (let* ((indentation (python-indent-calculate-indentation))
738 (remainder (% indentation python-indent-offset))
739 (steps (/ (- indentation remainder) python-indent-offset)))
65e4f764 740 (setq python-indent-levels (list 0))
45c138ac 741 (dotimes (step steps)
65e4f764 742 (push (* python-indent-offset (1+ step)) python-indent-levels))
45c138ac 743 (when (not (eq 0 remainder))
65e4f764 744 (push (+ (* python-indent-offset steps) remainder) python-indent-levels))
45c138ac
FEG
745 (setq python-indent-levels (nreverse python-indent-levels))
746 (setq python-indent-current-level (1- (length python-indent-levels)))))
747
748(defun python-indent-toggle-levels ()
749 "Toggle `python-indent-current-level' over `python-indent-levels'."
750 (setq python-indent-current-level (1- python-indent-current-level))
751 (when (< python-indent-current-level 0)
752 (setq python-indent-current-level (1- (length python-indent-levels)))))
753
754(defun python-indent-line (&optional force-toggle)
755 "Internal implementation of `python-indent-line-function'.
45c138ac
FEG
756Uses the offset calculated in
757`python-indent-calculate-indentation' and available levels
e2d8d479
FEG
758indicated by the variable `python-indent-levels' to set the
759current indentation.
45c138ac
FEG
760
761When the variable `last-command' is equal to
e2d8d479
FEG
762`indent-for-tab-command' or FORCE-TOGGLE is non-nil it cycles
763levels indicated in the variable `python-indent-levels' by
764setting the current level in the variable
765`python-indent-current-level'.
45c138ac
FEG
766
767When the variable `last-command' is not equal to
e2d8d479
FEG
768`indent-for-tab-command' and FORCE-TOGGLE is nil it calculates
769possible indentation levels and saves it in the variable
770`python-indent-levels'. Afterwards it sets the variable
771`python-indent-current-level' correctly so offset is equal
772to (`nth' `python-indent-current-level' `python-indent-levels')"
45c138ac
FEG
773 (if (or (and (eq this-command 'indent-for-tab-command)
774 (eq last-command this-command))
775 force-toggle)
86f1889a
FEG
776 (if (not (equal python-indent-levels '(0)))
777 (python-indent-toggle-levels)
778 (python-indent-calculate-levels))
45c138ac
FEG
779 (python-indent-calculate-levels))
780 (beginning-of-line)
781 (delete-horizontal-space)
782 (indent-to (nth python-indent-current-level python-indent-levels))
783 (save-restriction
784 (widen)
785 (let ((closing-block-point (python-info-closing-block)))
786 (when closing-block-point
787 (message "Closes %s" (buffer-substring
788 closing-block-point
789 (save-excursion
790 (goto-char closing-block-point)
791 (line-end-position))))))))
792
793(defun python-indent-line-function ()
794 "`indent-line-function' for Python mode.
e2d8d479 795See `python-indent-line' for details."
45c138ac
FEG
796 (python-indent-line))
797
798(defun python-indent-dedent-line ()
e2d8d479 799 "De-indent current line."
45c138ac 800 (interactive "*")
14a78495
FEG
801 (when (and (not (or (python-info-ppss-context 'string)
802 (python-info-ppss-context 'comment)))
45c138ac
FEG
803 (<= (point-marker) (save-excursion
804 (back-to-indentation)
805 (point-marker)))
806 (> (current-column) 0))
807 (python-indent-line t)
808 t))
809
810(defun python-indent-dedent-line-backspace (arg)
e2d8d479 811 "De-indent current line.
45c138ac 812Argument ARG is passed to `backward-delete-char-untabify' when
e2d8d479 813point is not in between the indentation."
45c138ac
FEG
814 (interactive "*p")
815 (when (not (python-indent-dedent-line))
816 (backward-delete-char-untabify arg)))
183f9296 817(put 'python-indent-dedent-line-backspace 'delete-selection 'supersede)
45c138ac
FEG
818
819(defun python-indent-region (start end)
820 "Indent a python region automagically.
821
822Called from a program, START and END specify the region to indent."
cb42456f
FEG
823 (let ((deactivate-mark nil))
824 (save-excursion
825 (goto-char end)
826 (setq end (point-marker))
827 (goto-char start)
828 (or (bolp) (forward-line 1))
829 (while (< (point) end)
830 (or (and (bolp) (eolp))
831 (let (word)
832 (forward-line -1)
833 (back-to-indentation)
834 (setq word (current-word))
835 (forward-line 1)
836 (when word
837 (beginning-of-line)
838 (delete-horizontal-space)
839 (indent-to (python-indent-calculate-indentation)))))
840 (forward-line 1))
841 (move-marker end nil))))
45c138ac
FEG
842
843(defun python-indent-shift-left (start end &optional count)
844 "Shift lines contained in region START END by COUNT columns to the left.
e2d8d479
FEG
845COUNT defaults to `python-indent-offset'. If region isn't
846active, the current line is shifted. The shifted region includes
847the lines in which START and END lie. An error is signaled if
848any lines in the region are indented less than COUNT columns."
45c138ac
FEG
849 (interactive
850 (if mark-active
851 (list (region-beginning) (region-end) current-prefix-arg)
852 (list (line-beginning-position) (line-end-position) current-prefix-arg)))
853 (if count
854 (setq count (prefix-numeric-value count))
855 (setq count python-indent-offset))
856 (when (> count 0)
cb42456f
FEG
857 (let ((deactivate-mark nil))
858 (save-excursion
859 (goto-char start)
860 (while (< (point) end)
861 (if (and (< (current-indentation) count)
862 (not (looking-at "[ \t]*$")))
863 (error "Can't shift all lines enough"))
864 (forward-line))
865 (indent-rigidly start end (- count))))))
45c138ac
FEG
866
867(add-to-list 'debug-ignored-errors "^Can't shift all lines enough")
868
869(defun python-indent-shift-right (start end &optional count)
870 "Shift lines contained in region START END by COUNT columns to the left.
e2d8d479
FEG
871COUNT defaults to `python-indent-offset'. If region isn't
872active, the current line is shifted. The shifted region includes
873the lines in which START and END lie."
45c138ac
FEG
874 (interactive
875 (if mark-active
876 (list (region-beginning) (region-end) current-prefix-arg)
877 (list (line-beginning-position) (line-end-position) current-prefix-arg)))
cb42456f
FEG
878 (let ((deactivate-mark nil))
879 (if count
880 (setq count (prefix-numeric-value count))
881 (setq count python-indent-offset))
882 (indent-rigidly start end count)))
45c138ac 883
ffdb56c3 884(defun python-indent-electric-colon (arg)
e2d8d479
FEG
885 "Insert a colon and maybe de-indent the current line.
886With numeric ARG, just insert that many colons. With
887\\[universal-argument], just insert a single colon."
ffdb56c3
FEG
888 (interactive "*P")
889 (self-insert-command (if (not (integerp arg)) 1 arg))
c43cd8b1
FEG
890 (when (and (not arg)
891 (eolp)
892 (not (equal ?: (char-after (- (point-marker) 2))))
893 (not (or (python-info-ppss-context 'string)
894 (python-info-ppss-context 'comment))))
895 (let ((indentation (current-indentation))
896 (calculated-indentation (python-indent-calculate-indentation)))
897 (when (> indentation calculated-indentation)
898 (save-excursion
899 (indent-line-to calculated-indentation)
900 (when (not (python-info-closing-block))
901 (indent-line-to indentation)))))))
ffdb56c3
FEG
902(put 'python-indent-electric-colon 'delete-selection t)
903
45c138ac
FEG
904\f
905;;; Navigation
906
0567effb 907(defvar python-nav-beginning-of-defun-regexp
af5c1beb 908 (python-rx line-start (* space) defun (+ space) (group symbol-name))
fc6c545e 909 "Regexp matching class or function definition.
fc2dc7df
FEG
910The name of the defun should be grouped so it can be retrieved
911via `match-string'.")
45c138ac 912
6b432853 913(defun python-nav-beginning-of-defun (&optional nodecorators)
053a6c72 914 "Move point to `beginning-of-defun'.
6b432853
FEG
915When NODECORATORS is non-nil decorators are not included. This
916is the main part of`python-beginning-of-defun-function'
74d7b605 917implementation. Return non-nil if point is moved to the
fc2dc7df 918`beginning-of-defun'."
0567effb
FEG
919 (let ((indent-pos (save-excursion
920 (back-to-indentation)
921 (point-marker)))
74d7b605 922 (found)
0567effb
FEG
923 (include-decorators
924 (lambda ()
6b432853
FEG
925 (when (not nodecorators)
926 (when (save-excursion
927 (forward-line -1)
928 (looking-at (python-rx decorator)))
929 (while (and (not (bobp))
930 (forward-line -1)
931 (looking-at (python-rx decorator))))
932 (when (not (bobp)) (forward-line 1)))))))
0567effb
FEG
933 (if (and (> (point) indent-pos)
934 (save-excursion
935 (goto-char (line-beginning-position))
936 (looking-at python-nav-beginning-of-defun-regexp)))
45c138ac 937 (progn
0567effb 938 (goto-char (line-beginning-position))
74d7b605
FEG
939 (funcall include-decorators)
940 (setq found t))
0567effb 941 (goto-char (line-beginning-position))
74d7b605
FEG
942 (when (re-search-backward python-nav-beginning-of-defun-regexp nil t)
943 (setq found t))
0567effb 944 (goto-char (or (python-info-ppss-context 'string) (point)))
74d7b605
FEG
945 (funcall include-decorators))
946 found))
0567effb 947
6b432853 948(defun python-beginning-of-defun-function (&optional arg nodecorators)
0567effb
FEG
949 "Move point to the beginning of def or class.
950With positive ARG move that number of functions forward. With
6b432853 951negative do the same but backwards. When NODECORATORS is non-nil
74d7b605 952decorators are not included. Return non-nil if point is moved to the
fc2dc7df 953`beginning-of-defun'."
0567effb
FEG
954 (when (or (null arg) (= arg 0)) (setq arg 1))
955 (if (> arg 0)
74d7b605
FEG
956 (dotimes (i arg (python-nav-beginning-of-defun nodecorators)))
957 (let ((found))
958 (dotimes (i (- arg) found)
959 (python-end-of-defun-function)
589cefd7 960 (forward-comment 9999)
74d7b605
FEG
961 (goto-char (line-end-position))
962 (when (not (eobp))
963 (setq found
964 (python-nav-beginning-of-defun nodecorators)))))))
45c138ac
FEG
965
966(defun python-end-of-defun-function ()
967 "Move point to the end of def or class.
968Returns nil if point is not in a def or class."
0567effb
FEG
969 (interactive)
970 (let ((beg-defun-indent)
971 (decorator-regexp "[[:space:]]*@"))
972 (when (looking-at decorator-regexp)
973 (while (and (not (eobp))
974 (forward-line 1)
975 (looking-at decorator-regexp))))
976 (when (not (looking-at python-nav-beginning-of-defun-regexp))
977 (python-beginning-of-defun-function))
978 (setq beg-defun-indent (current-indentation))
979 (forward-line 1)
980 (while (and (forward-line 1)
981 (not (eobp))
982 (or (not (current-word))
983 (> (current-indentation) beg-defun-indent))))
589cefd7 984 (forward-comment 9999)
0567effb 985 (goto-char (line-beginning-position))))
45c138ac 986
3697b531
FEG
987(defun python-nav-sentence-start ()
988 "Move to start of current sentence."
989 (interactive "^")
990 (while (and (not (back-to-indentation))
991 (not (bobp))
992 (when (or
993 (save-excursion
994 (forward-line -1)
995 (python-info-line-ends-backslash-p))
9fff1858 996 (python-info-ppss-context 'string)
3697b531
FEG
997 (python-info-ppss-context 'paren))
998 (forward-line -1)))))
999
1000(defun python-nav-sentence-end ()
1001 "Move to end of current sentence."
1002 (interactive "^")
1003 (while (and (goto-char (line-end-position))
1004 (not (eobp))
1005 (when (or
1006 (python-info-line-ends-backslash-p)
9fff1858 1007 (python-info-ppss-context 'string)
3697b531
FEG
1008 (python-info-ppss-context 'paren))
1009 (forward-line 1)))))
1010
9fff1858 1011(defun python-nav-backward-sentence (&optional arg)
4cafacb5 1012 "Move backward to start of sentence. With ARG, do it arg times.
9fff1858
FEG
1013See `python-nav-forward-sentence' for more information."
1014 (interactive "^p")
1015 (or arg (setq arg 1))
1016 (python-nav-forward-sentence (- arg)))
1017
1018(defun python-nav-forward-sentence (&optional arg)
4cafacb5 1019 "Move forward to next end of sentence. With ARG, repeat.
9fff1858
FEG
1020With negative argument, move backward repeatedly to start of sentence."
1021 (interactive "^p")
1022 (or arg (setq arg 1))
1023 (while (> arg 0)
1024 (forward-comment 9999)
1025 (python-nav-sentence-end)
1026 (forward-line 1)
1027 (setq arg (1- arg)))
1028 (while (< arg 0)
1029 (python-nav-sentence-end)
1030 (forward-comment -9999)
1031 (python-nav-sentence-start)
1032 (forward-line -1)
1033 (setq arg (1+ arg))))
1034
fc6c545e
FEG
1035(defun python-nav-list-defun-positions (&optional include-type)
1036 "Make an Alist of defun names and point markers for current buffer.
1037When optional argument INCLUDE-TYPE is non-nil the type is
1038included the defun name."
1039 (let ((defs))
1040 (save-restriction
1041 (widen)
1042 (save-excursion
1043 (goto-char (point-max))
1044 (while (re-search-backward python-nav-beginning-of-defun-regexp nil t)
1045 (when (and (not (python-info-ppss-context 'string))
1046 (not (python-info-ppss-context 'comment))
1047 (not (python-info-ppss-context 'parent)))
1048 (add-to-list
1049 'defs (cons
1050 (python-info-current-defun include-type)
1051 (point-marker)))))
1052 defs))))
1053
1054(defun python-nav-read-defun ()
1055 "Read a defun name of current buffer and return its point marker.
1056A cons cell with the form (DEFUN-NAME . POINT-MARKER) is returned
1057when defun is completed, else nil."
1058 (let ((defs (python-nav-list-defun-positions)))
1059 (minibuffer-with-setup-hook
1060 (lambda ()
1061 (setq minibuffer-completion-table (mapcar 'car defs)))
1062 (let ((stringdef
1063 (read-from-minibuffer
1064 "Jump to definition: " nil
1065 minibuffer-local-must-match-map)))
1066 (when (not (string= stringdef ""))
1067 (assoc-string stringdef defs))))))
1068
1069(defun python-nav-jump-to-defun (def)
1070 "Jump to the definition of DEF in current file."
1071 (interactive
1072 (list (python-nav-read-defun)))
1073 (when (not (called-interactively-p 'interactive))
1074 (setq def (assoc-string def (python-nav-list-defun-positions))))
1075 (let ((def-marker (cdr def)))
1076 (when (markerp def-marker)
1077 (goto-char (marker-position def-marker))
1078 (back-to-indentation))))
1079
45c138ac
FEG
1080\f
1081;;; Shell integration
1082
0f55249e
FEG
1083(defcustom python-shell-buffer-name "Python"
1084 "Default buffer name for Python interpreter."
1085 :type 'string
1086 :group 'python
1087 :safe 'stringp)
45c138ac
FEG
1088
1089(defcustom python-shell-interpreter "python"
1090 "Default Python interpreter for shell."
45c138ac 1091 :type 'string
c0428ba0 1092 :group 'python
45c138ac
FEG
1093 :safe 'stringp)
1094
0f55249e
FEG
1095(defcustom python-shell-internal-buffer-name "Python Internal"
1096 "Default buffer name for the Internal Python interpreter."
1097 :type 'string
1098 :group 'python
1099 :safe 'stringp)
1fe1b5aa 1100
45c138ac
FEG
1101(defcustom python-shell-interpreter-args "-i"
1102 "Default arguments for the Python interpreter."
45c138ac 1103 :type 'string
c0428ba0 1104 :group 'python
45c138ac
FEG
1105 :safe 'stringp)
1106
1107(defcustom python-shell-prompt-regexp ">>> "
e2d8d479
FEG
1108 "Regular Expression matching top\-level input prompt of python shell.
1109It should not contain a caret (^) at the beginning."
45c138ac
FEG
1110 :type 'string
1111 :group 'python
1112 :safe 'stringp)
1113
1114(defcustom python-shell-prompt-block-regexp "[.][.][.] "
e2d8d479
FEG
1115 "Regular Expression matching block input prompt of python shell.
1116It should not contain a caret (^) at the beginning."
45c138ac
FEG
1117 :type 'string
1118 :group 'python
1119 :safe 'stringp)
1120
0f55249e 1121(defcustom python-shell-prompt-output-regexp ""
e2d8d479
FEG
1122 "Regular Expression matching output prompt of python shell.
1123It should not contain a caret (^) at the beginning."
62feb915
FEG
1124 :type 'string
1125 :group 'python
1126 :safe 'stringp)
1127
45c138ac 1128(defcustom python-shell-prompt-pdb-regexp "[(<]*[Ii]?[Pp]db[>)]+ "
e2d8d479
FEG
1129 "Regular Expression matching pdb input prompt of python shell.
1130It should not contain a caret (^) at the beginning."
45c138ac
FEG
1131 :type 'string
1132 :group 'python
1133 :safe 'stringp)
1134
30e429dd
FEG
1135(defcustom python-shell-send-setup-max-wait 5
1136 "Seconds to wait for process output before code setup.
1137If output is received before the especified time then control is
1138returned in that moment and not after waiting."
0f55249e 1139 :type 'integer
30e429dd 1140 :group 'python
0f55249e 1141 :safe 'integerp)
30e429dd 1142
66bbb27f 1143(defcustom python-shell-process-environment nil
307bd2e8
FEG
1144 "List of environment variables for Python shell.
1145This variable follows the same rules as `process-environment'
66bbb27f
FEG
1146since it merges with it before the process creation routines are
1147called. When this variable is nil, the Python shell is run with
307bd2e8 1148the default `process-environment'."
66bbb27f
FEG
1149 :type '(repeat string)
1150 :group 'python
1151 :safe 'listp)
1152
929036b4
FEG
1153(defcustom python-shell-extra-pythonpaths nil
1154 "List of extra pythonpaths for Python shell.
1155The values of this variable are added to the existing value of
1156PYTHONPATH in the `process-environment' variable."
1157 :type '(repeat string)
1158 :group 'python
1159 :safe 'listp)
1160
66bbb27f
FEG
1161(defcustom python-shell-exec-path nil
1162 "List of path to search for binaries.
1163This variable follows the same rules as `exec-path' since it
1164merges with it before the process creation routines are called.
1165When this variable is nil, the Python shell is run with the
1166default `exec-path'."
1167 :type '(repeat string)
1168 :group 'python
1169 :safe 'listp)
1170
64348c32
FEG
1171(defcustom python-shell-virtualenv-path nil
1172 "Path to virtualenv root.
1173This variable, when set to a string, makes the values stored in
1174`python-shell-process-environment' and `python-shell-exec-path'
1175to be modified properly so shells are started with the specified
1176virtualenv."
1177 :type 'string
1178 :group 'python
1179 :safe 'stringp)
1180
c0428ba0
FEG
1181(defcustom python-shell-setup-codes '(python-shell-completion-setup-code
1182 python-ffap-setup-code
1183 python-eldoc-setup-code)
279c9272 1184 "List of code run by `python-shell-send-setup-codes'."
c0428ba0
FEG
1185 :type '(repeat symbol)
1186 :group 'python
1187 :safe 'listp)
1188
45c138ac
FEG
1189(defcustom python-shell-compilation-regexp-alist
1190 `((,(rx line-start (1+ (any " \t")) "File \""
1191 (group (1+ (not (any "\"<")))) ; avoid `<stdin>' &c
1192 "\", line " (group (1+ digit)))
1193 1 2)
1194 (,(rx " in file " (group (1+ not-newline)) " on line "
1195 (group (1+ digit)))
1196 1 2)
1197 (,(rx line-start "> " (group (1+ (not (any "(\"<"))))
1198 "(" (group (1+ digit)) ")" (1+ (not (any "("))) "()")
1199 1 2))
1200 "`compilation-error-regexp-alist' for inferior Python."
1201 :type '(alist string)
1202 :group 'python)
1203
1204(defun python-shell-get-process-name (dedicated)
1205 "Calculate the appropiate process name for inferior Python process.
45c138ac
FEG
1206If DEDICATED is t and the variable `buffer-file-name' is non-nil
1207returns a string with the form
1208`python-shell-buffer-name'[variable `buffer-file-name'] else
e2d8d479
FEG
1209returns the value of `python-shell-buffer-name'. After
1210calculating the process name adds the buffer name for the process
1211in the `same-window-buffer-names' list."
45c138ac
FEG
1212 (let ((process-name
1213 (if (and dedicated
1214 buffer-file-name)
1215 (format "%s[%s]" python-shell-buffer-name buffer-file-name)
1216 (format "%s" python-shell-buffer-name))))
1217 (add-to-list 'same-window-buffer-names (purecopy
1218 (format "*%s*" process-name)))
1219 process-name))
1220
1fe1b5aa
FEG
1221(defun python-shell-internal-get-process-name ()
1222 "Calculate the appropiate process name for Internal Python process.
1223The name is calculated from `python-shell-global-buffer-name' and
1224a hash of all relevant global shell settings in order to ensure
1225uniqueness for different types of configurations."
1226 (format "%s [%s]"
1227 python-shell-internal-buffer-name
1228 (md5
1229 (concat
1230 (python-shell-parse-command)
279c9272
FEG
1231 python-shell-prompt-regexp
1232 python-shell-prompt-block-regexp
1233 python-shell-prompt-output-regexp
1fe1b5aa
FEG
1234 (mapconcat #'symbol-value python-shell-setup-codes "")
1235 (mapconcat #'indentity python-shell-process-environment "")
279c9272
FEG
1236 (mapconcat #'indentity python-shell-extra-pythonpaths "")
1237 (mapconcat #'indentity python-shell-exec-path "")
64348c32 1238 (or python-shell-virtualenv-path "")
1fe1b5aa
FEG
1239 (mapconcat #'indentity python-shell-exec-path "")))))
1240
45c138ac 1241(defun python-shell-parse-command ()
e2d8d479 1242 "Calculate the string used to execute the inferior Python process."
45c138ac
FEG
1243 (format "%s %s" python-shell-interpreter python-shell-interpreter-args))
1244
307bd2e8
FEG
1245(defun python-shell-calculate-process-environment ()
1246 "Calculate process environment given `python-shell-virtualenv-path'."
40417cb3
FEG
1247 (let ((process-environment (append
1248 python-shell-process-environment
1249 process-environment nil))
64348c32
FEG
1250 (virtualenv (if python-shell-virtualenv-path
1251 (directory-file-name python-shell-virtualenv-path)
1252 nil)))
929036b4
FEG
1253 (when python-shell-extra-pythonpaths
1254 (setenv "PYTHONPATH"
1255 (format "%s%s%s"
1256 (mapconcat 'identity
1257 python-shell-extra-pythonpaths
1258 path-separator)
1259 path-separator
1260 (or (getenv "PYTHONPATH") ""))))
64348c32 1261 (if (not virtualenv)
40417cb3
FEG
1262 process-environment
1263 (setenv "PYTHONHOME" nil)
1264 (setenv "PATH" (format "%s/bin%s%s"
929036b4
FEG
1265 virtualenv path-separator
1266 (or (getenv "PATH") "")))
40417cb3
FEG
1267 (setenv "VIRTUAL_ENV" virtualenv))
1268 process-environment))
64348c32
FEG
1269
1270(defun python-shell-calculate-exec-path ()
1271 "Calculate exec path given `python-shell-virtualenv-path'."
40417cb3
FEG
1272 (let ((path (append python-shell-exec-path
1273 exec-path nil)))
64348c32
FEG
1274 (if (not python-shell-virtualenv-path)
1275 path
1276 (cons (format "%s/bin"
1277 (directory-file-name python-shell-virtualenv-path))
1278 path))))
1279
45c138ac
FEG
1280(defun python-comint-output-filter-function (output)
1281 "Hook run after content is put into comint buffer.
1282OUTPUT is a string with the contents of the buffer."
1283 (ansi-color-filter-apply output))
1284
45c138ac 1285(define-derived-mode inferior-python-mode comint-mode "Inferior Python"
62feb915 1286 "Major mode for Python inferior process.
e2d8d479
FEG
1287Runs a Python interpreter as a subprocess of Emacs, with Python
1288I/O through an Emacs buffer. Variables
1289`python-shell-interpreter' and `python-shell-interpreter-args'
1290controls which Python interpreter is run. Variables
1291`python-shell-prompt-regexp',
1292`python-shell-prompt-output-regexp',
1293`python-shell-prompt-block-regexp',
1294`python-shell-completion-setup-code',
1295`python-shell-completion-string-code', `python-eldoc-setup-code',
1296`python-eldoc-string-code', `python-ffap-setup-code' and
1297`python-ffap-string-code' can customize this mode for different
1298Python interpreters.
1299
1300You can also add additional setup code to be run at
1301initialization of the interpreter via `python-shell-setup-codes'
1302variable.
1303
1304\(Type \\[describe-mode] in the process buffer for a list of commands.)"
45c138ac
FEG
1305 (set-syntax-table python-mode-syntax-table)
1306 (setq mode-line-process '(":%s"))
1307 (setq comint-prompt-regexp (format "^\\(?:%s\\|%s\\|%s\\)"
1308 python-shell-prompt-regexp
1309 python-shell-prompt-block-regexp
1310 python-shell-prompt-pdb-regexp))
1311 (make-local-variable 'comint-output-filter-functions)
1312 (add-hook 'comint-output-filter-functions
1313 'python-comint-output-filter-function)
1314 (add-hook 'comint-output-filter-functions
1315 'python-pdbtrack-comint-output-filter-function)
1316 (set (make-local-variable 'compilation-error-regexp-alist)
1317 python-shell-compilation-regexp-alist)
ed0eb594
FEG
1318 (define-key inferior-python-mode-map [remap complete-symbol]
1319 'completion-at-point)
1320 (add-hook 'completion-at-point-functions
1321 'python-shell-completion-complete-at-point nil 'local)
62feb915
FEG
1322 (add-to-list (make-local-variable 'comint-dynamic-complete-functions)
1323 'python-shell-completion-complete-at-point)
1324 (define-key inferior-python-mode-map (kbd "<tab>")
1325 'python-shell-completion-complete-or-indent)
45c138ac
FEG
1326 (compilation-shell-minor-mode 1))
1327
96eeb83a 1328(defun python-shell-make-comint (cmd proc-name &optional pop)
77afb61a 1329 "Create a python shell comint buffer.
96eeb83a 1330CMD is the python command to be executed and PROC-NAME is the
77afb61a 1331process name the comint buffer will get. After the comint buffer
96eeb83a
FEG
1332is created the `inferior-python-mode' is activated. If POP is
1333non-nil the buffer is shown."
77afb61a
FEG
1334 (save-excursion
1335 (let* ((proc-buffer-name (format "*%s*" proc-name))
307bd2e8 1336 (process-environment (python-shell-calculate-process-environment))
77afb61a
FEG
1337 (exec-path (python-shell-calculate-exec-path)))
1338 (when (not (comint-check-proc proc-buffer-name))
96eeb83a
FEG
1339 (let* ((cmdlist (split-string-and-unquote cmd))
1340 (buffer (apply 'make-comint proc-name (car cmdlist) nil
1341 (cdr cmdlist)))
d2190c57 1342 (current-buffer (current-buffer)))
96eeb83a
FEG
1343 (with-current-buffer buffer
1344 (inferior-python-mode)
fbc39529 1345 (python-util-clone-local-variables current-buffer))))
96eeb83a 1346 (when pop
a0686d71
FEG
1347 (pop-to-buffer proc-buffer-name))
1348 proc-buffer-name)))
77afb61a 1349
45c138ac
FEG
1350(defun run-python (dedicated cmd)
1351 "Run an inferior Python process.
e2d8d479
FEG
1352Input and output via buffer named after
1353`python-shell-buffer-name'. If there is a process already
1354running in that buffer, just switch to it.
1355With argument, allows you to define DEDICATED, so a dedicated
1356process for the current buffer is open, and define CMD so you can
1357edit the command used to call the interpreter (default is value
1358of `python-shell-interpreter' and arguments defined in
1359`python-shell-interpreter-args'). Runs the hook
1360`inferior-python-mode-hook' (after the `comint-mode-hook' is
1361run).
1362\(Type \\[describe-mode] in the process buffer for a list of commands.)"
45c138ac
FEG
1363 (interactive
1364 (if current-prefix-arg
1365 (list
1366 (y-or-n-p "Make dedicated process? ")
1367 (read-string "Run Python: " (python-shell-parse-command)))
1368 (list nil (python-shell-parse-command))))
96eeb83a 1369 (python-shell-make-comint cmd (python-shell-get-process-name dedicated) t)
45c138ac
FEG
1370 dedicated)
1371
1fe1b5aa
FEG
1372(defun run-python-internal ()
1373 "Run an inferior Internal Python process.
1374Input and output via buffer named after
1375`python-shell-internal-buffer-name' and what
1376`python-shell-internal-get-process-name' returns. This new kind
1377of shell is intended to be used for generic communication related
1378to defined configurations. The main difference with global or
1379dedicated shells is that these ones are attached to a
1380configuration, not a buffer. This means that can be used for
1381example to retrieve the sys.path and other stuff, without messing
1382with user shells. Runs the hook
1383`inferior-python-mode-hook' (after the `comint-mode-hook' is
1384run). \(Type \\[describe-mode] in the process buffer for a list
1385of commands.)"
1386 (interactive)
a0686d71
FEG
1387 (set-process-query-on-exit-flag
1388 (get-buffer-process
1389 (python-shell-make-comint
1390 (python-shell-parse-command)
1391 (python-shell-internal-get-process-name))) nil))
1fe1b5aa 1392
45c138ac
FEG
1393(defun python-shell-get-process ()
1394 "Get inferior Python process for current buffer and return it."
1395 (let* ((dedicated-proc-name (python-shell-get-process-name t))
1396 (dedicated-proc-buffer-name (format "*%s*" dedicated-proc-name))
1397 (global-proc-name (python-shell-get-process-name nil))
1398 (global-proc-buffer-name (format "*%s*" global-proc-name))
1399 (dedicated-running (comint-check-proc dedicated-proc-buffer-name))
1400 (global-running (comint-check-proc global-proc-buffer-name)))
1401 ;; Always prefer dedicated
1402 (get-buffer-process (or (and dedicated-running dedicated-proc-buffer-name)
1403 (and global-running global-proc-buffer-name)))))
1404
1405(defun python-shell-get-or-create-process ()
1406 "Get or create an inferior Python process for current buffer and return it."
79dafa51
FEG
1407 (let* ((old-buffer (current-buffer))
1408 (dedicated-proc-name (python-shell-get-process-name t))
45c138ac
FEG
1409 (dedicated-proc-buffer-name (format "*%s*" dedicated-proc-name))
1410 (global-proc-name (python-shell-get-process-name nil))
1411 (global-proc-buffer-name (format "*%s*" global-proc-name))
1412 (dedicated-running (comint-check-proc dedicated-proc-buffer-name))
1413 (global-running (comint-check-proc global-proc-buffer-name))
1414 (current-prefix-arg 4))
1415 (when (and (not dedicated-running) (not global-running))
1416 (if (call-interactively 'run-python)
1417 (setq dedicated-running t)
1418 (setq global-running t)))
1419 ;; Always prefer dedicated
79dafa51 1420 (switch-to-buffer old-buffer)
45c138ac
FEG
1421 (get-buffer-process (if dedicated-running
1422 dedicated-proc-buffer-name
1423 global-proc-buffer-name))))
1424
1fe1b5aa
FEG
1425(defun python-shell-internal-get-or-create-process ()
1426 "Get or create an inferior Internal Python process."
1427 (let* ((proc-name (python-shell-internal-get-process-name))
1428 (proc-buffer-name (format "*%s*" proc-name)))
1429 (run-python-internal)
1430 (get-buffer-process proc-buffer-name)))
1431
9ce938be
FEG
1432(defun python-shell-send-string (string &optional process msg)
1433 "Send STRING to inferior Python PROCESS.
1434When MSG is non-nil messages the first line of STRING."
45c138ac 1435 (interactive "sPython command: ")
9ce938be
FEG
1436 (let ((process (or process (python-shell-get-or-create-process)))
1437 (lines (split-string string "\n" t)))
1438 (when msg
1439 (message (format "Sent: %s..." (nth 0 lines))))
1440 (if (> (length lines) 1)
1441 (let* ((temp-file-name (make-temp-file "py"))
1442 (file-name (or (buffer-file-name) temp-file-name)))
1443 (with-temp-file temp-file-name
1444 (insert string)
1445 (delete-trailing-whitespace))
1446 (python-shell-send-file file-name process temp-file-name))
1447 (comint-send-string process string)
1448 (when (or (not (string-match "\n$" string))
1449 (string-match "\n[ \t].*\n?$" string))
1450 (comint-send-string process "\n")))))
1451
1452(defun python-shell-send-string-no-output (string &optional process msg)
1453 "Send STRING to PROCESS and inhibit output.
e2d8d479
FEG
1454When MSG is non-nil messages the first line of STRING. Return
1455the output."
9ce938be
FEG
1456 (let* ((output-buffer)
1457 (process (or process (python-shell-get-or-create-process)))
1458 (comint-preoutput-filter-functions
1459 (append comint-preoutput-filter-functions
1460 '(ansi-color-filter-apply
1461 (lambda (string)
1462 (setq output-buffer (concat output-buffer string))
1463 "")))))
1464 (python-shell-send-string string process msg)
1465 (accept-process-output process)
1466 (mapconcat
1467 (lambda (string) string)
1faf2911
FEG
1468 (split-string
1469 output-buffer
1470 (if (> (length python-shell-prompt-output-regexp) 0)
1471 (format "\n*%s$\\|^%s"
1472 python-shell-prompt-regexp
1473 (or python-shell-prompt-output-regexp ""))
1474 (format "\n$\\|^%s"
1475 python-shell-prompt-regexp)) t) "\n")))
45c138ac 1476
1fe1b5aa
FEG
1477(defun python-shell-internal-send-string (string)
1478 "Send STRING to the Internal Python interpreter.
1479Returns the output. See `python-shell-send-string-no-output'."
1480 (python-shell-send-string-no-output
1481 ;; Makes this function compatible with the old
1482 ;; python-send-receive. (At least for CEDET).
1483 (replace-regexp-in-string "_emacs_out +" "" string)
1484 (python-shell-internal-get-or-create-process) nil))
1485
1486(define-obsolete-function-alias
1487 'python-send-receive 'python-shell-internal-send-string "23.3"
1488 "Send STRING to inferior Python (if any) and return result.
1489The result is what follows `_emacs_out' in the output.
1490This is a no-op if `python-check-comint-prompt' returns nil.")
1491
45c138ac
FEG
1492(defun python-shell-send-region (start end)
1493 "Send the region delimited by START and END to inferior Python process."
1494 (interactive "r")
9ce938be
FEG
1495 (let ((deactivate-mark nil))
1496 (python-shell-send-string (buffer-substring start end) nil t)))
45c138ac
FEG
1497
1498(defun python-shell-send-buffer ()
1499 "Send the entire buffer to inferior Python process."
1500 (interactive)
1501 (save-restriction
1502 (widen)
1503 (python-shell-send-region (point-min) (point-max))))
1504
1505(defun python-shell-send-defun (arg)
2ed294c5 1506 "Send the current defun to inferior Python process.
45c138ac
FEG
1507When argument ARG is non-nil sends the innermost defun."
1508 (interactive "P")
1509 (save-excursion
2ed294c5
FEG
1510 (python-shell-send-region
1511 (progn
1512 (or (python-beginning-of-defun-function)
1513 (progn (beginning-of-line) (point-marker))))
1514 (progn
1515 (or (python-end-of-defun-function)
1516 (progn (end-of-line) (point-marker)))))))
45c138ac 1517
d439cda5
FEG
1518(defun python-shell-send-file (file-name &optional process temp-file-name)
1519 "Send FILE-NAME to inferior Python PROCESS.
1520If TEMP-FILE-NAME is passed then that file is used for processing
1521instead, while internally the shell will continue to use
1522FILE-NAME."
45c138ac 1523 (interactive "fFile to send: ")
9ce938be
FEG
1524 (let* ((process (or process (python-shell-get-or-create-process)))
1525 (temp-file-name (when temp-file-name
1526 (expand-file-name temp-file-name)))
1527 (file-name (or (expand-file-name file-name) temp-file-name)))
1528 (when (not file-name)
1529 (error "If FILE-NAME is nil then TEMP-FILE-NAME must be non-nil"))
13d914ed 1530 (python-shell-send-string
b962ebad 1531 (format
d439cda5
FEG
1532 (concat "__pyfile = open('''%s''');"
1533 "exec(compile(__pyfile.read(), '''%s''', 'exec'));"
1534 "__pyfile.close()")
1535 (or temp-file-name file-name) file-name)
13d914ed 1536 process)))
45c138ac
FEG
1537
1538(defun python-shell-switch-to-shell ()
1539 "Switch to inferior Python process buffer."
1540 (interactive)
1541 (pop-to-buffer (process-buffer (python-shell-get-or-create-process)) t))
1542
c0428ba0
FEG
1543(defun python-shell-send-setup-code ()
1544 "Send all setup code for shell.
1545This function takes the list of setup code to send from the
1546`python-shell-setup-codes' list."
1547 (let ((msg "Sent %s")
1548 (process (get-buffer-process (current-buffer))))
30e429dd 1549 (accept-process-output process python-shell-send-setup-max-wait)
c0428ba0
FEG
1550 (dolist (code python-shell-setup-codes)
1551 (when code
c0428ba0
FEG
1552 (message (format msg code))
1553 (python-shell-send-string-no-output
1554 (symbol-value code) process)))))
1555
1556(add-hook 'inferior-python-mode-hook
1557 #'python-shell-send-setup-code)
1558
45c138ac
FEG
1559\f
1560;;; Shell completion
1561
0f55249e 1562(defcustom python-shell-completion-setup-code
45c138ac
FEG
1563 "try:
1564 import readline
1565except ImportError:
1566 def __COMPLETER_all_completions(text): []
1567else:
1568 import rlcompleter
1569 readline.set_completer(rlcompleter.Completer().complete)
1570 def __COMPLETER_all_completions(text):
1571 import sys
1572 completions = []
1573 try:
1574 i = 0
1575 while True:
1576 res = readline.get_completer()(text, i)
1577 if not res: break
1578 i += 1
1579 completions.append(res)
1580 except NameError:
1581 pass
1582 return completions"
0f55249e
FEG
1583 "Code used to setup completion in inferior Python processes."
1584 :type 'string
1585 :group 'python
1586 :safe 'stringp)
45c138ac 1587
0f55249e 1588(defcustom python-shell-completion-string-code
45c138ac 1589 "';'.join(__COMPLETER_all_completions('''%s'''))\n"
0f55249e
FEG
1590 "Python code used to get a string of completions separated by semicolons."
1591 :type 'string
1592 :group 'python
1593 :safe 'stringp)
45c138ac 1594
9253ea69 1595(defcustom python-shell-module-completion-string-code ""
8386d830 1596 "Python code used to get completions separated by semicolons for imports.
9253ea69
DD
1597
1598For IPython v0.11, add the following line to
1599`python-shell-completion-setup-code':
1600
1601from IPython.core.completerlib import module_completion
1602
1603and use the following as the value of this variable:
1604
1605';'.join(module_completion('''%s'''))\n"
1606 :type 'string
1607 :group 'python
1608 :safe 'stringp)
1609
9253ea69 1610(defun python-shell-completion--get-completions (input process completion-code)
8386d830
FEG
1611 "Retrieve available completions for INPUT using PROCESS.
1612Argument COMPLETION-CODE is the python code used to get
1613completions on the current context."
075a0f61 1614 (with-current-buffer (process-buffer process)
62feb915 1615 (let ((completions (python-shell-send-string-no-output
9253ea69 1616 (format completion-code input) process)))
62feb915
FEG
1617 (when (> (length completions) 2)
1618 (split-string completions "^'\\|^\"\\|;\\|'$\\|\"$" t)))))
075a0f61 1619
b71bfa9c 1620(defun python-shell-completion--do-completion-at-point (process)
8386d830 1621 "Do completion at point for PROCESS."
b71bfa9c 1622 (with-syntax-table python-dotty-syntax-table
9253ea69
DD
1623 (let* ((line (substring-no-properties
1624 (buffer-substring (point-at-bol) (point)) nil nil))
1625 (input (substring-no-properties
1626 (or (comint-word (current-word)) "") nil nil))
1627 (completions
1628 (if (and (> (length python-shell-module-completion-string-code) 0)
8386d830 1629 (string-match "^\\(from\\|import\\)[ \t]" line))
9253ea69
DD
1630 (python-shell-completion--get-completions
1631 line process python-shell-module-completion-string-code)
1632 (python-shell-completion--get-completions
1633 input process python-shell-completion-string-code)))
1634 (completion (when completions
1635 (try-completion input completions))))
b71bfa9c
DD
1636 (cond ((eq completion t)
1637 t)
1638 ((null completion)
1639 (message "Can't find completion for \"%s\"" input)
1640 (ding)
1641 nil)
075a0f61 1642 ((not (string= input completion))
b71bfa9c
DD
1643 (progn (delete-char (- (length input)))
1644 (insert completion)
1645 t))
075a0f61 1646 (t
075a0f61
FEG
1647 (with-output-to-temp-buffer "*Python Completions*"
1648 (display-completion-list
1649 (all-completions input completions)))
b71bfa9c 1650 t)))))
075a0f61 1651
45c138ac
FEG
1652(defun python-shell-completion-complete-at-point ()
1653 "Perform completion at point in inferior Python process."
1654 (interactive)
b71bfa9c
DD
1655 (and comint-last-prompt-overlay
1656 (> (point-marker) (overlay-end comint-last-prompt-overlay))
1657 (python-shell-completion--do-completion-at-point
1658 (get-buffer-process (current-buffer)))))
45c138ac 1659
45c138ac
FEG
1660(defun python-shell-completion-complete-or-indent ()
1661 "Complete or indent depending on the context.
e2d8d479
FEG
1662If content before pointer is all whitespace indent. If not try
1663to complete."
45c138ac
FEG
1664 (interactive)
1665 (if (string-match "^[[:space:]]*$"
1666 (buffer-substring (comint-line-beginning-position)
1667 (point-marker)))
1668 (indent-for-tab-command)
1669 (comint-dynamic-complete)))
1670
45c138ac
FEG
1671\f
1672;;; PDB Track integration
1673
0f55249e 1674(defcustom python-pdbtrack-stacktrace-info-regexp
aeac8c27 1675 "^> \\([^\"(<]+\\)(\\([0-9]+\\))\\([?a-zA-Z0-9_<>]+\\)()"
e2d8d479 1676 "Regular Expression matching stacktrace information.
aeac8c27 1677Used to extract the current line and module being inspected."
0f55249e
FEG
1678 :type 'string
1679 :group 'python
1680 :safe 'stringp)
45c138ac 1681
e1f00930
FEG
1682(defvar python-pdbtrack-tracked-buffer nil
1683 "Variable containing the value of the current tracked buffer.
1684Never set this variable directly, use
1685`python-pdbtrack-set-tracked-buffer' instead.")
1686(make-variable-buffer-local 'python-pdbtrack-tracked-buffer)
1687
1688(defvar python-pdbtrack-buffers-to-kill nil
1689 "List of buffers to be deleted after tracking finishes.")
1690(make-variable-buffer-local 'python-pdbtrack-buffers-to-kill)
1691
1692(defun python-pdbtrack-set-tracked-buffer (file-name)
1693 "Set the buffer for FILE-NAME as the tracked buffer.
1694Internally it uses the `python-pdbtrack-tracked-buffer' variable.
1695Returns the tracked buffer."
1696 (let ((file-buffer (get-file-buffer file-name)))
1697 (if file-buffer
1698 (setq python-pdbtrack-tracked-buffer file-buffer)
1699 (setq file-buffer (find-file-noselect file-name))
1700 (when (not (member file-buffer python-pdbtrack-buffers-to-kill))
1701 (add-to-list 'python-pdbtrack-buffers-to-kill file-buffer)))
1702 file-buffer))
45c138ac
FEG
1703
1704(defun python-pdbtrack-comint-output-filter-function (output)
1705 "Move overlay arrow to current pdb line in tracked buffer.
1706Argument OUTPUT is a string with the output from the comint process."
1707 (when (not (string= output ""))
aeac8c27
FEG
1708 (let* ((full-output (ansi-color-filter-apply
1709 (buffer-substring comint-last-input-end (point-max))))
1710 (line-number)
1711 (file-name
1712 (with-temp-buffer
aeac8c27
FEG
1713 (insert full-output)
1714 (goto-char (point-min))
e1f00930
FEG
1715 ;; OK, this sucked but now it became a cool hack. The
1716 ;; stacktrace information normally is on the first line
1717 ;; but in some cases (like when doing a step-in) it is
1718 ;; on the second.
1719 (when (or (looking-at python-pdbtrack-stacktrace-info-regexp)
1720 (and (forward-line)
1721 (looking-at python-pdbtrack-stacktrace-info-regexp)))
aeac8c27
FEG
1722 (setq line-number (string-to-number
1723 (match-string-no-properties 2)))
1724 (match-string-no-properties 1)))))
1725 (if (and file-name line-number)
e1f00930
FEG
1726 (let* ((tracked-buffer (python-pdbtrack-set-tracked-buffer file-name))
1727 (shell-buffer (current-buffer))
1728 (tracked-buffer-window (get-buffer-window tracked-buffer))
45c138ac 1729 (tracked-buffer-line-pos))
e1f00930 1730 (with-current-buffer tracked-buffer
aeac8c27
FEG
1731 (set (make-local-variable 'overlay-arrow-string) "=>")
1732 (set (make-local-variable 'overlay-arrow-position) (make-marker))
1733 (setq tracked-buffer-line-pos (progn
1734 (goto-char (point-min))
1735 (forward-line (1- line-number))
1736 (point-marker)))
1737 (when tracked-buffer-window
1738 (set-window-point
1739 tracked-buffer-window tracked-buffer-line-pos))
1740 (set-marker overlay-arrow-position tracked-buffer-line-pos))
e1f00930
FEG
1741 (pop-to-buffer tracked-buffer)
1742 (switch-to-buffer-other-window shell-buffer))
1743 (when python-pdbtrack-tracked-buffer
1744 (with-current-buffer python-pdbtrack-tracked-buffer
1745 (set-marker overlay-arrow-position nil))
1746 (mapc #'(lambda (buffer)
1747 (ignore-errors (kill-buffer buffer)))
1748 python-pdbtrack-buffers-to-kill)
1749 (setq python-pdbtrack-tracked-buffer nil
1750 python-pdbtrack-buffers-to-kill nil)))))
45c138ac
FEG
1751 output)
1752
1753\f
1754;;; Symbol completion
1755
1756(defun python-completion-complete-at-point ()
1757 "Complete current symbol at point.
1758For this to work the best as possible you should call
1759`python-shell-send-buffer' from time to time so context in
1760inferior python process is updated properly."
1761 (interactive)
1762 (let ((process (python-shell-get-process)))
1763 (if (not process)
4e531f7a 1764 (error "Completion needs an inferior Python process running")
b71bfa9c 1765 (python-shell-completion--do-completion-at-point process))))
45c138ac
FEG
1766
1767(add-to-list 'debug-ignored-errors "^Completion needs an inferior Python process running.")
1768
1769\f
1770;;; Fill paragraph
1771
c2cb97ae
FEG
1772(defcustom python-fill-comment-function 'python-fill-comment
1773 "Function to fill comments.
1774This is the function used by `python-fill-paragraph-function' to
1775fill comments."
1776 :type 'symbol
1777 :group 'python
1778 :safe 'symbolp)
1779
1780(defcustom python-fill-string-function 'python-fill-string
1781 "Function to fill strings.
1782This is the function used by `python-fill-paragraph-function' to
1783fill strings."
1784 :type 'symbol
1785 :group 'python
1786 :safe 'symbolp)
1787
1788(defcustom python-fill-decorator-function 'python-fill-decorator
1789 "Function to fill decorators.
1790This is the function used by `python-fill-paragraph-function' to
1791fill decorators."
1792 :type 'symbol
1793 :group 'python
1794 :safe 'symbolp)
1795
1796(defcustom python-fill-paren-function 'python-fill-paren
1797 "Function to fill parens.
1798This is the function used by `python-fill-paragraph-function' to
1799fill parens."
1800 :type 'symbol
1801 :group 'python
1802 :safe 'symbolp)
1803
45c138ac
FEG
1804(defun python-fill-paragraph-function (&optional justify)
1805 "`fill-paragraph-function' handling multi-line strings and possibly comments.
1806If any of the current line is in or at the end of a multi-line string,
1807fill the string or the paragraph of it that point is in, preserving
4e531f7a
FEG
1808the string's indentation.
1809Optional argument JUSTIFY defines if the paragraph should be justified."
45c138ac
FEG
1810 (interactive "P")
1811 (save-excursion
1812 (back-to-indentation)
1813 (cond
1814 ;; Comments
c2cb97ae
FEG
1815 ((funcall python-fill-comment-function justify))
1816 ;; Strings/Docstrings
45c138ac 1817 ((save-excursion (skip-chars-forward "\"'uUrR")
14a78495 1818 (python-info-ppss-context 'string))
c2cb97ae 1819 (funcall python-fill-string-function justify))
45c138ac
FEG
1820 ;; Decorators
1821 ((equal (char-after (save-excursion
1822 (back-to-indentation)
c2cb97ae
FEG
1823 (point-marker))) ?@)
1824 (funcall python-fill-decorator-function justify))
45c138ac 1825 ;; Parens
14a78495 1826 ((or (python-info-ppss-context 'paren)
45c138ac
FEG
1827 (looking-at (python-rx open-paren))
1828 (save-excursion
1829 (skip-syntax-forward "^(" (line-end-position))
1830 (looking-at (python-rx open-paren))))
c2cb97ae 1831 (funcall python-fill-paren-function justify))
45c138ac
FEG
1832 (t t))))
1833
c2cb97ae 1834(defun python-fill-comment (&optional justify)
053a6c72
FEG
1835 "Comment fill function for `python-fill-paragraph-function'.
1836JUSTIFY should be used (if applicable) as in `fill-paragraph'."
c2cb97ae
FEG
1837 (fill-comment-paragraph justify))
1838
1839(defun python-fill-string (&optional justify)
053a6c72
FEG
1840 "String fill function for `python-fill-paragraph-function'.
1841JUSTIFY should be used (if applicable) as in `fill-paragraph'."
c2cb97ae
FEG
1842 (let ((marker (point-marker))
1843 (string-start-marker
1844 (progn
1845 (skip-chars-forward "\"'uUrR")
1846 (goto-char (python-info-ppss-context 'string))
1847 (skip-chars-forward "\"'uUrR")
1848 (point-marker)))
1849 (reg-start (line-beginning-position))
1850 (string-end-marker
1851 (progn
1852 (while (python-info-ppss-context 'string)
1853 (goto-char (1+ (point-marker))))
1854 (skip-chars-backward "\"'")
1855 (point-marker)))
1856 (reg-end (line-end-position))
1857 (fill-paragraph-function))
1858 (save-restriction
1859 (narrow-to-region reg-start reg-end)
1860 (save-excursion
1861 (goto-char string-start-marker)
1862 (delete-region (point-marker) (progn
1863 (skip-syntax-forward "> ")
1864 (point-marker)))
1865 (goto-char string-end-marker)
1866 (delete-region (point-marker) (progn
1867 (skip-syntax-backward "> ")
1868 (point-marker)))
1869 (save-excursion
1870 (goto-char marker)
1871 (fill-paragraph justify))
1872 ;; If there is a newline in the docstring lets put triple
1873 ;; quote in it's own line to follow pep 8
1874 (when (save-excursion
1875 (re-search-backward "\n" string-start-marker t))
1876 (newline)
1877 (newline-and-indent))
1878 (fill-paragraph justify)))) t)
1879
1880(defun python-fill-decorator (&optional justify)
053a6c72
FEG
1881 "Decorator fill function for `python-fill-paragraph-function'.
1882JUSTIFY should be used (if applicable) as in `fill-paragraph'."
c2cb97ae
FEG
1883 t)
1884
1885(defun python-fill-paren (&optional justify)
053a6c72
FEG
1886 "Paren fill function for `python-fill-paragraph-function'.
1887JUSTIFY should be used (if applicable) as in `fill-paragraph'."
c2cb97ae
FEG
1888 (save-restriction
1889 (narrow-to-region (progn
1890 (while (python-info-ppss-context 'paren)
1891 (goto-char (1- (point-marker))))
1892 (point-marker)
1893 (line-beginning-position))
1894 (progn
1895 (when (not (python-info-ppss-context 'paren))
1896 (end-of-line)
1897 (when (not (python-info-ppss-context 'paren))
1898 (skip-syntax-backward "^)")))
1899 (while (python-info-ppss-context 'paren)
1900 (goto-char (1+ (point-marker))))
1901 (point-marker)))
1902 (let ((paragraph-start "\f\\|[ \t]*$")
1903 (paragraph-separate ",")
1904 (fill-paragraph-function))
1905 (goto-char (point-min))
1906 (fill-paragraph justify))
1907 (while (not (eobp))
1908 (forward-line 1)
1909 (python-indent-line)
1910 (goto-char (line-end-position)))) t)
1911
45c138ac 1912\f
e2803784
FEG
1913;;; Skeletons
1914
1915(defcustom python-skeleton-autoinsert nil
1916 "Non-nil means template skeletons will be automagically inserted.
1917This happens when pressing \"if<SPACE>\", for example, to prompt for
1918the if condition."
1919 :type 'boolean
0f55249e
FEG
1920 :group 'python
1921 :safe 'booleanp)
e2803784
FEG
1922
1923(defvar python-skeleton-available '()
1924 "Internal list of available skeletons.")
e2803784
FEG
1925
1926(define-abbrev-table 'python-mode-abbrev-table ()
1927 "Abbrev table for Python mode."
1928 :case-fixed t
1929 ;; Allow / inside abbrevs.
1930 :regexp "\\(?:^\\|[^/]\\)\\<\\([[:word:]/]+\\)\\W*"
1931 ;; Only expand in code.
1932 :enable-function (lambda ()
e2803784 1933 (and
14a78495
FEG
1934 (not (or (python-info-ppss-context 'string)
1935 (python-info-ppss-context 'comment)))
e2803784
FEG
1936 python-skeleton-autoinsert)))
1937
1938(defmacro python-skeleton-define (name doc &rest skel)
1939 "Define a `python-mode' skeleton using NAME DOC and SKEL.
1940The skeleton will be bound to python-skeleton-NAME and will
1941be added to `python-mode-abbrev-table'."
1942 (let* ((name (symbol-name name))
1943 (function-name (intern (concat "python-skeleton-" name))))
73ed6836
FEG
1944 `(progn
1945 (define-abbrev python-mode-abbrev-table ,name "" ',function-name)
1946 (setq python-skeleton-available
1947 (cons ',function-name python-skeleton-available))
1948 (define-skeleton ,function-name
1949 ,(or doc
1950 (format "Insert %s statement." name))
1951 ,@skel))))
e2803784
FEG
1952(put 'python-skeleton-define 'lisp-indent-function 2)
1953
1954(defmacro python-define-auxiliary-skeleton (name doc &optional &rest skel)
1955 "Define a `python-mode' auxiliary skeleton using NAME DOC and SKEL.
1956The skeleton will be bound to python-skeleton-NAME."
1957 (let* ((name (symbol-name name))
1958 (function-name (intern (concat "python-skeleton--" name)))
1959 (msg (format
1960 "Add '%s' clause? " name)))
1961 (when (not skel)
1962 (setq skel
1963 `(< ,(format "%s:" name) \n \n
1964 > _ \n)))
1965 `(define-skeleton ,function-name
1966 ,(or doc
1967 (format "Auxiliary skeleton for %s statement." name))
1968 nil
1969 (unless (y-or-n-p ,msg)
1970 (signal 'quit t))
1971 ,@skel)))
1972(put 'python-define-auxiliary-skeleton 'lisp-indent-function 2)
1973
1974(python-define-auxiliary-skeleton else nil)
1975
1976(python-define-auxiliary-skeleton except nil)
1977
1978(python-define-auxiliary-skeleton finally nil)
1979
1980(python-skeleton-define if nil
1981 "Condition: "
1982 "if " str ":" \n
1983 _ \n
1984 ("other condition, %s: "
1985 <
1986 "elif " str ":" \n
1987 > _ \n nil)
1988 '(python-skeleton--else) | ^)
1989
1990(python-skeleton-define while nil
1991 "Condition: "
1992 "while " str ":" \n
1993 > _ \n
1994 '(python-skeleton--else) | ^)
1995
1996(python-skeleton-define for nil
1997 "Iteration spec: "
1998 "for " str ":" \n
1999 > _ \n
2000 '(python-skeleton--else) | ^)
2001
2002(python-skeleton-define try nil
2003 nil
2004 "try:" \n
2005 > _ \n
2006 ("Exception, %s: "
2007 <
2008 "except " str ":" \n
2009 > _ \n nil)
2010 resume:
2011 '(python-skeleton--except)
2012 '(python-skeleton--else)
2013 '(python-skeleton--finally) | ^)
2014
2015(python-skeleton-define def nil
2016 "Function name: "
2017 "def " str " (" ("Parameter, %s: "
2018 (unless (equal ?\( (char-before)) ", ")
2019 str) "):" \n
2020 "\"\"\"" - "\"\"\"" \n
2021 > _ \n)
2022
2023(python-skeleton-define class nil
2024 "Class name: "
2025 "class " str " (" ("Inheritance, %s: "
2026 (unless (equal ?\( (char-before)) ", ")
2027 str)
2028 & ")" | -2
2029 ":" \n
2030 "\"\"\"" - "\"\"\"" \n
2031 > _ \n)
2032
2033(defun python-skeleton-add-menu-items ()
2034 "Add menu items to Python->Skeletons menu."
2035 (let ((skeletons (sort python-skeleton-available 'string<))
2036 (items))
2037 (dolist (skeleton skeletons)
2038 (easy-menu-add-item
2039 nil '("Python" "Skeletons")
2040 `[,(format
2041 "Insert %s" (caddr (split-string (symbol-name skeleton) "-")))
2042 ,skeleton t]))))
2043\f
046428d3
FEG
2044;;; FFAP
2045
0f55249e 2046(defcustom python-ffap-setup-code
046428d3
FEG
2047 "def __FFAP_get_module_path(module):
2048 try:
2049 import os
2050 path = __import__(module).__file__
2051 if path[-4:] == '.pyc' and os.path.exists(path[0:-1]):
2052 path = path[:-1]
2053 return path
2054 except:
2055 return ''"
0f55249e
FEG
2056 "Python code to get a module path."
2057 :type 'string
2058 :group 'python
2059 :safe 'stringp)
046428d3 2060
0f55249e 2061(defcustom python-ffap-string-code
046428d3 2062 "__FFAP_get_module_path('''%s''')\n"
0f55249e
FEG
2063 "Python code used to get a string with the path of a module."
2064 :type 'string
2065 :group 'python
2066 :safe 'stringp)
046428d3 2067
046428d3
FEG
2068(defun python-ffap-module-path (module)
2069 "Function for `ffap-alist' to return path for MODULE."
2070 (let ((process (or
2071 (and (eq major-mode 'inferior-python-mode)
2072 (get-buffer-process (current-buffer)))
2073 (python-shell-get-process))))
2074 (if (not process)
2075 nil
2076 (let ((module-file
9ce938be 2077 (python-shell-send-string-no-output
046428d3
FEG
2078 (format python-ffap-string-code module) process)))
2079 (when module-file
2947016a 2080 (substring-no-properties module-file 1 -1))))))
046428d3
FEG
2081
2082(eval-after-load "ffap"
2083 '(progn
2084 (push '(python-mode . python-ffap-module-path) ffap-alist)
2085 (push '(inferior-python-mode . python-ffap-module-path) ffap-alist)))
2086
046428d3 2087\f
8b3e0e76
FEG
2088;;; Code check
2089
0f55249e 2090(defcustom python-check-command
8b3e0e76 2091 "pychecker --stdlib"
0f55249e
FEG
2092 "Command used to check a Python file."
2093 :type 'string
2094 :group 'python
2095 :safe 'stringp)
8b3e0e76
FEG
2096
2097(defvar python-check-custom-command nil
2098 "Internal use.")
2099
2100(defun python-check (command)
2101 "Check a Python file (default current buffer's file).
2102Runs COMMAND, a shell command, as if by `compile'. See
2103`python-check-command' for the default."
2104 (interactive
2105 (list (read-string "Check command: "
2106 (or python-check-custom-command
2107 (concat python-check-command " "
2108 (shell-quote-argument
2109 (or
2110 (let ((name (buffer-file-name)))
2111 (and name
2112 (file-name-nondirectory name)))
2113 "")))))))
2114 (setq python-check-custom-command command)
2115 (save-some-buffers (not compilation-ask-about-save) nil)
2116 (compilation-start command))
2117
2118\f
45c138ac
FEG
2119;;; Eldoc
2120
0f55249e 2121(defcustom python-eldoc-setup-code
45c138ac
FEG
2122 "def __PYDOC_get_help(obj):
2123 try:
15cc40b8 2124 import inspect
9e662938
FEG
2125 if hasattr(obj, 'startswith'):
2126 obj = eval(obj, globals())
15cc40b8
FEG
2127 doc = inspect.getdoc(obj)
2128 if not doc and callable(obj):
2129 target = None
2130 if inspect.isclass(obj) and hasattr(obj, '__init__'):
2131 target = obj.__init__
2132 objtype = 'class'
2133 else:
2134 target = obj
2135 objtype = 'def'
2136 if target:
2137 args = inspect.formatargspec(
2138 *inspect.getargspec(target)
2139 )
2140 name = obj.__name__
2141 doc = '{objtype} {name}{args}'.format(
2142 objtype=objtype, name=name, args=args
2143 )
2144 else:
2145 doc = doc.splitlines()[0]
45c138ac 2146 except:
9e662938
FEG
2147 doc = ''
2148 try:
2149 exec('print doc')
2150 except SyntaxError:
2151 print(doc)"
0f55249e
FEG
2152 "Python code to setup documentation retrieval."
2153 :type 'string
2154 :group 'python
2155 :safe 'stringp)
45c138ac 2156
0f55249e 2157(defcustom python-eldoc-string-code
9e662938 2158 "__PYDOC_get_help('''%s''')\n"
0f55249e
FEG
2159 "Python code used to get a string with the documentation of an object."
2160 :type 'string
2161 :group 'python
2162 :safe 'stringp)
45c138ac 2163
78334b43 2164(defun python-eldoc--get-doc-at-point (&optional force-input force-process)
d439cda5
FEG
2165 "Internal implementation to get documentation at point.
2166If not FORCE-INPUT is passed then what `current-word' returns
2167will be used. If not FORCE-PROCESS is passed what
2168`python-shell-get-process' returns is used."
78334b43 2169 (let ((process (or force-process (python-shell-get-process))))
45c138ac
FEG
2170 (if (not process)
2171 "Eldoc needs an inferior Python process running."
2172 (let* ((current-defun (python-info-current-defun))
78334b43
FEG
2173 (input (or force-input
2174 (with-syntax-table python-dotty-syntax-table
2175 (if (not current-defun)
2176 (current-word)
2177 (concat current-defun "." (current-word))))))
45c138ac
FEG
2178 (ppss (syntax-ppss))
2179 (help (when (and input
2180 (not (string= input (concat current-defun ".")))
14a78495
FEG
2181 (not (or (python-info-ppss-context 'string ppss)
2182 (python-info-ppss-context 'comment ppss))))
45c138ac
FEG
2183 (when (string-match (concat
2184 (regexp-quote (concat current-defun "."))
2185 "self\\.") input)
2186 (with-temp-buffer
2187 (insert input)
2188 (goto-char (point-min))
2189 (forward-word)
2190 (forward-char)
2191 (delete-region (point-marker) (search-forward "self."))
2192 (setq input (buffer-substring (point-min) (point-max)))))
9ce938be 2193 (python-shell-send-string-no-output
1066882c 2194 (format python-eldoc-string-code input) process))))
45c138ac
FEG
2195 (with-current-buffer (process-buffer process)
2196 (when comint-last-prompt-overlay
2197 (delete-region comint-last-input-end
2198 (overlay-start comint-last-prompt-overlay))))
2199 (when (and help
2200 (not (string= help "\n")))
2201 help)))))
2202
78334b43
FEG
2203(defun python-eldoc-function ()
2204 "`eldoc-documentation-function' for Python.
2205For this to work the best as possible you should call
2206`python-shell-send-buffer' from time to time so context in
2207inferior python process is updated properly."
2208 (python-eldoc--get-doc-at-point))
2209
2210(defun python-eldoc-at-point (symbol)
2211 "Get help on SYMBOL using `help'.
2212Interactively, prompt for symbol."
2213 (interactive
2214 (let ((symbol (with-syntax-table python-dotty-syntax-table
2215 (current-word)))
2216 (enable-recursive-minibuffers t))
2217 (list (read-string (if symbol
2218 (format "Describe symbol (default %s): " symbol)
2219 "Describe symbol: ")
2220 nil nil symbol))))
2221 (let ((process (python-shell-get-process)))
2222 (if (not process)
2223 (message "Eldoc needs an inferior Python process running.")
15cc40b8 2224 (message (python-eldoc--get-doc-at-point symbol process)))))
78334b43 2225
45c138ac 2226\f
fc2dc7df
FEG
2227;;; Imenu
2228
2229(defcustom python-imenu-include-defun-type t
2230 "Non-nil make imenu items to include its type."
2231 :type 'boolean
2232 :group 'python
2233 :safe 'booleanp)
2234
c942de99 2235(defcustom python-imenu-make-tree t
fc2dc7df
FEG
2236 "Non-nil make imenu to build a tree menu.
2237Set to nil for speed."
2238 :type 'boolean
2239 :group 'python
2240 :safe 'booleanp)
2241
2242(defcustom python-imenu-subtree-root-label "<Jump to %s>"
2243 "Label displayed to navigate to root from a subtree.
2244It can contain a \"%s\" which will be replaced with the root name."
2245 :type 'string
2246 :group 'python
2247 :safe 'stringp)
2248
2249(defvar python-imenu-index-alist nil
2250 "Calculated index tree for imenu.")
2251
2252(defun python-imenu-tree-assoc (keylist tree)
2253 "Using KEYLIST traverse TREE."
2254 (if keylist
2255 (python-imenu-tree-assoc (cdr keylist)
2256 (ignore-errors (assoc (car keylist) tree)))
2257 tree))
2258
2259(defun python-imenu-make-element-tree (element-list full-element plain-index)
2260 "Make a tree from plain alist of module names.
2261ELEMENT-LIST is the defun name splitted by \".\" and FULL-ELEMENT
2262is the same thing, the difference is that FULL-ELEMENT remains
2263untouched in all recursive calls.
2264Argument PLAIN-INDEX is the calculated plain index used to build the tree."
2265 (when (not (python-imenu-tree-assoc full-element python-imenu-index-alist))
2266 (when element-list
2267 (let* ((subelement-point (cdr (assoc
2268 (mapconcat #'identity full-element ".")
2269 plain-index)))
2270 (subelement-name (car element-list))
c942de99
FEG
2271 (subelement-position (python-util-position
2272 subelement-name full-element))
fc2dc7df
FEG
2273 (subelement-path (when subelement-position
2274 (butlast
2275 full-element
2276 (- (length full-element)
2277 subelement-position)))))
2278 (let ((path-ref (python-imenu-tree-assoc subelement-path
2279 python-imenu-index-alist)))
2280 (if (not path-ref)
2281 (push (cons subelement-name subelement-point)
2282 python-imenu-index-alist)
2283 (when (not (listp (cdr path-ref)))
2284 ;; Modifiy root cdr to be a list
2285 (setcdr path-ref
2286 (list (cons (format python-imenu-subtree-root-label
2287 (car path-ref))
2288 (cdr (assoc
2289 (mapconcat #'identity
2290 subelement-path ".")
2291 plain-index))))))
2292 (when (not (assoc subelement-name path-ref))
2293 (push (cons subelement-name subelement-point) (cdr path-ref))))))
2294 (python-imenu-make-element-tree (cdr element-list)
2295 full-element plain-index))))
2296
2297(defun python-imenu-make-tree (index)
fc6c545e 2298 "Build the imenu alist tree from plain INDEX.
fc2dc7df
FEG
2299
2300The idea of this function is that given the alist:
2301
2302 '((\"Test\" . 100)
2303 (\"Test.__init__\" . 200)
2304 (\"Test.some_method\" . 300)
2305 (\"Test.some_method.another\" . 400)
2306 (\"Test.something_else\" . 500)
2307 (\"test\" . 600)
2308 (\"test.reprint\" . 700)
2309 (\"test.reprint\" . 800))
2310
2311This tree gets built:
2312
2313 '((\"Test\" . ((\"jump to...\" . 100)
2314 (\"__init__\" . 200)
2315 (\"some_method\" . ((\"jump to...\" . 300)
2316 (\"another\" . 400)))
2317 (\"something_else\" . 500)))
2318 (\"test\" . ((\"jump to...\" . 600)
2319 (\"reprint\" . 700)
2320 (\"reprint\" . 800))))
2321
2322Internally it uses `python-imenu-make-element-tree' to create all
2323branches for each element."
fc6c545e
FEG
2324 (setq python-imenu-index-alist nil)
2325 (mapc (lambda (element)
2326 (python-imenu-make-element-tree element element index))
2327 (mapcar (lambda (element)
2328 (split-string (car element) "\\." t)) index))
2329 python-imenu-index-alist)
fc2dc7df
FEG
2330
2331(defun python-imenu-create-index ()
2332 "`imenu-create-index-function' for Python."
fc6c545e
FEG
2333 (let ((index
2334 (python-nav-list-defun-positions python-imenu-include-defun-type)))
fc2dc7df
FEG
2335 (if python-imenu-make-tree
2336 (python-imenu-make-tree index)
2337 index)))
2338
2339\f
45c138ac
FEG
2340;;; Misc helpers
2341
fc2dc7df 2342(defun python-info-current-defun (&optional include-type)
45c138ac 2343 "Return name of surrounding function with Python compatible dotty syntax.
fc2dc7df 2344Optional argument INCLUDE-TYPE indicates to include the type of the defun.
45c138ac
FEG
2345This function is compatible to be used as
2346`add-log-current-defun-function' since it returns nil if point is
2347not inside a defun."
6b432853 2348 (let ((names '())
0b7b2e51
FEG
2349 (min-indent)
2350 (first-run t))
45c138ac
FEG
2351 (save-restriction
2352 (widen)
2353 (save-excursion
6b432853 2354 (goto-char (line-end-position))
589cefd7 2355 (forward-comment -9999)
15cc40b8 2356 (setq min-indent (current-indentation))
fc2dc7df 2357 (while (python-beginning-of-defun-function 1 t)
0b7b2e51
FEG
2358 (when (or (< (current-indentation) min-indent)
2359 first-run)
2360 (setq first-run nil)
6b432853 2361 (setq min-indent (current-indentation))
af5c1beb 2362 (looking-at python-nav-beginning-of-defun-regexp)
fc2dc7df
FEG
2363 (setq names (cons
2364 (if (not include-type)
2365 (match-string-no-properties 1)
2366 (mapconcat 'identity
2367 (split-string
2368 (match-string-no-properties 0)) " "))
2369 names))))))
45c138ac
FEG
2370 (when names
2371 (mapconcat (lambda (string) string) names "."))))
2372
2373(defun python-info-closing-block ()
e2d8d479 2374 "Return the point of the block the current line closes."
45c138ac
FEG
2375 (let ((closing-word (save-excursion
2376 (back-to-indentation)
2377 (current-word)))
2378 (indentation (current-indentation)))
2379 (when (member closing-word python-indent-dedenters)
2380 (save-excursion
2381 (forward-line -1)
2382 (while (and (> (current-indentation) indentation)
2383 (not (bobp))
2384 (not (back-to-indentation))
2385 (forward-line -1)))
2386 (back-to-indentation)
2387 (cond
2388 ((not (equal indentation (current-indentation))) nil)
2389 ((string= closing-word "elif")
2390 (when (member (current-word) '("if" "elif"))
2391 (point-marker)))
2392 ((string= closing-word "else")
2393 (when (member (current-word) '("if" "elif" "except" "for" "while"))
2394 (point-marker)))
2395 ((string= closing-word "except")
2396 (when (member (current-word) '("try"))
2397 (point-marker)))
2398 ((string= closing-word "finally")
2399 (when (member (current-word) '("except" "else"))
2400 (point-marker))))))))
2401
2402(defun python-info-line-ends-backslash-p ()
2403 "Return non-nil if current line ends with backslash."
2404 (string= (or (ignore-errors
2405 (buffer-substring
2406 (line-end-position)
2407 (- (line-end-position) 1))) "") "\\"))
2408
2409(defun python-info-continuation-line-p ()
2410 "Return non-nil if current line is continuation of another."
85655287
FEG
2411 (let ((current-ppss-context-type (python-info-ppss-context-type)))
2412 (and
2413 (equal (save-excursion
2414 (goto-char (line-end-position))
2415 (forward-comment 9999)
2416 (python-info-ppss-context-type))
2417 current-ppss-context-type)
2418 (or (python-info-line-ends-backslash-p)
2419 (string-match ",[[:space:]]*$" (buffer-substring
2420 (line-beginning-position)
2421 (line-end-position)))
2422 (save-excursion
2423 (let ((innermost-paren (progn
2424 (goto-char (line-end-position))
2425 (python-info-ppss-context 'paren))))
2426 (when (and innermost-paren
2427 (and (<= (line-beginning-position) innermost-paren)
2428 (>= (line-end-position) innermost-paren)))
2429 (goto-char innermost-paren)
2430 (looking-at (python-rx open-paren (* space) line-end)))))
2431 (save-excursion
2432 (back-to-indentation)
2433 (python-info-ppss-context 'paren))))))
45c138ac
FEG
2434
2435(defun python-info-block-continuation-line-p ()
2436 "Return non-nil if current line is a continuation of a block."
2437 (save-excursion
2438 (while (and (not (bobp))
2439 (python-info-continuation-line-p))
2440 (forward-line -1))
2441 (forward-line 1)
2442 (back-to-indentation)
2443 (when (looking-at (python-rx block-start))
2444 (point-marker))))
2445
2446(defun python-info-assignment-continuation-line-p ()
2447 "Return non-nil if current line is a continuation of an assignment."
2448 (save-excursion
2449 (while (and (not (bobp))
2450 (python-info-continuation-line-p))
2451 (forward-line -1))
2452 (forward-line 1)
2453 (back-to-indentation)
2454 (when (and (not (looking-at (python-rx block-start)))
2455 (save-excursion
2456 (and (re-search-forward (python-rx not-simple-operator
2457 assignment-operator
2458 not-simple-operator)
2459 (line-end-position) t)
14a78495 2460 (not (or (python-info-ppss-context 'string)
9f1537ef 2461 (python-info-ppss-context 'paren)
14a78495 2462 (python-info-ppss-context 'comment))))))
45c138ac
FEG
2463 (point-marker))))
2464
14a78495
FEG
2465(defun python-info-ppss-context (type &optional syntax-ppss)
2466 "Return non-nil if point is on TYPE using SYNTAX-PPSS.
85655287 2467TYPE can be 'comment, 'string or 'paren. It returns the start
14a78495
FEG
2468character address of the specified TYPE."
2469 (let ((ppss (or syntax-ppss (syntax-ppss))))
2470 (case type
2471 ('comment
2472 (and (nth 4 ppss)
2473 (nth 8 ppss)))
2474 ('string
2475 (nth 8 ppss))
2476 ('paren
2477 (nth 1 ppss))
2478 (t nil))))
2479
85655287
FEG
2480(defun python-info-ppss-context-type (&optional syntax-ppss)
2481 "Return the context type using SYNTAX-PPSS.
2482The type returned can be 'comment, 'string or 'paren."
2483 (let ((ppss (or syntax-ppss (syntax-ppss))))
2484 (cond
2485 ((and (nth 4 ppss)
2486 (nth 8 ppss))
2487 'comment)
2488 ((nth 8 ppss)
2489 'string)
2490 ((nth 1 ppss)
2491 'paren)
2492 (t nil))))
2493
45c138ac 2494\f
c942de99
FEG
2495;;; Utility functions
2496
c942de99
FEG
2497(defun python-util-position (item seq)
2498 "Find the first occurrence of ITEM in SEQ.
2499Return the index of the matching item, or nil if not found."
2500 (let ((member-result (member item seq)))
2501 (when member-result
2502 (- (length seq) (length member-result)))))
2503
d2190c57 2504;; Stolen from org-mode
fbc39529 2505(defun python-util-clone-local-variables (from-buffer &optional regexp)
d2190c57
FEG
2506 "Clone local variables from FROM-BUFFER.
2507Optional argument REGEXP selects variables to clone and defaults
2508to \"^python-\"."
2509 (mapc
2510 (lambda (pair)
2511 (and (symbolp (car pair))
2512 (string-match (or regexp "^python-")
2513 (symbol-name (car pair)))
2514 (set (make-local-variable (car pair))
2515 (cdr pair))))
2516 (buffer-local-variables from-buffer)))
2517
c942de99 2518\f
45c138ac
FEG
2519;;;###autoload
2520(define-derived-mode python-mode fundamental-mode "Python"
e2d8d479
FEG
2521 "Major mode for editing Python files.
2522
2523\\{python-mode-map}
2524Entry to this mode calls the value of `python-mode-hook'
2525if that value is non-nil."
45c138ac
FEG
2526 (set (make-local-variable 'tab-width) 8)
2527 (set (make-local-variable 'indent-tabs-mode) nil)
2528
2529 (set (make-local-variable 'comment-start) "# ")
2530 (set (make-local-variable 'comment-start-skip) "#+\\s-*")
2531
2532 (set (make-local-variable 'parse-sexp-lookup-properties) t)
2533 (set (make-local-variable 'parse-sexp-ignore-comments) t)
2534
2535 (set (make-local-variable 'font-lock-defaults)
2536 '(python-font-lock-keywords
2537 nil nil nil nil
2538 (font-lock-syntactic-keywords . python-font-lock-syntactic-keywords)))
2539
2540 (set (make-local-variable 'indent-line-function) #'python-indent-line-function)
2541 (set (make-local-variable 'indent-region-function) #'python-indent-region)
2542
2543 (set (make-local-variable 'paragraph-start) "\\s-*$")
2544 (set (make-local-variable 'fill-paragraph-function) 'python-fill-paragraph-function)
2545
2546 (set (make-local-variable 'beginning-of-defun-function)
2547 #'python-beginning-of-defun-function)
2548 (set (make-local-variable 'end-of-defun-function)
2549 #'python-end-of-defun-function)
2550
2551 (add-hook 'completion-at-point-functions
2552 'python-completion-complete-at-point nil 'local)
2553
fc2dc7df
FEG
2554 (setq imenu-create-index-function #'python-imenu-create-index)
2555
45c138ac
FEG
2556 (set (make-local-variable 'add-log-current-defun-function)
2557 #'python-info-current-defun)
2558
e2803784
FEG
2559 (set (make-local-variable 'skeleton-further-elements)
2560 '((abbrev-mode nil)
2561 (< '(backward-delete-char-untabify (min python-indent-offset
2562 (current-column))))
2563 (^ '(- (1+ (current-indentation))))))
2564
45c138ac
FEG
2565 (set (make-local-variable 'eldoc-documentation-function)
2566 #'python-eldoc-function)
2567
2568 (add-to-list 'hs-special-modes-alist
2569 `(python-mode "^\\s-*\\(?:def\\|class\\)\\>" nil "#"
2570 ,(lambda (arg)
2571 (python-end-of-defun-function)) nil))
2572
82c2b0de
FEG
2573 (set (make-local-variable 'mode-require-final-newline) t)
2574
45c138ac
FEG
2575 (set (make-local-variable 'outline-regexp)
2576 (python-rx (* space) block-start))
2577 (set (make-local-variable 'outline-heading-end-regexp) ":\\s-*\n")
2578 (set (make-local-variable 'outline-level)
2579 #'(lambda ()
2580 "`outline-level' function for Python mode."
2581 (1+ (/ (current-indentation) python-indent-offset))))
2582
e2803784
FEG
2583 (python-skeleton-add-menu-items)
2584
45c138ac
FEG
2585 (when python-indent-guess-indent-offset
2586 (python-indent-guess-indent-offset)))
2587
2588
2589(provide 'python)
2590;;; python.el ends here