2013-12-26 13:45:19 -03:00
|
|
|
|
;;; python.el --- Python's flying circus support for Emacs -*- lexical-binding: t -*-
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
2020-01-01 00:19:43 +00:00
|
|
|
|
;; Copyright (C) 2003-2020 Free Software Foundation, Inc.
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
2015-08-21 19:36:01 -03:00
|
|
|
|
;; Author: Fabián E. Gallina <fgallina@gnu.org>
|
2012-05-17 00:03:18 -03:00
|
|
|
|
;; URL: https://github.com/fgallina/python.el
|
2018-02-27 19:44:35 -05:00
|
|
|
|
;; Version: 0.26.1
|
2015-08-21 19:36:01 -03:00
|
|
|
|
;; Package-Requires: ((emacs "24.1") (cl-lib "1.0"))
|
2019-05-25 13:43:06 -07:00
|
|
|
|
;; Maintainer: emacs-devel@gnu.org
|
2012-05-17 00:02:52 -03:00
|
|
|
|
;; Created: Jul 2010
|
|
|
|
|
;; Keywords: languages
|
|
|
|
|
|
2012-05-17 00:03:45 -03:00
|
|
|
|
;; This file is part of GNU Emacs.
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
2012-05-17 00:03:45 -03:00
|
|
|
|
;; GNU Emacs is free software: you can redistribute it and/or modify
|
|
|
|
|
;; it under the terms of the GNU General Public License as published
|
|
|
|
|
;; by the Free Software Foundation, either version 3 of the License,
|
|
|
|
|
;; or (at your option) any later version.
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
2012-05-17 00:03:45 -03:00
|
|
|
|
;; GNU Emacs is distributed in the hope that it will be useful, but
|
|
|
|
|
;; WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
|
;; General Public License for more details.
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
|
|
|
|
;; You should have received a copy of the GNU General Public License
|
2017-09-13 15:52:52 -07:00
|
|
|
|
;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
|
|
|
|
;;; Commentary:
|
|
|
|
|
|
|
|
|
|
;; Major mode for editing Python files with some fontification and
|
|
|
|
|
;; indentation bits extracted from original Dave Love's python.el
|
|
|
|
|
;; found in GNU/Emacs.
|
|
|
|
|
|
|
|
|
|
;; Implements Syntax highlighting, Indentation, Movement, Shell
|
2014-07-26 20:43:51 -03:00
|
|
|
|
;; interaction, Shell completion, Shell virtualenv support, Shell
|
2014-07-27 03:39:17 -03:00
|
|
|
|
;; package support, Shell syntax highlighting, Pdb tracking, Symbol
|
|
|
|
|
;; completion, Skeletons, FFAP, Code Check, Eldoc, Imenu.
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
|
|
|
|
;; Syntax highlighting: Fontification of code is provided and supports
|
|
|
|
|
;; python's triple quoted strings properly.
|
|
|
|
|
|
|
|
|
|
;; Indentation: Automatic indentation with indentation cycling is
|
|
|
|
|
;; provided, it allows you to navigate different available levels of
|
2013-11-28 21:03:39 -05:00
|
|
|
|
;; indentation by hitting <tab> several times. Also electric-indent-mode
|
|
|
|
|
;; is supported such that when inserting a colon the current line is
|
|
|
|
|
;; dedented automatically if needed.
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
|
|
|
|
;; Movement: `beginning-of-defun' and `end-of-defun' functions are
|
2012-05-17 00:03:25 -03:00
|
|
|
|
;; properly implemented. There are also specialized
|
2012-07-16 10:13:01 -03:00
|
|
|
|
;; `forward-sentence' and `backward-sentence' replacements called
|
|
|
|
|
;; `python-nav-forward-block', `python-nav-backward-block'
|
|
|
|
|
;; respectively which navigate between beginning of blocks of code.
|
|
|
|
|
;; Extra functions `python-nav-forward-statement',
|
2012-07-17 15:02:53 -03:00
|
|
|
|
;; `python-nav-backward-statement',
|
|
|
|
|
;; `python-nav-beginning-of-statement', `python-nav-end-of-statement',
|
2013-09-02 00:37:18 -03:00
|
|
|
|
;; `python-nav-beginning-of-block', `python-nav-end-of-block' and
|
|
|
|
|
;; `python-nav-if-name-main' are included but no bound to any key. At
|
|
|
|
|
;; last but not least the specialized `python-nav-forward-sexp' allows
|
|
|
|
|
;; easy navigation between code blocks. If you prefer `cc-mode'-like
|
|
|
|
|
;; `forward-sexp' movement, setting `forward-sexp-function' to nil is
|
|
|
|
|
;; enough, You can do that using the `python-mode-hook':
|
2013-02-13 21:42:11 -03:00
|
|
|
|
|
|
|
|
|
;; (add-hook 'python-mode-hook
|
|
|
|
|
;; (lambda () (setq forward-sexp-function nil)))
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
2014-07-20 15:12:30 -03:00
|
|
|
|
;; Shell interaction: is provided and allows opening Python shells
|
|
|
|
|
;; inside Emacs and executing any block of code of your current buffer
|
|
|
|
|
;; in that inferior Python process.
|
|
|
|
|
|
|
|
|
|
;; Besides that only the standard CPython (2.x and 3.x) shell and
|
|
|
|
|
;; IPython are officially supported out of the box, the interaction
|
|
|
|
|
;; should support any other readline based Python shells as well
|
2014-12-27 20:58:45 -03:00
|
|
|
|
;; (e.g. Jython and PyPy have been reported to work). You can change
|
2014-07-20 15:12:30 -03:00
|
|
|
|
;; your default interpreter and commandline arguments by setting the
|
|
|
|
|
;; `python-shell-interpreter' and `python-shell-interpreter-args'
|
|
|
|
|
;; variables. This example enables IPython globally:
|
|
|
|
|
|
|
|
|
|
;; (setq python-shell-interpreter "ipython"
|
|
|
|
|
;; python-shell-interpreter-args "-i")
|
|
|
|
|
|
|
|
|
|
;; Using the "console" subcommand to start IPython in server-client
|
|
|
|
|
;; mode is known to fail intermittently due a bug on IPython itself
|
2017-09-13 15:52:52 -07:00
|
|
|
|
;; (see URL `https://debbugs.gnu.org/cgi/bugreport.cgi?bug=18052#27').
|
2014-07-20 15:12:30 -03:00
|
|
|
|
;; There seems to be a race condition in the IPython server (A.K.A
|
|
|
|
|
;; kernel) when code is sent while it is still initializing, sometimes
|
|
|
|
|
;; causing the shell to get stalled. With that said, if an IPython
|
|
|
|
|
;; kernel is already running, "console --existing" seems to work fine.
|
|
|
|
|
|
|
|
|
|
;; Running IPython on Windows needs more tweaking. The way you should
|
|
|
|
|
;; set `python-shell-interpreter' and `python-shell-interpreter-args'
|
|
|
|
|
;; is as follows (of course you need to modify the paths according to
|
|
|
|
|
;; your system):
|
|
|
|
|
|
2017-12-03 00:24:21 -05:00
|
|
|
|
;; (setq python-shell-interpreter "C:/Python27/python.exe"
|
2014-07-20 15:12:30 -03:00
|
|
|
|
;; python-shell-interpreter-args
|
2017-12-03 00:24:21 -05:00
|
|
|
|
;; "-i C:/Python27/Scripts/ipython-script.py")
|
2014-07-20 15:12:30 -03:00
|
|
|
|
|
2014-11-22 20:09:30 -03:00
|
|
|
|
;; Missing or delayed output used to happen due to differences between
|
|
|
|
|
;; Operating Systems' pipe buffering (e.g. CPython 3.3.4 in Windows 7.
|
2017-09-13 15:52:52 -07:00
|
|
|
|
;; See URL `https://debbugs.gnu.org/cgi/bugreport.cgi?bug=17304'). To
|
2014-11-22 20:09:30 -03:00
|
|
|
|
;; avoid this, the `python-shell-unbuffered' defaults to non-nil and
|
|
|
|
|
;; controls whether `python-shell-calculate-process-environment'
|
|
|
|
|
;; should set the "PYTHONUNBUFFERED" environment variable on startup:
|
|
|
|
|
;; See URL `https://docs.python.org/3/using/cmdline.html#cmdoption-u'.
|
2014-07-20 16:51:16 -03:00
|
|
|
|
|
2014-07-20 15:12:30 -03:00
|
|
|
|
;; The interaction relies upon having prompts for input (e.g. ">>> "
|
|
|
|
|
;; and "... " in standard Python shell) and output (e.g. "Out[1]: " in
|
|
|
|
|
;; IPython) detected properly. Failing that Emacs may hang but, in
|
|
|
|
|
;; the case that happens, you can recover with \\[keyboard-quit]. To
|
|
|
|
|
;; avoid this issue, a two-step prompt autodetection mechanism is
|
|
|
|
|
;; provided: the first step is manual and consists of a collection of
|
|
|
|
|
;; regular expressions matching common prompts for Python shells
|
|
|
|
|
;; stored in `python-shell-prompt-input-regexps' and
|
2014-07-19 10:13:07 -03:00
|
|
|
|
;; `python-shell-prompt-output-regexps', and dir-local friendly vars
|
|
|
|
|
;; `python-shell-prompt-regexp', `python-shell-prompt-block-regexp',
|
|
|
|
|
;; `python-shell-prompt-output-regexp' which are appended to the
|
|
|
|
|
;; former automatically when a shell spawns; the second step is
|
|
|
|
|
;; automatic and depends on the `python-shell-prompt-detect' helper
|
|
|
|
|
;; function. See its docstring for details on global variables that
|
|
|
|
|
;; modify its behavior.
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
|
|
|
|
;; Shell completion: hitting tab will try to complete the current
|
2014-12-27 20:58:45 -03:00
|
|
|
|
;; word. The two built-in mechanisms depend on Python's readline
|
|
|
|
|
;; module: the "native" completion is tried first and is activated
|
|
|
|
|
;; when `python-shell-completion-native-enable' is non-nil, the
|
|
|
|
|
;; current `python-shell-interpreter' is not a member of the
|
|
|
|
|
;; `python-shell-completion-native-disabled-interpreters' variable and
|
|
|
|
|
;; `python-shell-completion-native-setup' succeeds; the "fallback" or
|
|
|
|
|
;; "legacy" mechanism works by executing Python code in the background
|
|
|
|
|
;; and enables auto-completion for shells that do not support
|
|
|
|
|
;; receiving escape sequences (with some limitations, i.e. completion
|
|
|
|
|
;; in blocks does not work). The code executed for the "fallback"
|
|
|
|
|
;; completion can be found in `python-shell-completion-setup-code' and
|
|
|
|
|
;; `python-shell-completion-string-code' variables. Their default
|
|
|
|
|
;; values enable completion for both CPython and IPython, and probably
|
|
|
|
|
;; any readline based shell (it's known to work with PyPy). If your
|
|
|
|
|
;; Python installation lacks readline (like CPython for Windows),
|
|
|
|
|
;; installing pyreadline (URL `http://ipython.org/pyreadline.html')
|
|
|
|
|
;; should suffice. To troubleshoot why you are not getting any
|
|
|
|
|
;; completions, you can try the following in your Python shell:
|
2014-07-20 15:12:30 -03:00
|
|
|
|
|
|
|
|
|
;; >>> import readline, rlcompleter
|
|
|
|
|
|
|
|
|
|
;; If you see an error, then you need to either install pyreadline or
|
|
|
|
|
;; setup custom code that avoids that dependency.
|
2012-05-17 00:03:07 -03:00
|
|
|
|
|
2012-05-17 00:03:21 -03:00
|
|
|
|
;; Shell virtualenv support: The shell also contains support for
|
|
|
|
|
;; virtualenvs and other special environment modifications thanks to
|
2012-05-17 00:03:10 -03:00
|
|
|
|
;; `python-shell-process-environment' and `python-shell-exec-path'.
|
|
|
|
|
;; These two variables allows you to modify execution paths and
|
2012-05-17 00:03:24 -03:00
|
|
|
|
;; environment variables to make easy for you to setup virtualenv rules
|
2012-05-17 00:03:21 -03:00
|
|
|
|
;; or behavior modifications when running shells. Here is an example
|
2012-05-17 00:03:10 -03:00
|
|
|
|
;; of how to make shell processes to be run using the /path/to/env/
|
|
|
|
|
;; virtualenv:
|
|
|
|
|
|
|
|
|
|
;; (setq python-shell-process-environment
|
|
|
|
|
;; (list
|
|
|
|
|
;; (format "PATH=%s" (mapconcat
|
|
|
|
|
;; 'identity
|
|
|
|
|
;; (reverse
|
|
|
|
|
;; (cons (getenv "PATH")
|
|
|
|
|
;; '("/path/to/env/bin/")))
|
|
|
|
|
;; ":"))
|
|
|
|
|
;; "VIRTUAL_ENV=/path/to/env/"))
|
|
|
|
|
;; (python-shell-exec-path . ("/path/to/env/bin/"))
|
|
|
|
|
|
2012-06-17 01:53:31 -07:00
|
|
|
|
;; Since the above is cumbersome and can be programmatically
|
2014-11-14 03:26:08 -03:00
|
|
|
|
;; calculated, the variable `python-shell-virtualenv-root' is
|
2012-05-17 00:03:21 -03:00
|
|
|
|
;; provided. When this variable is set with the path of the
|
|
|
|
|
;; virtualenv to use, `process-environment' and `exec-path' get proper
|
|
|
|
|
;; values in order to run shells inside the specified virtualenv. So
|
|
|
|
|
;; the following will achieve the same as the previous example:
|
|
|
|
|
|
2014-11-14 03:26:08 -03:00
|
|
|
|
;; (setq python-shell-virtualenv-root "/path/to/env/")
|
2012-05-17 00:03:21 -03:00
|
|
|
|
|
2012-05-17 00:03:27 -03:00
|
|
|
|
;; Also the `python-shell-extra-pythonpaths' variable have been
|
|
|
|
|
;; introduced as simple way of adding paths to the PYTHONPATH without
|
|
|
|
|
;; affecting existing values.
|
|
|
|
|
|
2014-07-27 03:39:17 -03:00
|
|
|
|
;; Shell package support: you can enable a package in the current
|
|
|
|
|
;; shell so that relative imports work properly using the
|
|
|
|
|
;; `python-shell-package-enable' command.
|
|
|
|
|
|
2015-07-06 07:57:14 -03:00
|
|
|
|
;; Shell remote support: remote Python shells are started with the
|
|
|
|
|
;; correct environment for files opened remotely through tramp, also
|
|
|
|
|
;; respecting dir-local variables provided `enable-remote-dir-locals'
|
|
|
|
|
;; is non-nil. The logic for this is transparently handled by the
|
|
|
|
|
;; `python-shell-with-environment' macro.
|
|
|
|
|
|
2014-07-26 20:43:51 -03:00
|
|
|
|
;; Shell syntax highlighting: when enabled current input in shell is
|
|
|
|
|
;; highlighted. The variable `python-shell-font-lock-enable' controls
|
|
|
|
|
;; activation of this feature globally when shells are started.
|
|
|
|
|
;; Activation/deactivation can be also controlled on the fly via the
|
|
|
|
|
;; `python-shell-font-lock-toggle' command.
|
|
|
|
|
|
2012-05-17 00:02:52 -03:00
|
|
|
|
;; Pdb tracking: when you execute a block of code that contains some
|
|
|
|
|
;; call to pdb (or ipdb) it will prompt the block of code and will
|
|
|
|
|
;; follow the execution of pdb marking the current line with an arrow.
|
|
|
|
|
|
2012-05-17 00:02:56 -03:00
|
|
|
|
;; Symbol completion: you can complete the symbol at point. It uses
|
2012-05-17 00:02:52 -03:00
|
|
|
|
;; the shell completion in background so you should run
|
|
|
|
|
;; `python-shell-send-buffer' from time to time to get better results.
|
|
|
|
|
|
2014-06-11 22:35:26 -04:00
|
|
|
|
;; Skeletons: skeletons are provided for simple inserting of things like class,
|
|
|
|
|
;; def, for, import, if, try, and while. These skeletons are
|
|
|
|
|
;; integrated with abbrev. If you have `abbrev-mode' activated and
|
2012-05-17 00:03:05 -03:00
|
|
|
|
;; `python-skeleton-autoinsert' is set to t, then whenever you type
|
|
|
|
|
;; the name of any of those defined and hit SPC, they will be
|
2013-01-23 22:24:09 -03:00
|
|
|
|
;; automatically expanded. As an alternative you can use the defined
|
2014-06-11 22:35:26 -04:00
|
|
|
|
;; skeleton commands: `python-skeleton-<foo>'.
|
2012-05-17 00:03:05 -03:00
|
|
|
|
|
2012-05-17 00:03:00 -03:00
|
|
|
|
;; FFAP: You can find the filename for a given module when using ffap
|
|
|
|
|
;; out of the box. This feature needs an inferior python shell
|
|
|
|
|
;; running.
|
|
|
|
|
|
2012-05-17 00:03:14 -03:00
|
|
|
|
;; Code check: Check the current file for errors with `python-check'
|
|
|
|
|
;; using the program defined in `python-check-command'.
|
2012-05-17 00:03:00 -03:00
|
|
|
|
|
2012-05-17 00:02:52 -03:00
|
|
|
|
;; Eldoc: returns documentation for object at point by using the
|
2012-05-17 00:02:56 -03:00
|
|
|
|
;; inferior python subprocess to inspect its documentation. As you
|
2012-05-17 00:02:52 -03:00
|
|
|
|
;; might guessed you should run `python-shell-send-buffer' from time
|
|
|
|
|
;; to time to get better results too.
|
|
|
|
|
|
2013-04-18 23:31:09 -03:00
|
|
|
|
;; Imenu: There are two index building functions to be used as
|
|
|
|
|
;; `imenu-create-index-function': `python-imenu-create-index' (the
|
|
|
|
|
;; default one, builds the alist in form of a tree) and
|
2013-12-26 13:45:19 -03:00
|
|
|
|
;; `python-imenu-create-flat-index'. See also
|
2013-04-18 23:31:09 -03:00
|
|
|
|
;; `python-imenu-format-item-label-function',
|
|
|
|
|
;; `python-imenu-format-parent-item-label-function',
|
|
|
|
|
;; `python-imenu-format-parent-item-jump-label-function' variables for
|
|
|
|
|
;; changing the way labels are formatted in the tree version.
|
2012-05-17 00:03:14 -03:00
|
|
|
|
|
2014-11-29 13:37:13 +01:00
|
|
|
|
;; If you used python-mode.el you may miss auto-indentation when
|
|
|
|
|
;; inserting newlines. To achieve the same behavior you have two
|
|
|
|
|
;; options:
|
2012-05-17 00:03:02 -03:00
|
|
|
|
|
2014-11-29 13:37:13 +01:00
|
|
|
|
;; 1) Enable the minor-mode `electric-indent-mode' (enabled by
|
|
|
|
|
;; default) and use RET. If this mode is disabled use
|
|
|
|
|
;; `newline-and-indent', bound to C-j.
|
2012-05-17 00:03:02 -03:00
|
|
|
|
|
|
|
|
|
;; 2) Add the following hook in your .emacs:
|
|
|
|
|
|
|
|
|
|
;; (add-hook 'python-mode-hook
|
|
|
|
|
;; #'(lambda ()
|
|
|
|
|
;; (define-key python-mode-map "\C-m" 'newline-and-indent)))
|
|
|
|
|
|
|
|
|
|
;; I'd recommend the first one since you'll get the same behavior for
|
|
|
|
|
;; all modes out-of-the-box.
|
|
|
|
|
|
2012-05-17 00:02:52 -03:00
|
|
|
|
;;; Installation:
|
|
|
|
|
|
|
|
|
|
;; Add this to your .emacs:
|
|
|
|
|
|
|
|
|
|
;; (add-to-list 'load-path "/folder/containing/file")
|
|
|
|
|
;; (require 'python)
|
|
|
|
|
|
|
|
|
|
;;; TODO:
|
|
|
|
|
|
|
|
|
|
;;; Code:
|
|
|
|
|
|
|
|
|
|
(require 'ansi-color)
|
2014-07-19 10:13:07 -03:00
|
|
|
|
(require 'cl-lib)
|
2012-05-17 00:03:05 -03:00
|
|
|
|
(require 'comint)
|
2014-07-19 10:13:07 -03:00
|
|
|
|
(require 'json)
|
2015-07-06 07:57:14 -03:00
|
|
|
|
(require 'tramp-sh)
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
2012-11-19 16:30:55 -05:00
|
|
|
|
;; Avoid compiler warnings
|
|
|
|
|
(defvar view-return-to-alist)
|
|
|
|
|
(defvar compilation-error-regexp-alist)
|
|
|
|
|
(defvar outline-heading-end-regexp)
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
|
|
|
|
(autoload 'comint-mode "comint")
|
2014-12-27 20:58:45 -03:00
|
|
|
|
(autoload 'help-function-arglist "help-fns")
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
|
|
|
|
;;;###autoload
|
2017-07-05 15:21:28 -04:00
|
|
|
|
(add-to-list 'auto-mode-alist (cons (purecopy "\\.py[iw]?\\'") 'python-mode))
|
2012-05-17 00:02:52 -03:00
|
|
|
|
;;;###autoload
|
2013-09-10 23:44:35 -07:00
|
|
|
|
(add-to-list 'interpreter-mode-alist (cons (purecopy "python[0-9.]*") 'python-mode))
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
|
|
|
|
(defgroup python nil
|
|
|
|
|
"Python Language's flying circus support for Emacs."
|
|
|
|
|
:group 'languages
|
2012-12-31 16:35:57 -03:00
|
|
|
|
:version "24.3"
|
2012-05-17 00:02:52 -03:00
|
|
|
|
:link '(emacs-commentary-link "python"))
|
|
|
|
|
|
2015-08-11 23:56:25 -03:00
|
|
|
|
|
|
|
|
|
;;; 24.x Compat
|
|
|
|
|
|
|
|
|
|
|
2018-02-27 19:44:35 -05:00
|
|
|
|
(eval-and-compile
|
|
|
|
|
(unless (fboundp 'prog-first-column)
|
|
|
|
|
(defun prog-first-column ()
|
|
|
|
|
0))
|
|
|
|
|
(unless (fboundp 'file-local-name)
|
|
|
|
|
(defun file-local-name (file)
|
|
|
|
|
"Return the local name component of FILE.
|
|
|
|
|
It returns a file name which can be used directly as argument of
|
|
|
|
|
`process-file', `start-file-process', or `shell-command'."
|
|
|
|
|
(or (file-remote-p file 'localname) file))))
|
|
|
|
|
|
|
|
|
|
;; In Emacs 24.3 and earlier, `define-derived-mode' does not define
|
|
|
|
|
;; the hook variable, it only puts documentation on the symbol.
|
|
|
|
|
(defvar inferior-python-mode-hook)
|
2015-08-11 23:56:25 -03:00
|
|
|
|
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
|
|
|
|
;;; Bindings
|
|
|
|
|
|
|
|
|
|
(defvar python-mode-map
|
|
|
|
|
(let ((map (make-sparse-keymap)))
|
2012-05-17 00:03:15 -03:00
|
|
|
|
;; Movement
|
2012-10-11 21:07:25 -03:00
|
|
|
|
(define-key map [remap backward-sentence] 'python-nav-backward-block)
|
|
|
|
|
(define-key map [remap forward-sentence] 'python-nav-forward-block)
|
|
|
|
|
(define-key map [remap backward-up-list] 'python-nav-backward-up-list)
|
2015-07-06 01:03:46 -03:00
|
|
|
|
(define-key map [remap mark-defun] 'python-mark-defun)
|
2012-07-16 14:18:39 -03:00
|
|
|
|
(define-key map "\C-c\C-j" 'imenu)
|
2012-05-17 00:02:52 -03:00
|
|
|
|
;; Indent specific
|
|
|
|
|
(define-key map "\177" 'python-indent-dedent-line-backspace)
|
|
|
|
|
(define-key map (kbd "<backtab>") 'python-indent-dedent-line)
|
|
|
|
|
(define-key map "\C-c<" 'python-indent-shift-left)
|
|
|
|
|
(define-key map "\C-c>" 'python-indent-shift-right)
|
2012-05-17 00:03:05 -03:00
|
|
|
|
;; Skeletons
|
|
|
|
|
(define-key map "\C-c\C-tc" 'python-skeleton-class)
|
|
|
|
|
(define-key map "\C-c\C-td" 'python-skeleton-def)
|
|
|
|
|
(define-key map "\C-c\C-tf" 'python-skeleton-for)
|
|
|
|
|
(define-key map "\C-c\C-ti" 'python-skeleton-if)
|
2014-06-11 22:35:26 -04:00
|
|
|
|
(define-key map "\C-c\C-tm" 'python-skeleton-import)
|
2012-05-17 00:03:05 -03:00
|
|
|
|
(define-key map "\C-c\C-tt" 'python-skeleton-try)
|
|
|
|
|
(define-key map "\C-c\C-tw" 'python-skeleton-while)
|
2012-05-17 00:02:52 -03:00
|
|
|
|
;; Shell interaction
|
2012-07-27 09:38:19 -03:00
|
|
|
|
(define-key map "\C-c\C-p" 'run-python)
|
2012-05-17 00:02:52 -03:00
|
|
|
|
(define-key map "\C-c\C-s" 'python-shell-send-string)
|
2019-11-29 03:10:12 -05:00
|
|
|
|
(define-key map "\C-c\C-e" 'python-shell-send-statement)
|
2012-05-17 00:02:52 -03:00
|
|
|
|
(define-key map "\C-c\C-r" 'python-shell-send-region)
|
|
|
|
|
(define-key map "\C-\M-x" 'python-shell-send-defun)
|
|
|
|
|
(define-key map "\C-c\C-c" 'python-shell-send-buffer)
|
|
|
|
|
(define-key map "\C-c\C-l" 'python-shell-send-file)
|
|
|
|
|
(define-key map "\C-c\C-z" 'python-shell-switch-to-shell)
|
2012-05-17 00:03:00 -03:00
|
|
|
|
;; Some util commands
|
|
|
|
|
(define-key map "\C-c\C-v" 'python-check)
|
2012-05-17 00:03:00 -03:00
|
|
|
|
(define-key map "\C-c\C-f" 'python-eldoc-at-point)
|
2016-05-18 09:56:17 -04:00
|
|
|
|
(define-key map "\C-c\C-d" 'python-describe-at-point)
|
2012-05-17 00:02:52 -03:00
|
|
|
|
;; Utilities
|
|
|
|
|
(substitute-key-definition 'complete-symbol 'completion-at-point
|
2012-05-17 00:03:35 -03:00
|
|
|
|
map global-map)
|
2012-05-17 00:02:52 -03:00
|
|
|
|
(easy-menu-define python-menu map "Python Mode menu"
|
2018-11-05 01:22:15 +01:00
|
|
|
|
'("Python"
|
2012-05-17 00:03:35 -03:00
|
|
|
|
:help "Python-specific Features"
|
|
|
|
|
["Shift region left" python-indent-shift-left :active mark-active
|
|
|
|
|
:help "Shift region left by a single indentation step"]
|
|
|
|
|
["Shift region right" python-indent-shift-right :active mark-active
|
|
|
|
|
:help "Shift region right by a single indentation step"]
|
|
|
|
|
"-"
|
|
|
|
|
["Start of def/class" beginning-of-defun
|
|
|
|
|
:help "Go to start of outermost definition around point"]
|
|
|
|
|
["End of def/class" end-of-defun
|
|
|
|
|
:help "Go to end of definition around point"]
|
|
|
|
|
["Mark def/class" mark-defun
|
|
|
|
|
:help "Mark outermost definition around point"]
|
2012-07-16 14:18:39 -03:00
|
|
|
|
["Jump to def/class" imenu
|
2012-05-17 00:03:35 -03:00
|
|
|
|
:help "Jump to a class or function definition"]
|
2012-05-17 00:03:25 -03:00
|
|
|
|
"--"
|
2012-05-17 00:03:35 -03:00
|
|
|
|
("Skeletons")
|
2012-05-17 00:03:25 -03:00
|
|
|
|
"---"
|
2012-05-17 00:03:35 -03:00
|
|
|
|
["Start interpreter" run-python
|
|
|
|
|
:help "Run inferior Python process in a separate buffer"]
|
|
|
|
|
["Switch to shell" python-shell-switch-to-shell
|
|
|
|
|
:help "Switch to running inferior Python process"]
|
|
|
|
|
["Eval string" python-shell-send-string
|
|
|
|
|
:help "Eval string in inferior Python session"]
|
|
|
|
|
["Eval buffer" python-shell-send-buffer
|
|
|
|
|
:help "Eval buffer in inferior Python session"]
|
2019-11-29 03:10:12 -05:00
|
|
|
|
["Eval statement" python-shell-send-statement
|
|
|
|
|
:help "Eval statement in inferior Python session"]
|
2012-05-17 00:03:35 -03:00
|
|
|
|
["Eval region" python-shell-send-region
|
|
|
|
|
:help "Eval region in inferior Python session"]
|
|
|
|
|
["Eval defun" python-shell-send-defun
|
|
|
|
|
:help "Eval defun in inferior Python session"]
|
|
|
|
|
["Eval file" python-shell-send-file
|
|
|
|
|
:help "Eval file in inferior Python session"]
|
|
|
|
|
["Debugger" pdb :help "Run pdb under GUD"]
|
2012-05-17 00:03:25 -03:00
|
|
|
|
"----"
|
2012-05-17 00:03:35 -03:00
|
|
|
|
["Check file" python-check
|
|
|
|
|
:help "Check file for errors"]
|
|
|
|
|
["Help on symbol" python-eldoc-at-point
|
|
|
|
|
:help "Get help on symbol at point"]
|
|
|
|
|
["Complete symbol" completion-at-point
|
|
|
|
|
:help "Complete symbol before point"]))
|
2012-05-17 00:02:52 -03:00
|
|
|
|
map)
|
|
|
|
|
"Keymap for `python-mode'.")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;;; Python specialized rx
|
|
|
|
|
|
2019-10-27 21:39:58 +01:00
|
|
|
|
(defmacro python-rx (&rest regexps)
|
|
|
|
|
"Python mode specialized rx macro.
|
|
|
|
|
This variant of `rx' supports common Python named REGEXPS."
|
|
|
|
|
`(rx-let ((block-start (seq symbol-start
|
|
|
|
|
(or "def" "class" "if" "elif" "else" "try"
|
|
|
|
|
"except" "finally" "for" "while" "with"
|
|
|
|
|
;; Python 3.5+ PEP492
|
|
|
|
|
(and "async" (+ space)
|
|
|
|
|
(or "def" "for" "with")))
|
|
|
|
|
symbol-end))
|
|
|
|
|
(dedenter (seq symbol-start
|
|
|
|
|
(or "elif" "else" "except" "finally")
|
|
|
|
|
symbol-end))
|
|
|
|
|
(block-ender (seq symbol-start
|
|
|
|
|
(or
|
|
|
|
|
"break" "continue" "pass" "raise" "return")
|
|
|
|
|
symbol-end))
|
|
|
|
|
(decorator (seq line-start (* space) ?@ (any letter ?_)
|
|
|
|
|
(* (any word ?_))))
|
|
|
|
|
(defun (seq symbol-start
|
|
|
|
|
(or "def" "class"
|
|
|
|
|
;; Python 3.5+ PEP492
|
|
|
|
|
(and "async" (+ space) "def"))
|
|
|
|
|
symbol-end))
|
|
|
|
|
(if-name-main (seq line-start "if" (+ space) "__name__"
|
|
|
|
|
(+ space) "==" (+ space)
|
|
|
|
|
(any ?' ?\") "__main__" (any ?' ?\")
|
|
|
|
|
(* space) ?:))
|
|
|
|
|
(symbol-name (seq (any letter ?_) (* (any word ?_))))
|
|
|
|
|
(open-paren (or "{" "[" "("))
|
|
|
|
|
(close-paren (or "}" "]" ")"))
|
|
|
|
|
(simple-operator (any ?+ ?- ?/ ?& ?^ ?~ ?| ?* ?< ?> ?= ?%))
|
|
|
|
|
(not-simple-operator (not simple-operator))
|
|
|
|
|
(operator (or "==" ">=" "is" "not"
|
|
|
|
|
"**" "//" "<<" ">>" "<=" "!="
|
|
|
|
|
"+" "-" "/" "&" "^" "~" "|" "*" "<" ">"
|
|
|
|
|
"=" "%"))
|
|
|
|
|
(assignment-operator (or "+=" "-=" "*=" "/=" "//=" "%=" "**="
|
|
|
|
|
">>=" "<<=" "&=" "^=" "|="
|
|
|
|
|
"="))
|
|
|
|
|
(string-delimiter (seq
|
2012-10-08 18:30:36 -03:00
|
|
|
|
;; Match even number of backslashes.
|
|
|
|
|
(or (not (any ?\\ ?\' ?\")) point
|
2019-10-27 21:39:58 +01:00
|
|
|
|
;; Quotes might be preceded by an
|
|
|
|
|
;; escaped quote.
|
2012-10-08 18:30:36 -03:00
|
|
|
|
(and (or (not (any ?\\)) point) ?\\
|
|
|
|
|
(* ?\\ ?\\) (any ?\' ?\")))
|
|
|
|
|
(* ?\\ ?\\)
|
|
|
|
|
;; Match single or triple quotes of any kind.
|
2019-10-27 21:39:58 +01:00
|
|
|
|
(group (or "\"\"\"" "\"" "'''" "'"))))
|
|
|
|
|
(coding-cookie (seq line-start ?# (* space)
|
|
|
|
|
(or
|
|
|
|
|
;; # coding=<encoding name>
|
|
|
|
|
(: "coding" (or ?: ?=) (* space)
|
|
|
|
|
(group-n 1 (+ (or word ?-))))
|
|
|
|
|
;; # -*- coding: <encoding name> -*-
|
|
|
|
|
(: "-*-" (* space) "coding:" (* space)
|
|
|
|
|
(group-n 1 (+ (or word ?-)))
|
|
|
|
|
(* space) "-*-")
|
|
|
|
|
;; # vim: set fileencoding=<encoding name> :
|
|
|
|
|
(: "vim:" (* space) "set" (+ space)
|
|
|
|
|
"fileencoding" (* space) ?= (* space)
|
|
|
|
|
(group-n 1 (+ (or word ?-)))
|
|
|
|
|
(* space) ":")))))
|
|
|
|
|
(rx ,@regexps)))
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;;; Font-lock and syntax
|
2012-08-07 23:30:08 -03:00
|
|
|
|
|
2015-07-06 02:02:06 -03:00
|
|
|
|
(eval-and-compile
|
2013-04-16 23:52:50 -03:00
|
|
|
|
(defun python-syntax--context-compiler-macro (form type &optional syntax-ppss)
|
|
|
|
|
(pcase type
|
2018-11-05 01:22:15 +01:00
|
|
|
|
(''comment
|
2013-04-16 23:52:50 -03:00
|
|
|
|
`(let ((ppss (or ,syntax-ppss (syntax-ppss))))
|
|
|
|
|
(and (nth 4 ppss) (nth 8 ppss))))
|
2018-11-05 01:22:15 +01:00
|
|
|
|
(''string
|
2013-04-16 23:52:50 -03:00
|
|
|
|
`(let ((ppss (or ,syntax-ppss (syntax-ppss))))
|
|
|
|
|
(and (nth 3 ppss) (nth 8 ppss))))
|
2018-11-05 01:22:15 +01:00
|
|
|
|
(''paren
|
2013-04-16 23:52:50 -03:00
|
|
|
|
`(nth 1 (or ,syntax-ppss (syntax-ppss))))
|
|
|
|
|
(_ form))))
|
|
|
|
|
|
2012-08-07 23:30:08 -03:00
|
|
|
|
(defun python-syntax-context (type &optional syntax-ppss)
|
|
|
|
|
"Return non-nil if point is on TYPE using SYNTAX-PPSS.
|
|
|
|
|
TYPE can be `comment', `string' or `paren'. It returns the start
|
|
|
|
|
character address of the specified TYPE."
|
2013-04-16 23:52:50 -03:00
|
|
|
|
(declare (compiler-macro python-syntax--context-compiler-macro))
|
2012-08-07 23:30:08 -03:00
|
|
|
|
(let ((ppss (or syntax-ppss (syntax-ppss))))
|
2012-11-19 16:30:55 -05:00
|
|
|
|
(pcase type
|
2018-11-05 01:22:15 +01:00
|
|
|
|
('comment (and (nth 4 ppss) (nth 8 ppss)))
|
|
|
|
|
('string (and (nth 3 ppss) (nth 8 ppss)))
|
|
|
|
|
('paren (nth 1 ppss))
|
2012-11-19 16:30:55 -05:00
|
|
|
|
(_ nil))))
|
2012-08-07 23:30:08 -03:00
|
|
|
|
|
|
|
|
|
(defun python-syntax-context-type (&optional syntax-ppss)
|
|
|
|
|
"Return the context type using SYNTAX-PPSS.
|
|
|
|
|
The type returned can be `comment', `string' or `paren'."
|
|
|
|
|
(let ((ppss (or syntax-ppss (syntax-ppss))))
|
|
|
|
|
(cond
|
|
|
|
|
((nth 8 ppss) (if (nth 4 ppss) 'comment 'string))
|
|
|
|
|
((nth 1 ppss) 'paren))))
|
|
|
|
|
|
python.el: New non-global state dependent indentation engine.
Fixes: debbugs:18319
Fixes: debbugs:19595
* lisp/progmodes/python.el (python-syntax-comment-or-string-p): Accept
PPSS as argument.
(python-syntax-closing-paren-p): New function.
(python-indent-current-level)
(python-indent-levels): Mark obsolete.
(python-indent-context): Return more context cases.
(python-indent--calculate-indentation)
(python-indent--calculate-levels): New functions.
(python-indent-calculate-levels): Use them.
(python-indent-calculate-indentation, python-indent-line):
(python-indent-line-function): Rewritten to use new API.
(python-indent-dedent-line): Simplify logic.
(python-indent-dedent-line-backspace): Use `unless`.
(python-indent-toggle-levels): Delete function.
* test/automated/python-tests.el (python-indent-pep8-1)
(python-indent-pep8-2, python-indent-pep8-3)
(python-indent-after-comment-1, python-indent-after-comment-2)
(python-indent-inside-paren-1, python-indent-inside-paren-2)
(python-indent-after-block-1, python-indent-after-block-2)
(python-indent-after-backslash-1, python-indent-after-backslash-2)
(python-indent-after-backslash-3, python-indent-block-enders-1)
(python-indent-block-enders-2, python-indent-block-enders-3)
(python-indent-block-enders-4, python-indent-block-enders-5)
(python-indent-dedenters-1, python-indent-dedenters-2)
(python-indent-dedenters-3, python-indent-dedenters-4)
(python-indent-dedenters-5, python-indent-dedenters-6)
(python-indent-dedenters-7, python-indent-dedenters-8): Fix tests.
(python-indent-base-case, python-indent-after-block-3)
(python-indent-after-backslash-5, python-indent-inside-paren-3)
(python-indent-inside-paren-4, python-indent-inside-paren-5)
(python-indent-inside-paren-6, python-indent-inside-string-1)
(python-indent-inside-string-2, python-indent-inside-string-3)
(python-indent-dedent-line-backspace-1): New Tests.
2015-01-27 00:17:24 -03:00
|
|
|
|
(defsubst python-syntax-comment-or-string-p (&optional ppss)
|
2015-11-17 15:28:50 -08:00
|
|
|
|
"Return non-nil if PPSS is inside comment or string."
|
python.el: New non-global state dependent indentation engine.
Fixes: debbugs:18319
Fixes: debbugs:19595
* lisp/progmodes/python.el (python-syntax-comment-or-string-p): Accept
PPSS as argument.
(python-syntax-closing-paren-p): New function.
(python-indent-current-level)
(python-indent-levels): Mark obsolete.
(python-indent-context): Return more context cases.
(python-indent--calculate-indentation)
(python-indent--calculate-levels): New functions.
(python-indent-calculate-levels): Use them.
(python-indent-calculate-indentation, python-indent-line):
(python-indent-line-function): Rewritten to use new API.
(python-indent-dedent-line): Simplify logic.
(python-indent-dedent-line-backspace): Use `unless`.
(python-indent-toggle-levels): Delete function.
* test/automated/python-tests.el (python-indent-pep8-1)
(python-indent-pep8-2, python-indent-pep8-3)
(python-indent-after-comment-1, python-indent-after-comment-2)
(python-indent-inside-paren-1, python-indent-inside-paren-2)
(python-indent-after-block-1, python-indent-after-block-2)
(python-indent-after-backslash-1, python-indent-after-backslash-2)
(python-indent-after-backslash-3, python-indent-block-enders-1)
(python-indent-block-enders-2, python-indent-block-enders-3)
(python-indent-block-enders-4, python-indent-block-enders-5)
(python-indent-dedenters-1, python-indent-dedenters-2)
(python-indent-dedenters-3, python-indent-dedenters-4)
(python-indent-dedenters-5, python-indent-dedenters-6)
(python-indent-dedenters-7, python-indent-dedenters-8): Fix tests.
(python-indent-base-case, python-indent-after-block-3)
(python-indent-after-backslash-5, python-indent-inside-paren-3)
(python-indent-inside-paren-4, python-indent-inside-paren-5)
(python-indent-inside-paren-6, python-indent-inside-string-1)
(python-indent-inside-string-2, python-indent-inside-string-3)
(python-indent-dedent-line-backspace-1): New Tests.
2015-01-27 00:17:24 -03:00
|
|
|
|
(nth 8 (or ppss (syntax-ppss))))
|
|
|
|
|
|
|
|
|
|
(defsubst python-syntax-closing-paren-p ()
|
|
|
|
|
"Return non-nil if char after point is a closing paren."
|
2015-11-01 02:55:16 +01:00
|
|
|
|
(eql (syntax-class (syntax-after (point)))
|
|
|
|
|
(syntax-class (string-to-syntax ")"))))
|
2012-08-07 23:30:08 -03:00
|
|
|
|
|
|
|
|
|
(define-obsolete-function-alias
|
2012-08-15 09:29:11 -07:00
|
|
|
|
'python-info-ppss-context #'python-syntax-context "24.3")
|
2012-08-07 23:30:08 -03:00
|
|
|
|
|
|
|
|
|
(define-obsolete-function-alias
|
2012-08-15 09:29:11 -07:00
|
|
|
|
'python-info-ppss-context-type #'python-syntax-context-type "24.3")
|
2012-08-07 23:30:08 -03:00
|
|
|
|
|
|
|
|
|
(define-obsolete-function-alias
|
|
|
|
|
'python-info-ppss-comment-or-string-p
|
2012-08-15 09:29:11 -07:00
|
|
|
|
#'python-syntax-comment-or-string-p "24.3")
|
2012-08-07 23:30:08 -03:00
|
|
|
|
|
2014-12-07 11:24:35 -05:00
|
|
|
|
(defun python-font-lock-syntactic-face-function (state)
|
2015-04-05 23:58:13 -03:00
|
|
|
|
"Return syntactic face given STATE."
|
2014-12-07 11:24:35 -05:00
|
|
|
|
(if (nth 3 state)
|
2015-04-05 23:58:13 -03:00
|
|
|
|
(if (python-info-docstring-p state)
|
2014-12-07 11:24:35 -05:00
|
|
|
|
font-lock-doc-face
|
|
|
|
|
font-lock-string-face)
|
|
|
|
|
font-lock-comment-face))
|
|
|
|
|
|
2018-07-19 22:06:07 +02:00
|
|
|
|
(defvar python-font-lock-keywords-level-1
|
|
|
|
|
`((,(rx symbol-start "def" (1+ space) (group (1+ (or word ?_))))
|
|
|
|
|
(1 font-lock-function-name-face))
|
|
|
|
|
(,(rx symbol-start "class" (1+ space) (group (1+ (or word ?_))))
|
|
|
|
|
(1 font-lock-type-face)))
|
|
|
|
|
"Font lock keywords to use in python-mode for level 1 decoration.
|
|
|
|
|
|
|
|
|
|
This is the minimum decoration level, including function and
|
|
|
|
|
class declarations.")
|
|
|
|
|
|
|
|
|
|
(defvar python-font-lock-keywords-level-2
|
|
|
|
|
`(,@python-font-lock-keywords-level-1
|
|
|
|
|
,(rx symbol-start
|
2012-05-17 00:03:35 -03:00
|
|
|
|
(or
|
|
|
|
|
"and" "del" "from" "not" "while" "as" "elif" "global" "or" "with"
|
|
|
|
|
"assert" "else" "if" "pass" "yield" "break" "except" "import" "class"
|
|
|
|
|
"in" "raise" "continue" "finally" "is" "return" "def" "for" "lambda"
|
|
|
|
|
"try"
|
|
|
|
|
;; Python 2:
|
|
|
|
|
"print" "exec"
|
|
|
|
|
;; Python 3:
|
|
|
|
|
;; False, None, and True are listed as keywords on the Python 3
|
|
|
|
|
;; documentation, but since they also qualify as constants they are
|
|
|
|
|
;; fontified like that in order to keep font-lock consistent between
|
|
|
|
|
;; Python versions.
|
2012-05-17 00:03:35 -03:00
|
|
|
|
"nonlocal"
|
2016-04-06 10:38:23 +02:00
|
|
|
|
;; Python 3.5+ PEP492
|
|
|
|
|
(and "async" (+ space) (or "def" "for" "with"))
|
2016-04-21 10:00:39 +02:00
|
|
|
|
"await"
|
2012-05-17 00:03:35 -03:00
|
|
|
|
;; Extra:
|
|
|
|
|
"self")
|
2012-05-17 00:02:52 -03:00
|
|
|
|
symbol-end)
|
2018-07-19 22:06:07 +02:00
|
|
|
|
;; Builtins
|
|
|
|
|
(,(rx symbol-start
|
|
|
|
|
(or
|
|
|
|
|
"abs" "all" "any" "bin" "bool" "callable" "chr" "classmethod"
|
|
|
|
|
"compile" "complex" "delattr" "dict" "dir" "divmod" "enumerate"
|
|
|
|
|
"eval" "filter" "float" "format" "frozenset" "getattr" "globals"
|
|
|
|
|
"hasattr" "hash" "help" "hex" "id" "input" "int" "isinstance"
|
|
|
|
|
"issubclass" "iter" "len" "list" "locals" "map" "max" "memoryview"
|
|
|
|
|
"min" "next" "object" "oct" "open" "ord" "pow" "print" "property"
|
|
|
|
|
"range" "repr" "reversed" "round" "set" "setattr" "slice" "sorted"
|
|
|
|
|
"staticmethod" "str" "sum" "super" "tuple" "type" "vars" "zip"
|
|
|
|
|
"__import__"
|
|
|
|
|
;; Python 2:
|
|
|
|
|
"basestring" "cmp" "execfile" "file" "long" "raw_input" "reduce"
|
|
|
|
|
"reload" "unichr" "unicode" "xrange" "apply" "buffer" "coerce"
|
|
|
|
|
"intern"
|
|
|
|
|
;; Python 3:
|
2019-02-21 13:37:01 -08:00
|
|
|
|
"ascii" "breakpoint" "bytearray" "bytes" "exec"
|
2019-11-22 14:34:59 +01:00
|
|
|
|
;; Special attributes:
|
|
|
|
|
;; https://docs.python.org/3/reference/datamodel.html
|
|
|
|
|
"__annotations__" "__closure__" "__code__"
|
|
|
|
|
"__defaults__" "__dict__" "__doc__" "__globals__"
|
|
|
|
|
"__kwdefaults__" "__name__" "__module__" "__package__"
|
|
|
|
|
"__qualname__"
|
|
|
|
|
;; Extras:
|
|
|
|
|
"__all__")
|
2018-07-19 22:06:07 +02:00
|
|
|
|
symbol-end) . font-lock-builtin-face))
|
|
|
|
|
"Font lock keywords to use in python-mode for level 2 decoration.
|
|
|
|
|
|
|
|
|
|
This is the medium decoration level, including everything in
|
|
|
|
|
`python-font-lock-keywords-level-1', as well as keywords and
|
|
|
|
|
builtins.")
|
|
|
|
|
|
|
|
|
|
(defvar python-font-lock-keywords-maximum-decoration
|
|
|
|
|
`(,@python-font-lock-keywords-level-2
|
2012-05-17 00:02:52 -03:00
|
|
|
|
;; Constants
|
2012-05-17 00:03:19 -03:00
|
|
|
|
(,(rx symbol-start
|
2012-05-17 00:03:35 -03:00
|
|
|
|
(or
|
|
|
|
|
"Ellipsis" "False" "None" "NotImplemented" "True" "__debug__"
|
|
|
|
|
;; copyright, license, credits, quit and exit are added by the site
|
|
|
|
|
;; module and they are not intended to be used in programs
|
|
|
|
|
"copyright" "credits" "exit" "license" "quit")
|
2012-05-17 00:03:19 -03:00
|
|
|
|
symbol-end) . font-lock-constant-face)
|
2012-05-17 00:02:52 -03:00
|
|
|
|
;; Decorators.
|
|
|
|
|
(,(rx line-start (* (any " \t")) (group "@" (1+ (or word ?_))
|
|
|
|
|
(0+ "." (1+ (or word ?_)))))
|
|
|
|
|
(1 font-lock-type-face))
|
|
|
|
|
;; Builtin Exceptions
|
|
|
|
|
(,(rx symbol-start
|
2012-05-17 00:03:35 -03:00
|
|
|
|
(or
|
2016-04-27 10:44:40 +02:00
|
|
|
|
;; Python 2 and 3:
|
2012-05-17 00:03:35 -03:00
|
|
|
|
"ArithmeticError" "AssertionError" "AttributeError" "BaseException"
|
2016-04-27 10:44:40 +02:00
|
|
|
|
"BufferError" "BytesWarning" "DeprecationWarning" "EOFError"
|
|
|
|
|
"EnvironmentError" "Exception" "FloatingPointError" "FutureWarning"
|
|
|
|
|
"GeneratorExit" "IOError" "ImportError" "ImportWarning"
|
|
|
|
|
"IndentationError" "IndexError" "KeyError" "KeyboardInterrupt"
|
|
|
|
|
"LookupError" "MemoryError" "NameError" "NotImplementedError"
|
|
|
|
|
"OSError" "OverflowError" "PendingDeprecationWarning"
|
|
|
|
|
"ReferenceError" "RuntimeError" "RuntimeWarning" "StopIteration"
|
|
|
|
|
"SyntaxError" "SyntaxWarning" "SystemError" "SystemExit" "TabError"
|
|
|
|
|
"TypeError" "UnboundLocalError" "UnicodeDecodeError"
|
|
|
|
|
"UnicodeEncodeError" "UnicodeError" "UnicodeTranslateError"
|
|
|
|
|
"UnicodeWarning" "UserWarning" "ValueError" "Warning"
|
|
|
|
|
"ZeroDivisionError"
|
2012-05-17 00:03:35 -03:00
|
|
|
|
;; Python 2:
|
|
|
|
|
"StandardError"
|
|
|
|
|
;; Python 3:
|
2016-04-27 10:44:40 +02:00
|
|
|
|
"BlockingIOError" "BrokenPipeError" "ChildProcessError"
|
|
|
|
|
"ConnectionAbortedError" "ConnectionError" "ConnectionRefusedError"
|
|
|
|
|
"ConnectionResetError" "FileExistsError" "FileNotFoundError"
|
|
|
|
|
"InterruptedError" "IsADirectoryError" "NotADirectoryError"
|
|
|
|
|
"PermissionError" "ProcessLookupError" "RecursionError"
|
|
|
|
|
"ResourceWarning" "StopAsyncIteration" "TimeoutError"
|
|
|
|
|
;; OS specific
|
|
|
|
|
"VMSError" "WindowsError"
|
|
|
|
|
)
|
2019-06-26 10:24:59 -04:00
|
|
|
|
symbol-end) . font-lock-type-face)
|
2012-06-17 01:53:31 -07:00
|
|
|
|
;; assignments
|
2012-05-17 00:02:52 -03:00
|
|
|
|
;; support for a = b = c = 5
|
|
|
|
|
(,(lambda (limit)
|
2012-05-17 00:03:02 -03:00
|
|
|
|
(let ((re (python-rx (group (+ (any word ?. ?_)))
|
|
|
|
|
(? ?\[ (+ (not (any ?\]))) ?\]) (* space)
|
2013-08-26 22:41:41 -04:00
|
|
|
|
assignment-operator))
|
|
|
|
|
(res nil))
|
|
|
|
|
(while (and (setq res (re-search-forward re limit t))
|
|
|
|
|
(or (python-syntax-context 'paren)
|
2014-10-03 22:35:28 -04:00
|
|
|
|
(equal (char-after (point)) ?=))))
|
2013-08-26 22:41:41 -04:00
|
|
|
|
res))
|
2012-05-17 00:02:52 -03:00
|
|
|
|
(1 font-lock-variable-name-face nil nil))
|
|
|
|
|
;; support for a, b, c = (1, 2, 3)
|
|
|
|
|
(,(lambda (limit)
|
|
|
|
|
(let ((re (python-rx (group (+ (any word ?. ?_))) (* space)
|
|
|
|
|
(* ?, (* space) (+ (any word ?. ?_)) (* space))
|
|
|
|
|
?, (* space) (+ (any word ?. ?_)) (* space)
|
2013-08-26 22:41:41 -04:00
|
|
|
|
assignment-operator))
|
|
|
|
|
(res nil))
|
|
|
|
|
(while (and (setq res (re-search-forward re limit t))
|
|
|
|
|
(goto-char (match-end 1))
|
|
|
|
|
(python-syntax-context 'paren)))
|
|
|
|
|
res))
|
2018-07-19 22:06:07 +02:00
|
|
|
|
(1 font-lock-variable-name-face nil nil)))
|
|
|
|
|
"Font lock keywords to use in python-mode for maximum decoration.
|
|
|
|
|
|
|
|
|
|
This decoration level includes everything in
|
|
|
|
|
`python-font-lock-keywords-level-2', as well as constants,
|
|
|
|
|
decorators, exceptions, and assignments.")
|
|
|
|
|
|
|
|
|
|
(defvar python-font-lock-keywords
|
|
|
|
|
'(python-font-lock-keywords-level-1 ; When `font-lock-maximum-decoration' is nil.
|
|
|
|
|
python-font-lock-keywords-level-1 ; When `font-lock-maximum-decoration' is 1.
|
|
|
|
|
python-font-lock-keywords-level-2 ; When `font-lock-maximum-decoration' is 2.
|
|
|
|
|
python-font-lock-keywords-maximum-decoration ; When `font-lock-maximum-decoration'
|
|
|
|
|
; is more than 1, or t (which it is,
|
|
|
|
|
; by default).
|
|
|
|
|
)
|
|
|
|
|
"List of font lock keyword specifications to use in python-mode.
|
|
|
|
|
|
|
|
|
|
Which one will be chosen depends on the value of
|
|
|
|
|
`font-lock-maximum-decoration'.")
|
|
|
|
|
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
2012-05-17 00:03:46 -03:00
|
|
|
|
(defconst python-syntax-propertize-function
|
|
|
|
|
(syntax-propertize-rules
|
2019-04-09 15:08:21 -04:00
|
|
|
|
((rx (or "\"\"\"" "'''"))
|
2012-09-30 17:14:02 -03:00
|
|
|
|
(0 (ignore (python-syntax-stringify))))))
|
2012-09-24 14:54:46 -03:00
|
|
|
|
|
2018-03-01 21:52:27 -05:00
|
|
|
|
(define-obsolete-variable-alias 'python--prettify-symbols-alist
|
|
|
|
|
'python-prettify-symbols-alist "26.1")
|
|
|
|
|
|
2017-10-05 19:16:46 -04:00
|
|
|
|
(defvar python-prettify-symbols-alist
|
2015-09-21 07:58:41 -07:00
|
|
|
|
'(("lambda" . ?λ)
|
|
|
|
|
("and" . ?∧)
|
2017-10-05 19:16:46 -04:00
|
|
|
|
("or" . ?∨))
|
|
|
|
|
"Value for `prettify-symbols-alist' in `python-mode'.")
|
|
|
|
|
|
2012-09-24 14:54:46 -03:00
|
|
|
|
(defsubst python-syntax-count-quotes (quote-char &optional point limit)
|
|
|
|
|
"Count number of quotes around point (max is 3).
|
|
|
|
|
QUOTE-CHAR is the quote char to count. Optional argument POINT is
|
lisp/progmodes/python.el: Fix docstring typos.
(defconst, python-syntax-count-quotes)
(python-indent-region, python-indent-shift-right)
(python-indent-dedent-line-backspace, python-nav-backward-sexp)
(python-nav-backward-sexp-safe, python-nav-backward-up-list)
(python-shell-prompt-block-regexp, python-shell-prompt-output-regexp)
(python-shell-prompt-pdb-regexp, python-shell-enable-font-lock)
(inferior-python-mode, python-shell-make-comint, run-python-internal)
(python-shell-buffer-substring, python-shell-send-buffer)
(python-pdbtrack-activate, python-pdbtrack-stacktrace-info-regexp)
(python-completion-complete-at-point, python-fill-docstring-style)
(python-eldoc-function, python-imenu-format-item-label)
(python-imenu-format-parent-item-label)
(python-imenu-format-parent-item-jump-label)
(python-imenu--build-tree, python-imenu-create-index)
(python-imenu-create-flat-index): Fix docstring typos.
(python-indent-context, python-shell-prompt-regexp, run-python):
Remove superfluous backslashes.
(python-indent-line, python-nav-beginning-of-defun)
(python-shell-get-buffer, python-shell-get-process)
(python-info-current-defun, python-info-current-line-comment-p)
(python-info-current-line-empty-p, python-util-popn): Doc fixes.
(python-indent-post-self-insert-function, python-shell-send-file)
(python-shell-completion-get-completions)
(python-shell-completion-complete-or-indent)
(python-eldoc--get-doc-at-point): Reflow docstrings.
2014-03-15 18:37:58 +01:00
|
|
|
|
the point where scan starts (defaults to current point), and LIMIT
|
2012-09-24 14:54:46 -03:00
|
|
|
|
is used to limit the scan."
|
|
|
|
|
(let ((i 0))
|
|
|
|
|
(while (and (< i 3)
|
|
|
|
|
(or (not limit) (< (+ point i) limit))
|
|
|
|
|
(eq (char-after (+ point i)) quote-char))
|
2012-12-29 08:04:55 -03:00
|
|
|
|
(setq i (1+ i)))
|
2012-09-24 14:54:46 -03:00
|
|
|
|
i))
|
|
|
|
|
|
|
|
|
|
(defun python-syntax-stringify ()
|
|
|
|
|
"Put `syntax-table' property correctly on single/triple quotes."
|
2019-04-09 15:08:21 -04:00
|
|
|
|
(let* ((ppss (save-excursion (backward-char 3) (syntax-ppss)))
|
|
|
|
|
(string-start (and (eq t (nth 3 ppss)) (nth 8 ppss)))
|
|
|
|
|
(quote-starting-pos (- (point) 3))
|
|
|
|
|
(quote-ending-pos (point)))
|
|
|
|
|
(cond ((or (nth 4 ppss) ;Inside a comment
|
|
|
|
|
(and string-start
|
|
|
|
|
;; Inside of a string quoted with different triple quotes.
|
|
|
|
|
(not (eql (char-after string-start)
|
|
|
|
|
(char-after quote-starting-pos)))))
|
|
|
|
|
;; Do nothing.
|
2012-09-24 14:54:46 -03:00
|
|
|
|
nil)
|
2019-04-09 15:08:21 -04:00
|
|
|
|
((nth 5 ppss)
|
|
|
|
|
;; The first quote is escaped, so it's not part of a triple quote!
|
|
|
|
|
(goto-char (1+ quote-starting-pos)))
|
|
|
|
|
((null string-start)
|
2012-09-24 14:54:46 -03:00
|
|
|
|
;; This set of quotes delimit the start of a string.
|
|
|
|
|
(put-text-property quote-starting-pos (1+ quote-starting-pos)
|
|
|
|
|
'syntax-table (string-to-syntax "|")))
|
2019-04-09 15:08:21 -04:00
|
|
|
|
(t
|
2012-09-24 14:54:46 -03:00
|
|
|
|
;; This set of quotes delimit the end of a string.
|
|
|
|
|
(put-text-property (1- quote-ending-pos) quote-ending-pos
|
|
|
|
|
'syntax-table (string-to-syntax "|"))))))
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
|
|
|
|
(defvar python-mode-syntax-table
|
|
|
|
|
(let ((table (make-syntax-table)))
|
|
|
|
|
;; Give punctuation syntax to ASCII that normally has symbol
|
|
|
|
|
;; syntax or has word syntax and isn't a letter.
|
|
|
|
|
(let ((symbol (string-to-syntax "_"))
|
2012-05-17 00:03:35 -03:00
|
|
|
|
(sst (standard-syntax-table)))
|
2012-05-17 00:02:52 -03:00
|
|
|
|
(dotimes (i 128)
|
2012-05-17 00:03:35 -03:00
|
|
|
|
(unless (= i ?_)
|
|
|
|
|
(if (equal symbol (aref sst i))
|
|
|
|
|
(modify-syntax-entry i "." table)))))
|
2012-05-17 00:02:52 -03:00
|
|
|
|
(modify-syntax-entry ?$ "." table)
|
|
|
|
|
(modify-syntax-entry ?% "." table)
|
|
|
|
|
;; exceptions
|
|
|
|
|
(modify-syntax-entry ?# "<" table)
|
|
|
|
|
(modify-syntax-entry ?\n ">" table)
|
|
|
|
|
(modify-syntax-entry ?' "\"" table)
|
|
|
|
|
(modify-syntax-entry ?` "$" table)
|
|
|
|
|
table)
|
|
|
|
|
"Syntax table for Python files.")
|
|
|
|
|
|
|
|
|
|
(defvar python-dotty-syntax-table
|
|
|
|
|
(let ((table (make-syntax-table python-mode-syntax-table)))
|
|
|
|
|
(modify-syntax-entry ?. "w" table)
|
|
|
|
|
(modify-syntax-entry ?_ "w" table)
|
|
|
|
|
table)
|
|
|
|
|
"Dotty syntax table for Python files.
|
|
|
|
|
It makes underscores and dots word constituent chars.")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;;; Indentation
|
|
|
|
|
|
2017-12-20 16:05:46 -05:00
|
|
|
|
(define-obsolete-variable-alias
|
|
|
|
|
'python-indent 'python-indent-offset "24.3")
|
|
|
|
|
|
2012-05-17 00:02:52 -03:00
|
|
|
|
(defcustom python-indent-offset 4
|
|
|
|
|
"Default indentation offset for Python."
|
|
|
|
|
:group 'python
|
|
|
|
|
:type 'integer
|
|
|
|
|
:safe 'integerp)
|
|
|
|
|
|
2017-12-20 16:05:46 -05:00
|
|
|
|
(define-obsolete-variable-alias
|
|
|
|
|
'python-guess-indent 'python-indent-guess-indent-offset "24.3")
|
|
|
|
|
|
2012-05-17 00:02:52 -03:00
|
|
|
|
(defcustom python-indent-guess-indent-offset t
|
|
|
|
|
"Non-nil tells Python mode to guess `python-indent-offset' value."
|
|
|
|
|
:type 'boolean
|
2012-05-17 00:03:23 -03:00
|
|
|
|
:group 'python
|
|
|
|
|
:safe 'booleanp)
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
2015-03-26 13:44:45 -07:00
|
|
|
|
(defcustom python-indent-guess-indent-offset-verbose t
|
|
|
|
|
"Non-nil means to emit a warning when indentation guessing fails."
|
2016-01-12 20:06:49 -05:00
|
|
|
|
:version "25.1"
|
2015-03-26 13:44:45 -07:00
|
|
|
|
:type 'boolean
|
|
|
|
|
:group 'python
|
|
|
|
|
:safe' booleanp)
|
|
|
|
|
|
2012-12-29 09:57:49 -03:00
|
|
|
|
(defcustom python-indent-trigger-commands
|
|
|
|
|
'(indent-for-tab-command yas-expand yas/expand)
|
|
|
|
|
"Commands that might trigger a `python-indent-line' call."
|
|
|
|
|
:type '(repeat symbol)
|
|
|
|
|
:group 'python)
|
|
|
|
|
|
2017-12-25 12:51:19 -08:00
|
|
|
|
(defcustom python-indent-def-block-scale 2
|
|
|
|
|
"Multiplier applied to indentation inside multi-line def blocks."
|
|
|
|
|
:version "26.1"
|
|
|
|
|
:type 'integer
|
|
|
|
|
:safe 'natnump)
|
|
|
|
|
|
2012-05-17 00:02:52 -03:00
|
|
|
|
(defvar python-indent-current-level 0
|
python.el: New non-global state dependent indentation engine.
Fixes: debbugs:18319
Fixes: debbugs:19595
* lisp/progmodes/python.el (python-syntax-comment-or-string-p): Accept
PPSS as argument.
(python-syntax-closing-paren-p): New function.
(python-indent-current-level)
(python-indent-levels): Mark obsolete.
(python-indent-context): Return more context cases.
(python-indent--calculate-indentation)
(python-indent--calculate-levels): New functions.
(python-indent-calculate-levels): Use them.
(python-indent-calculate-indentation, python-indent-line):
(python-indent-line-function): Rewritten to use new API.
(python-indent-dedent-line): Simplify logic.
(python-indent-dedent-line-backspace): Use `unless`.
(python-indent-toggle-levels): Delete function.
* test/automated/python-tests.el (python-indent-pep8-1)
(python-indent-pep8-2, python-indent-pep8-3)
(python-indent-after-comment-1, python-indent-after-comment-2)
(python-indent-inside-paren-1, python-indent-inside-paren-2)
(python-indent-after-block-1, python-indent-after-block-2)
(python-indent-after-backslash-1, python-indent-after-backslash-2)
(python-indent-after-backslash-3, python-indent-block-enders-1)
(python-indent-block-enders-2, python-indent-block-enders-3)
(python-indent-block-enders-4, python-indent-block-enders-5)
(python-indent-dedenters-1, python-indent-dedenters-2)
(python-indent-dedenters-3, python-indent-dedenters-4)
(python-indent-dedenters-5, python-indent-dedenters-6)
(python-indent-dedenters-7, python-indent-dedenters-8): Fix tests.
(python-indent-base-case, python-indent-after-block-3)
(python-indent-after-backslash-5, python-indent-inside-paren-3)
(python-indent-inside-paren-4, python-indent-inside-paren-5)
(python-indent-inside-paren-6, python-indent-inside-string-1)
(python-indent-inside-string-2, python-indent-inside-string-3)
(python-indent-dedent-line-backspace-1): New Tests.
2015-01-27 00:17:24 -03:00
|
|
|
|
"Deprecated var available for compatibility.")
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
|
|
|
|
(defvar python-indent-levels '(0)
|
python.el: New non-global state dependent indentation engine.
Fixes: debbugs:18319
Fixes: debbugs:19595
* lisp/progmodes/python.el (python-syntax-comment-or-string-p): Accept
PPSS as argument.
(python-syntax-closing-paren-p): New function.
(python-indent-current-level)
(python-indent-levels): Mark obsolete.
(python-indent-context): Return more context cases.
(python-indent--calculate-indentation)
(python-indent--calculate-levels): New functions.
(python-indent-calculate-levels): Use them.
(python-indent-calculate-indentation, python-indent-line):
(python-indent-line-function): Rewritten to use new API.
(python-indent-dedent-line): Simplify logic.
(python-indent-dedent-line-backspace): Use `unless`.
(python-indent-toggle-levels): Delete function.
* test/automated/python-tests.el (python-indent-pep8-1)
(python-indent-pep8-2, python-indent-pep8-3)
(python-indent-after-comment-1, python-indent-after-comment-2)
(python-indent-inside-paren-1, python-indent-inside-paren-2)
(python-indent-after-block-1, python-indent-after-block-2)
(python-indent-after-backslash-1, python-indent-after-backslash-2)
(python-indent-after-backslash-3, python-indent-block-enders-1)
(python-indent-block-enders-2, python-indent-block-enders-3)
(python-indent-block-enders-4, python-indent-block-enders-5)
(python-indent-dedenters-1, python-indent-dedenters-2)
(python-indent-dedenters-3, python-indent-dedenters-4)
(python-indent-dedenters-5, python-indent-dedenters-6)
(python-indent-dedenters-7, python-indent-dedenters-8): Fix tests.
(python-indent-base-case, python-indent-after-block-3)
(python-indent-after-backslash-5, python-indent-inside-paren-3)
(python-indent-inside-paren-4, python-indent-inside-paren-5)
(python-indent-inside-paren-6, python-indent-inside-string-1)
(python-indent-inside-string-2, python-indent-inside-string-3)
(python-indent-dedent-line-backspace-1): New Tests.
2015-01-27 00:17:24 -03:00
|
|
|
|
"Deprecated var available for compatibility.")
|
|
|
|
|
|
|
|
|
|
(make-obsolete-variable
|
|
|
|
|
'python-indent-current-level
|
|
|
|
|
"The indentation API changed to avoid global state.
|
|
|
|
|
The function `python-indent-calculate-levels' does not use it
|
|
|
|
|
anymore. If you were defadvising it and or depended on this
|
|
|
|
|
variable for indentation customizations, refactor your code to
|
|
|
|
|
work on `python-indent-calculate-indentation' instead."
|
|
|
|
|
"24.5")
|
|
|
|
|
|
|
|
|
|
(make-obsolete-variable
|
|
|
|
|
'python-indent-levels
|
|
|
|
|
"The indentation API changed to avoid global state.
|
|
|
|
|
The function `python-indent-calculate-levels' does not use it
|
|
|
|
|
anymore. If you were defadvising it and or depended on this
|
|
|
|
|
variable for indentation customizations, refactor your code to
|
|
|
|
|
work on `python-indent-calculate-indentation' instead."
|
|
|
|
|
"24.5")
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
|
|
|
|
(defun python-indent-guess-indent-offset ()
|
2012-05-17 00:02:53 -03:00
|
|
|
|
"Guess and set `python-indent-offset' for the current buffer."
|
2012-06-14 22:33:57 -03:00
|
|
|
|
(interactive)
|
2012-05-17 00:03:35 -03:00
|
|
|
|
(save-excursion
|
|
|
|
|
(save-restriction
|
2017-12-14 11:18:51 +02:00
|
|
|
|
(widen)
|
2012-05-17 00:03:35 -03:00
|
|
|
|
(goto-char (point-min))
|
|
|
|
|
(let ((block-end))
|
|
|
|
|
(while (and (not block-end)
|
|
|
|
|
(re-search-forward
|
|
|
|
|
(python-rx line-start block-start) nil t))
|
|
|
|
|
(when (and
|
2012-08-07 23:30:08 -03:00
|
|
|
|
(not (python-syntax-context-type))
|
2012-05-17 00:03:35 -03:00
|
|
|
|
(progn
|
|
|
|
|
(goto-char (line-end-position))
|
|
|
|
|
(python-util-forward-comment -1)
|
|
|
|
|
(if (equal (char-before) ?:)
|
|
|
|
|
t
|
|
|
|
|
(forward-line 1)
|
|
|
|
|
(when (python-info-block-continuation-line-p)
|
|
|
|
|
(while (and (python-info-continuation-line-p)
|
|
|
|
|
(not (eobp)))
|
|
|
|
|
(forward-line 1))
|
|
|
|
|
(python-util-forward-comment -1)
|
|
|
|
|
(when (equal (char-before) ?:)
|
|
|
|
|
t)))))
|
|
|
|
|
(setq block-end (point-marker))))
|
|
|
|
|
(let ((indentation
|
|
|
|
|
(when block-end
|
|
|
|
|
(goto-char block-end)
|
|
|
|
|
(python-util-forward-comment)
|
|
|
|
|
(current-indentation))))
|
2013-11-25 22:15:49 -05:00
|
|
|
|
(if (and indentation (not (zerop indentation)))
|
2012-11-26 20:31:06 -03:00
|
|
|
|
(set (make-local-variable 'python-indent-offset) indentation)
|
2015-03-26 13:44:45 -07:00
|
|
|
|
(when python-indent-guess-indent-offset-verbose
|
|
|
|
|
(message "Can't guess python-indent-offset, using defaults: %s"
|
|
|
|
|
python-indent-offset))))))))
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
2012-05-17 00:03:09 -03:00
|
|
|
|
(defun python-indent-context ()
|
python.el: New non-global state dependent indentation engine.
Fixes: debbugs:18319
Fixes: debbugs:19595
* lisp/progmodes/python.el (python-syntax-comment-or-string-p): Accept
PPSS as argument.
(python-syntax-closing-paren-p): New function.
(python-indent-current-level)
(python-indent-levels): Mark obsolete.
(python-indent-context): Return more context cases.
(python-indent--calculate-indentation)
(python-indent--calculate-levels): New functions.
(python-indent-calculate-levels): Use them.
(python-indent-calculate-indentation, python-indent-line):
(python-indent-line-function): Rewritten to use new API.
(python-indent-dedent-line): Simplify logic.
(python-indent-dedent-line-backspace): Use `unless`.
(python-indent-toggle-levels): Delete function.
* test/automated/python-tests.el (python-indent-pep8-1)
(python-indent-pep8-2, python-indent-pep8-3)
(python-indent-after-comment-1, python-indent-after-comment-2)
(python-indent-inside-paren-1, python-indent-inside-paren-2)
(python-indent-after-block-1, python-indent-after-block-2)
(python-indent-after-backslash-1, python-indent-after-backslash-2)
(python-indent-after-backslash-3, python-indent-block-enders-1)
(python-indent-block-enders-2, python-indent-block-enders-3)
(python-indent-block-enders-4, python-indent-block-enders-5)
(python-indent-dedenters-1, python-indent-dedenters-2)
(python-indent-dedenters-3, python-indent-dedenters-4)
(python-indent-dedenters-5, python-indent-dedenters-6)
(python-indent-dedenters-7, python-indent-dedenters-8): Fix tests.
(python-indent-base-case, python-indent-after-block-3)
(python-indent-after-backslash-5, python-indent-inside-paren-3)
(python-indent-inside-paren-4, python-indent-inside-paren-5)
(python-indent-inside-paren-6, python-indent-inside-string-1)
(python-indent-inside-string-2, python-indent-inside-string-3)
(python-indent-dedent-line-backspace-1): New Tests.
2015-01-27 00:17:24 -03:00
|
|
|
|
"Get information about the current indentation context.
|
|
|
|
|
Context is returned in a cons with the form (STATUS . START).
|
|
|
|
|
|
|
|
|
|
STATUS can be one of the following:
|
|
|
|
|
|
|
|
|
|
keyword
|
|
|
|
|
-------
|
|
|
|
|
|
|
|
|
|
:after-comment
|
|
|
|
|
- Point is after a comment line.
|
|
|
|
|
- START is the position of the \"#\" character.
|
|
|
|
|
:inside-string
|
|
|
|
|
- Point is inside string.
|
|
|
|
|
- START is the position of the first quote that starts it.
|
|
|
|
|
:no-indent
|
|
|
|
|
- No possible indentation case matches.
|
|
|
|
|
- START is always zero.
|
|
|
|
|
|
|
|
|
|
:inside-paren
|
|
|
|
|
- Fallback case when point is inside paren.
|
|
|
|
|
- START is the first non space char position *after* the open paren.
|
|
|
|
|
:inside-paren-at-closing-nested-paren
|
|
|
|
|
- Point is on a line that contains a nested paren closer.
|
|
|
|
|
- START is the position of the open paren it closes.
|
|
|
|
|
:inside-paren-at-closing-paren
|
|
|
|
|
- Point is on a line that contains a paren closer.
|
|
|
|
|
- START is the position of the open paren.
|
|
|
|
|
:inside-paren-newline-start
|
|
|
|
|
- Point is inside a paren with items starting in their own line.
|
|
|
|
|
- START is the position of the open paren.
|
|
|
|
|
:inside-paren-newline-start-from-block
|
|
|
|
|
- Point is inside a paren with items starting in their own line
|
|
|
|
|
from a block start.
|
|
|
|
|
- START is the position of the open paren.
|
|
|
|
|
|
|
|
|
|
:after-backslash
|
|
|
|
|
- Fallback case when point is after backslash.
|
|
|
|
|
- START is the char after the position of the backslash.
|
|
|
|
|
:after-backslash-assignment-continuation
|
|
|
|
|
- Point is after a backslashed assignment.
|
|
|
|
|
- START is the char after the position of the backslash.
|
|
|
|
|
:after-backslash-block-continuation
|
|
|
|
|
- Point is after a backslashed block continuation.
|
|
|
|
|
- START is the char after the position of the backslash.
|
|
|
|
|
:after-backslash-dotted-continuation
|
|
|
|
|
- Point is after a backslashed dotted continuation. Previous
|
|
|
|
|
line must contain a dot to align with.
|
|
|
|
|
- START is the char after the position of the backslash.
|
|
|
|
|
:after-backslash-first-line
|
|
|
|
|
- First line following a backslashed continuation.
|
|
|
|
|
- START is the char after the position of the backslash.
|
|
|
|
|
|
|
|
|
|
:after-block-end
|
|
|
|
|
- Point is after a line containing a block ender.
|
|
|
|
|
- START is the position where the ender starts.
|
|
|
|
|
:after-block-start
|
|
|
|
|
- Point is after a line starting a block.
|
|
|
|
|
- START is the position where the block starts.
|
|
|
|
|
:after-line
|
|
|
|
|
- Point is after a simple line.
|
|
|
|
|
- START is the position where the previous line starts.
|
|
|
|
|
:at-dedenter-block-start
|
|
|
|
|
- Point is on a line starting a dedenter block.
|
|
|
|
|
- START is the position where the dedenter block starts."
|
|
|
|
|
(let ((ppss (save-excursion
|
|
|
|
|
(beginning-of-line)
|
|
|
|
|
(syntax-ppss))))
|
|
|
|
|
(cond
|
|
|
|
|
;; Beginning of buffer.
|
|
|
|
|
((= (line-number-at-pos) 1)
|
|
|
|
|
(cons :no-indent 0))
|
|
|
|
|
;; Inside a string.
|
|
|
|
|
((let ((start (python-syntax-context 'string ppss)))
|
|
|
|
|
(when start
|
2015-04-09 01:41:55 -03:00
|
|
|
|
(cons (if (python-info-docstring-p)
|
|
|
|
|
:inside-docstring
|
|
|
|
|
:inside-string) start))))
|
python.el: New non-global state dependent indentation engine.
Fixes: debbugs:18319
Fixes: debbugs:19595
* lisp/progmodes/python.el (python-syntax-comment-or-string-p): Accept
PPSS as argument.
(python-syntax-closing-paren-p): New function.
(python-indent-current-level)
(python-indent-levels): Mark obsolete.
(python-indent-context): Return more context cases.
(python-indent--calculate-indentation)
(python-indent--calculate-levels): New functions.
(python-indent-calculate-levels): Use them.
(python-indent-calculate-indentation, python-indent-line):
(python-indent-line-function): Rewritten to use new API.
(python-indent-dedent-line): Simplify logic.
(python-indent-dedent-line-backspace): Use `unless`.
(python-indent-toggle-levels): Delete function.
* test/automated/python-tests.el (python-indent-pep8-1)
(python-indent-pep8-2, python-indent-pep8-3)
(python-indent-after-comment-1, python-indent-after-comment-2)
(python-indent-inside-paren-1, python-indent-inside-paren-2)
(python-indent-after-block-1, python-indent-after-block-2)
(python-indent-after-backslash-1, python-indent-after-backslash-2)
(python-indent-after-backslash-3, python-indent-block-enders-1)
(python-indent-block-enders-2, python-indent-block-enders-3)
(python-indent-block-enders-4, python-indent-block-enders-5)
(python-indent-dedenters-1, python-indent-dedenters-2)
(python-indent-dedenters-3, python-indent-dedenters-4)
(python-indent-dedenters-5, python-indent-dedenters-6)
(python-indent-dedenters-7, python-indent-dedenters-8): Fix tests.
(python-indent-base-case, python-indent-after-block-3)
(python-indent-after-backslash-5, python-indent-inside-paren-3)
(python-indent-inside-paren-4, python-indent-inside-paren-5)
(python-indent-inside-paren-6, python-indent-inside-string-1)
(python-indent-inside-string-2, python-indent-inside-string-3)
(python-indent-dedent-line-backspace-1): New Tests.
2015-01-27 00:17:24 -03:00
|
|
|
|
;; Inside a paren.
|
|
|
|
|
((let* ((start (python-syntax-context 'paren ppss))
|
|
|
|
|
(starts-in-newline
|
|
|
|
|
(when start
|
|
|
|
|
(save-excursion
|
|
|
|
|
(goto-char start)
|
|
|
|
|
(forward-char)
|
|
|
|
|
(not
|
|
|
|
|
(= (line-number-at-pos)
|
|
|
|
|
(progn
|
|
|
|
|
(python-util-forward-comment)
|
|
|
|
|
(line-number-at-pos))))))))
|
|
|
|
|
(when start
|
|
|
|
|
(cond
|
|
|
|
|
;; Current line only holds the closing paren.
|
|
|
|
|
((save-excursion
|
|
|
|
|
(skip-syntax-forward " ")
|
|
|
|
|
(when (and (python-syntax-closing-paren-p)
|
|
|
|
|
(progn
|
|
|
|
|
(forward-char 1)
|
|
|
|
|
(not (python-syntax-context 'paren))))
|
|
|
|
|
(cons :inside-paren-at-closing-paren start))))
|
|
|
|
|
;; Current line only holds a closing paren for nested.
|
|
|
|
|
((save-excursion
|
|
|
|
|
(back-to-indentation)
|
|
|
|
|
(python-syntax-closing-paren-p))
|
|
|
|
|
(cons :inside-paren-at-closing-nested-paren start))
|
2018-02-16 15:16:15 -05:00
|
|
|
|
;; This line starts from an opening block in its own line.
|
python.el: New non-global state dependent indentation engine.
Fixes: debbugs:18319
Fixes: debbugs:19595
* lisp/progmodes/python.el (python-syntax-comment-or-string-p): Accept
PPSS as argument.
(python-syntax-closing-paren-p): New function.
(python-indent-current-level)
(python-indent-levels): Mark obsolete.
(python-indent-context): Return more context cases.
(python-indent--calculate-indentation)
(python-indent--calculate-levels): New functions.
(python-indent-calculate-levels): Use them.
(python-indent-calculate-indentation, python-indent-line):
(python-indent-line-function): Rewritten to use new API.
(python-indent-dedent-line): Simplify logic.
(python-indent-dedent-line-backspace): Use `unless`.
(python-indent-toggle-levels): Delete function.
* test/automated/python-tests.el (python-indent-pep8-1)
(python-indent-pep8-2, python-indent-pep8-3)
(python-indent-after-comment-1, python-indent-after-comment-2)
(python-indent-inside-paren-1, python-indent-inside-paren-2)
(python-indent-after-block-1, python-indent-after-block-2)
(python-indent-after-backslash-1, python-indent-after-backslash-2)
(python-indent-after-backslash-3, python-indent-block-enders-1)
(python-indent-block-enders-2, python-indent-block-enders-3)
(python-indent-block-enders-4, python-indent-block-enders-5)
(python-indent-dedenters-1, python-indent-dedenters-2)
(python-indent-dedenters-3, python-indent-dedenters-4)
(python-indent-dedenters-5, python-indent-dedenters-6)
(python-indent-dedenters-7, python-indent-dedenters-8): Fix tests.
(python-indent-base-case, python-indent-after-block-3)
(python-indent-after-backslash-5, python-indent-inside-paren-3)
(python-indent-inside-paren-4, python-indent-inside-paren-5)
(python-indent-inside-paren-6, python-indent-inside-string-1)
(python-indent-inside-string-2, python-indent-inside-string-3)
(python-indent-dedent-line-backspace-1): New Tests.
2015-01-27 00:17:24 -03:00
|
|
|
|
((save-excursion
|
|
|
|
|
(goto-char start)
|
|
|
|
|
(when (and
|
|
|
|
|
starts-in-newline
|
|
|
|
|
(save-excursion
|
|
|
|
|
(back-to-indentation)
|
|
|
|
|
(looking-at (python-rx block-start))))
|
|
|
|
|
(cons
|
|
|
|
|
:inside-paren-newline-start-from-block start))))
|
|
|
|
|
(starts-in-newline
|
|
|
|
|
(cons :inside-paren-newline-start start))
|
|
|
|
|
;; General case.
|
|
|
|
|
(t (cons :inside-paren
|
|
|
|
|
(save-excursion
|
|
|
|
|
(goto-char (1+ start))
|
|
|
|
|
(skip-syntax-forward "(" 1)
|
|
|
|
|
(skip-syntax-forward " ")
|
|
|
|
|
(point))))))))
|
|
|
|
|
;; After backslash.
|
|
|
|
|
((let ((start (when (not (python-syntax-comment-or-string-p ppss))
|
|
|
|
|
(python-info-line-ends-backslash-p
|
|
|
|
|
(1- (line-number-at-pos))))))
|
|
|
|
|
(when start
|
|
|
|
|
(cond
|
|
|
|
|
;; Continuation of dotted expression.
|
|
|
|
|
((save-excursion
|
|
|
|
|
(back-to-indentation)
|
|
|
|
|
(when (eq (char-after) ?\.)
|
|
|
|
|
;; Move point back until it's not inside a paren.
|
|
|
|
|
(while (prog2
|
|
|
|
|
(forward-line -1)
|
|
|
|
|
(and (not (bobp))
|
|
|
|
|
(python-syntax-context 'paren))))
|
|
|
|
|
(goto-char (line-end-position))
|
|
|
|
|
(while (and (search-backward
|
|
|
|
|
"." (line-beginning-position) t)
|
|
|
|
|
(python-syntax-context-type)))
|
|
|
|
|
;; Ensure previous statement has dot to align with.
|
|
|
|
|
(when (and (eq (char-after) ?\.)
|
|
|
|
|
(not (python-syntax-context-type)))
|
|
|
|
|
(cons :after-backslash-dotted-continuation (point))))))
|
|
|
|
|
;; Continuation of block definition.
|
|
|
|
|
((let ((block-continuation-start
|
|
|
|
|
(python-info-block-continuation-line-p)))
|
|
|
|
|
(when block-continuation-start
|
|
|
|
|
(save-excursion
|
|
|
|
|
(goto-char block-continuation-start)
|
|
|
|
|
(re-search-forward
|
|
|
|
|
(python-rx block-start (* space))
|
|
|
|
|
(line-end-position) t)
|
|
|
|
|
(cons :after-backslash-block-continuation (point))))))
|
|
|
|
|
;; Continuation of assignment.
|
|
|
|
|
((let ((assignment-continuation-start
|
|
|
|
|
(python-info-assignment-continuation-line-p)))
|
|
|
|
|
(when assignment-continuation-start
|
|
|
|
|
(save-excursion
|
|
|
|
|
(goto-char assignment-continuation-start)
|
|
|
|
|
(cons :after-backslash-assignment-continuation (point))))))
|
|
|
|
|
;; First line after backslash continuation start.
|
|
|
|
|
((save-excursion
|
|
|
|
|
(goto-char start)
|
|
|
|
|
(when (or (= (line-number-at-pos) 1)
|
|
|
|
|
(not (python-info-beginning-of-backslash
|
|
|
|
|
(1- (line-number-at-pos)))))
|
|
|
|
|
(cons :after-backslash-first-line start))))
|
|
|
|
|
;; General case.
|
|
|
|
|
(t (cons :after-backslash start))))))
|
|
|
|
|
;; After beginning of block.
|
|
|
|
|
((let ((start (save-excursion
|
|
|
|
|
(back-to-indentation)
|
|
|
|
|
(python-util-forward-comment -1)
|
|
|
|
|
(when (equal (char-before) ?:)
|
|
|
|
|
(python-nav-beginning-of-block)))))
|
|
|
|
|
(when start
|
|
|
|
|
(cons :after-block-start start))))
|
|
|
|
|
;; At dedenter statement.
|
|
|
|
|
((let ((start (python-info-dedenter-statement-p)))
|
|
|
|
|
(when start
|
|
|
|
|
(cons :at-dedenter-block-start start))))
|
2015-01-30 00:19:55 -03:00
|
|
|
|
;; After normal line, comment or ender (default case).
|
|
|
|
|
((save-excursion
|
|
|
|
|
(back-to-indentation)
|
|
|
|
|
(skip-chars-backward " \t\n")
|
2015-06-19 13:38:24 +00:00
|
|
|
|
(if (bobp)
|
|
|
|
|
(cons :no-indent 0)
|
|
|
|
|
(python-nav-beginning-of-statement)
|
|
|
|
|
(cons
|
|
|
|
|
(cond ((python-info-current-line-comment-p)
|
|
|
|
|
:after-comment)
|
|
|
|
|
((save-excursion
|
|
|
|
|
(goto-char (line-end-position))
|
|
|
|
|
(python-util-forward-comment -1)
|
|
|
|
|
(python-nav-beginning-of-statement)
|
|
|
|
|
(looking-at (python-rx block-ender)))
|
|
|
|
|
:after-block-end)
|
|
|
|
|
(t :after-line))
|
2017-12-14 11:18:51 +02:00
|
|
|
|
(point))))))))
|
python.el: New non-global state dependent indentation engine.
Fixes: debbugs:18319
Fixes: debbugs:19595
* lisp/progmodes/python.el (python-syntax-comment-or-string-p): Accept
PPSS as argument.
(python-syntax-closing-paren-p): New function.
(python-indent-current-level)
(python-indent-levels): Mark obsolete.
(python-indent-context): Return more context cases.
(python-indent--calculate-indentation)
(python-indent--calculate-levels): New functions.
(python-indent-calculate-levels): Use them.
(python-indent-calculate-indentation, python-indent-line):
(python-indent-line-function): Rewritten to use new API.
(python-indent-dedent-line): Simplify logic.
(python-indent-dedent-line-backspace): Use `unless`.
(python-indent-toggle-levels): Delete function.
* test/automated/python-tests.el (python-indent-pep8-1)
(python-indent-pep8-2, python-indent-pep8-3)
(python-indent-after-comment-1, python-indent-after-comment-2)
(python-indent-inside-paren-1, python-indent-inside-paren-2)
(python-indent-after-block-1, python-indent-after-block-2)
(python-indent-after-backslash-1, python-indent-after-backslash-2)
(python-indent-after-backslash-3, python-indent-block-enders-1)
(python-indent-block-enders-2, python-indent-block-enders-3)
(python-indent-block-enders-4, python-indent-block-enders-5)
(python-indent-dedenters-1, python-indent-dedenters-2)
(python-indent-dedenters-3, python-indent-dedenters-4)
(python-indent-dedenters-5, python-indent-dedenters-6)
(python-indent-dedenters-7, python-indent-dedenters-8): Fix tests.
(python-indent-base-case, python-indent-after-block-3)
(python-indent-after-backslash-5, python-indent-inside-paren-3)
(python-indent-inside-paren-4, python-indent-inside-paren-5)
(python-indent-inside-paren-6, python-indent-inside-string-1)
(python-indent-inside-string-2, python-indent-inside-string-3)
(python-indent-dedent-line-backspace-1): New Tests.
2015-01-27 00:17:24 -03:00
|
|
|
|
|
|
|
|
|
(defun python-indent--calculate-indentation ()
|
|
|
|
|
"Internal implementation of `python-indent-calculate-indentation'.
|
|
|
|
|
May return an integer for the maximum possible indentation at
|
|
|
|
|
current context or a list of integers. The latter case is only
|
|
|
|
|
happening for :at-dedenter-block-start context since the
|
2015-01-29 19:45:04 -08:00
|
|
|
|
possibilities can be narrowed to specific indentation points."
|
python.el: New non-global state dependent indentation engine.
Fixes: debbugs:18319
Fixes: debbugs:19595
* lisp/progmodes/python.el (python-syntax-comment-or-string-p): Accept
PPSS as argument.
(python-syntax-closing-paren-p): New function.
(python-indent-current-level)
(python-indent-levels): Mark obsolete.
(python-indent-context): Return more context cases.
(python-indent--calculate-indentation)
(python-indent--calculate-levels): New functions.
(python-indent-calculate-levels): Use them.
(python-indent-calculate-indentation, python-indent-line):
(python-indent-line-function): Rewritten to use new API.
(python-indent-dedent-line): Simplify logic.
(python-indent-dedent-line-backspace): Use `unless`.
(python-indent-toggle-levels): Delete function.
* test/automated/python-tests.el (python-indent-pep8-1)
(python-indent-pep8-2, python-indent-pep8-3)
(python-indent-after-comment-1, python-indent-after-comment-2)
(python-indent-inside-paren-1, python-indent-inside-paren-2)
(python-indent-after-block-1, python-indent-after-block-2)
(python-indent-after-backslash-1, python-indent-after-backslash-2)
(python-indent-after-backslash-3, python-indent-block-enders-1)
(python-indent-block-enders-2, python-indent-block-enders-3)
(python-indent-block-enders-4, python-indent-block-enders-5)
(python-indent-dedenters-1, python-indent-dedenters-2)
(python-indent-dedenters-3, python-indent-dedenters-4)
(python-indent-dedenters-5, python-indent-dedenters-6)
(python-indent-dedenters-7, python-indent-dedenters-8): Fix tests.
(python-indent-base-case, python-indent-after-block-3)
(python-indent-after-backslash-5, python-indent-inside-paren-3)
(python-indent-inside-paren-4, python-indent-inside-paren-5)
(python-indent-inside-paren-6, python-indent-inside-string-1)
(python-indent-inside-string-2, python-indent-inside-string-3)
(python-indent-dedent-line-backspace-1): New Tests.
2015-01-27 00:17:24 -03:00
|
|
|
|
(save-excursion
|
|
|
|
|
(pcase (python-indent-context)
|
2015-06-19 13:38:24 +00:00
|
|
|
|
(`(:no-indent . ,_) (prog-first-column)) ; usually 0
|
python.el: New non-global state dependent indentation engine.
Fixes: debbugs:18319
Fixes: debbugs:19595
* lisp/progmodes/python.el (python-syntax-comment-or-string-p): Accept
PPSS as argument.
(python-syntax-closing-paren-p): New function.
(python-indent-current-level)
(python-indent-levels): Mark obsolete.
(python-indent-context): Return more context cases.
(python-indent--calculate-indentation)
(python-indent--calculate-levels): New functions.
(python-indent-calculate-levels): Use them.
(python-indent-calculate-indentation, python-indent-line):
(python-indent-line-function): Rewritten to use new API.
(python-indent-dedent-line): Simplify logic.
(python-indent-dedent-line-backspace): Use `unless`.
(python-indent-toggle-levels): Delete function.
* test/automated/python-tests.el (python-indent-pep8-1)
(python-indent-pep8-2, python-indent-pep8-3)
(python-indent-after-comment-1, python-indent-after-comment-2)
(python-indent-inside-paren-1, python-indent-inside-paren-2)
(python-indent-after-block-1, python-indent-after-block-2)
(python-indent-after-backslash-1, python-indent-after-backslash-2)
(python-indent-after-backslash-3, python-indent-block-enders-1)
(python-indent-block-enders-2, python-indent-block-enders-3)
(python-indent-block-enders-4, python-indent-block-enders-5)
(python-indent-dedenters-1, python-indent-dedenters-2)
(python-indent-dedenters-3, python-indent-dedenters-4)
(python-indent-dedenters-5, python-indent-dedenters-6)
(python-indent-dedenters-7, python-indent-dedenters-8): Fix tests.
(python-indent-base-case, python-indent-after-block-3)
(python-indent-after-backslash-5, python-indent-inside-paren-3)
(python-indent-inside-paren-4, python-indent-inside-paren-5)
(python-indent-inside-paren-6, python-indent-inside-string-1)
(python-indent-inside-string-2, python-indent-inside-string-3)
(python-indent-dedent-line-backspace-1): New Tests.
2015-01-27 00:17:24 -03:00
|
|
|
|
(`(,(or :after-line
|
|
|
|
|
:after-comment
|
|
|
|
|
:inside-string
|
2015-06-19 18:53:52 +02:00
|
|
|
|
:after-backslash) . ,start)
|
python.el: New non-global state dependent indentation engine.
Fixes: debbugs:18319
Fixes: debbugs:19595
* lisp/progmodes/python.el (python-syntax-comment-or-string-p): Accept
PPSS as argument.
(python-syntax-closing-paren-p): New function.
(python-indent-current-level)
(python-indent-levels): Mark obsolete.
(python-indent-context): Return more context cases.
(python-indent--calculate-indentation)
(python-indent--calculate-levels): New functions.
(python-indent-calculate-levels): Use them.
(python-indent-calculate-indentation, python-indent-line):
(python-indent-line-function): Rewritten to use new API.
(python-indent-dedent-line): Simplify logic.
(python-indent-dedent-line-backspace): Use `unless`.
(python-indent-toggle-levels): Delete function.
* test/automated/python-tests.el (python-indent-pep8-1)
(python-indent-pep8-2, python-indent-pep8-3)
(python-indent-after-comment-1, python-indent-after-comment-2)
(python-indent-inside-paren-1, python-indent-inside-paren-2)
(python-indent-after-block-1, python-indent-after-block-2)
(python-indent-after-backslash-1, python-indent-after-backslash-2)
(python-indent-after-backslash-3, python-indent-block-enders-1)
(python-indent-block-enders-2, python-indent-block-enders-3)
(python-indent-block-enders-4, python-indent-block-enders-5)
(python-indent-dedenters-1, python-indent-dedenters-2)
(python-indent-dedenters-3, python-indent-dedenters-4)
(python-indent-dedenters-5, python-indent-dedenters-6)
(python-indent-dedenters-7, python-indent-dedenters-8): Fix tests.
(python-indent-base-case, python-indent-after-block-3)
(python-indent-after-backslash-5, python-indent-inside-paren-3)
(python-indent-inside-paren-4, python-indent-inside-paren-5)
(python-indent-inside-paren-6, python-indent-inside-string-1)
(python-indent-inside-string-2, python-indent-inside-string-3)
(python-indent-dedent-line-backspace-1): New Tests.
2015-01-27 00:17:24 -03:00
|
|
|
|
;; Copy previous indentation.
|
|
|
|
|
(goto-char start)
|
|
|
|
|
(current-indentation))
|
2015-06-19 18:53:52 +02:00
|
|
|
|
(`(,(or :inside-paren-at-closing-paren
|
|
|
|
|
:inside-paren-at-closing-nested-paren) . ,start)
|
|
|
|
|
(goto-char (+ 1 start))
|
|
|
|
|
(if (looking-at "[ \t]*\\(?:#\\|$\\)")
|
|
|
|
|
;; Copy previous indentation.
|
|
|
|
|
(current-indentation)
|
|
|
|
|
;; Align with opening paren.
|
|
|
|
|
(current-column)))
|
2015-04-09 01:41:55 -03:00
|
|
|
|
(`(:inside-docstring . ,start)
|
|
|
|
|
(let* ((line-indentation (current-indentation))
|
|
|
|
|
(base-indent (progn
|
|
|
|
|
(goto-char start)
|
|
|
|
|
(current-indentation))))
|
|
|
|
|
(max line-indentation base-indent)))
|
python.el: New non-global state dependent indentation engine.
Fixes: debbugs:18319
Fixes: debbugs:19595
* lisp/progmodes/python.el (python-syntax-comment-or-string-p): Accept
PPSS as argument.
(python-syntax-closing-paren-p): New function.
(python-indent-current-level)
(python-indent-levels): Mark obsolete.
(python-indent-context): Return more context cases.
(python-indent--calculate-indentation)
(python-indent--calculate-levels): New functions.
(python-indent-calculate-levels): Use them.
(python-indent-calculate-indentation, python-indent-line):
(python-indent-line-function): Rewritten to use new API.
(python-indent-dedent-line): Simplify logic.
(python-indent-dedent-line-backspace): Use `unless`.
(python-indent-toggle-levels): Delete function.
* test/automated/python-tests.el (python-indent-pep8-1)
(python-indent-pep8-2, python-indent-pep8-3)
(python-indent-after-comment-1, python-indent-after-comment-2)
(python-indent-inside-paren-1, python-indent-inside-paren-2)
(python-indent-after-block-1, python-indent-after-block-2)
(python-indent-after-backslash-1, python-indent-after-backslash-2)
(python-indent-after-backslash-3, python-indent-block-enders-1)
(python-indent-block-enders-2, python-indent-block-enders-3)
(python-indent-block-enders-4, python-indent-block-enders-5)
(python-indent-dedenters-1, python-indent-dedenters-2)
(python-indent-dedenters-3, python-indent-dedenters-4)
(python-indent-dedenters-5, python-indent-dedenters-6)
(python-indent-dedenters-7, python-indent-dedenters-8): Fix tests.
(python-indent-base-case, python-indent-after-block-3)
(python-indent-after-backslash-5, python-indent-inside-paren-3)
(python-indent-inside-paren-4, python-indent-inside-paren-5)
(python-indent-inside-paren-6, python-indent-inside-string-1)
(python-indent-inside-string-2, python-indent-inside-string-3)
(python-indent-dedent-line-backspace-1): New Tests.
2015-01-27 00:17:24 -03:00
|
|
|
|
(`(,(or :after-block-start
|
|
|
|
|
:after-backslash-first-line
|
2016-10-27 15:03:31 -07:00
|
|
|
|
:after-backslash-assignment-continuation
|
python.el: New non-global state dependent indentation engine.
Fixes: debbugs:18319
Fixes: debbugs:19595
* lisp/progmodes/python.el (python-syntax-comment-or-string-p): Accept
PPSS as argument.
(python-syntax-closing-paren-p): New function.
(python-indent-current-level)
(python-indent-levels): Mark obsolete.
(python-indent-context): Return more context cases.
(python-indent--calculate-indentation)
(python-indent--calculate-levels): New functions.
(python-indent-calculate-levels): Use them.
(python-indent-calculate-indentation, python-indent-line):
(python-indent-line-function): Rewritten to use new API.
(python-indent-dedent-line): Simplify logic.
(python-indent-dedent-line-backspace): Use `unless`.
(python-indent-toggle-levels): Delete function.
* test/automated/python-tests.el (python-indent-pep8-1)
(python-indent-pep8-2, python-indent-pep8-3)
(python-indent-after-comment-1, python-indent-after-comment-2)
(python-indent-inside-paren-1, python-indent-inside-paren-2)
(python-indent-after-block-1, python-indent-after-block-2)
(python-indent-after-backslash-1, python-indent-after-backslash-2)
(python-indent-after-backslash-3, python-indent-block-enders-1)
(python-indent-block-enders-2, python-indent-block-enders-3)
(python-indent-block-enders-4, python-indent-block-enders-5)
(python-indent-dedenters-1, python-indent-dedenters-2)
(python-indent-dedenters-3, python-indent-dedenters-4)
(python-indent-dedenters-5, python-indent-dedenters-6)
(python-indent-dedenters-7, python-indent-dedenters-8): Fix tests.
(python-indent-base-case, python-indent-after-block-3)
(python-indent-after-backslash-5, python-indent-inside-paren-3)
(python-indent-inside-paren-4, python-indent-inside-paren-5)
(python-indent-inside-paren-6, python-indent-inside-string-1)
(python-indent-inside-string-2, python-indent-inside-string-3)
(python-indent-dedent-line-backspace-1): New Tests.
2015-01-27 00:17:24 -03:00
|
|
|
|
:inside-paren-newline-start) . ,start)
|
|
|
|
|
;; Add one indentation level.
|
|
|
|
|
(goto-char start)
|
|
|
|
|
(+ (current-indentation) python-indent-offset))
|
|
|
|
|
(`(,(or :inside-paren
|
|
|
|
|
:after-backslash-block-continuation
|
|
|
|
|
:after-backslash-dotted-continuation) . ,start)
|
|
|
|
|
;; Use the column given by the context.
|
|
|
|
|
(goto-char start)
|
|
|
|
|
(current-column))
|
|
|
|
|
(`(:after-block-end . ,start)
|
|
|
|
|
;; Subtract one indentation level.
|
|
|
|
|
(goto-char start)
|
|
|
|
|
(- (current-indentation) python-indent-offset))
|
|
|
|
|
(`(:at-dedenter-block-start . ,_)
|
|
|
|
|
;; List all possible indentation levels from opening blocks.
|
|
|
|
|
(let ((opening-block-start-points
|
|
|
|
|
(python-info-dedenter-opening-block-positions)))
|
|
|
|
|
(if (not opening-block-start-points)
|
2015-06-19 13:38:24 +00:00
|
|
|
|
(prog-first-column) ; if not found default to first column
|
python.el: New non-global state dependent indentation engine.
Fixes: debbugs:18319
Fixes: debbugs:19595
* lisp/progmodes/python.el (python-syntax-comment-or-string-p): Accept
PPSS as argument.
(python-syntax-closing-paren-p): New function.
(python-indent-current-level)
(python-indent-levels): Mark obsolete.
(python-indent-context): Return more context cases.
(python-indent--calculate-indentation)
(python-indent--calculate-levels): New functions.
(python-indent-calculate-levels): Use them.
(python-indent-calculate-indentation, python-indent-line):
(python-indent-line-function): Rewritten to use new API.
(python-indent-dedent-line): Simplify logic.
(python-indent-dedent-line-backspace): Use `unless`.
(python-indent-toggle-levels): Delete function.
* test/automated/python-tests.el (python-indent-pep8-1)
(python-indent-pep8-2, python-indent-pep8-3)
(python-indent-after-comment-1, python-indent-after-comment-2)
(python-indent-inside-paren-1, python-indent-inside-paren-2)
(python-indent-after-block-1, python-indent-after-block-2)
(python-indent-after-backslash-1, python-indent-after-backslash-2)
(python-indent-after-backslash-3, python-indent-block-enders-1)
(python-indent-block-enders-2, python-indent-block-enders-3)
(python-indent-block-enders-4, python-indent-block-enders-5)
(python-indent-dedenters-1, python-indent-dedenters-2)
(python-indent-dedenters-3, python-indent-dedenters-4)
(python-indent-dedenters-5, python-indent-dedenters-6)
(python-indent-dedenters-7, python-indent-dedenters-8): Fix tests.
(python-indent-base-case, python-indent-after-block-3)
(python-indent-after-backslash-5, python-indent-inside-paren-3)
(python-indent-inside-paren-4, python-indent-inside-paren-5)
(python-indent-inside-paren-6, python-indent-inside-string-1)
(python-indent-inside-string-2, python-indent-inside-string-3)
(python-indent-dedent-line-backspace-1): New Tests.
2015-01-27 00:17:24 -03:00
|
|
|
|
(mapcar (lambda (pos)
|
|
|
|
|
(save-excursion
|
|
|
|
|
(goto-char pos)
|
|
|
|
|
(current-indentation)))
|
|
|
|
|
opening-block-start-points))))
|
|
|
|
|
(`(,(or :inside-paren-newline-start-from-block) . ,start)
|
|
|
|
|
(goto-char start)
|
2017-12-25 12:51:19 -08:00
|
|
|
|
(+ (current-indentation)
|
|
|
|
|
(* python-indent-offset python-indent-def-block-scale))))))
|
python.el: New non-global state dependent indentation engine.
Fixes: debbugs:18319
Fixes: debbugs:19595
* lisp/progmodes/python.el (python-syntax-comment-or-string-p): Accept
PPSS as argument.
(python-syntax-closing-paren-p): New function.
(python-indent-current-level)
(python-indent-levels): Mark obsolete.
(python-indent-context): Return more context cases.
(python-indent--calculate-indentation)
(python-indent--calculate-levels): New functions.
(python-indent-calculate-levels): Use them.
(python-indent-calculate-indentation, python-indent-line):
(python-indent-line-function): Rewritten to use new API.
(python-indent-dedent-line): Simplify logic.
(python-indent-dedent-line-backspace): Use `unless`.
(python-indent-toggle-levels): Delete function.
* test/automated/python-tests.el (python-indent-pep8-1)
(python-indent-pep8-2, python-indent-pep8-3)
(python-indent-after-comment-1, python-indent-after-comment-2)
(python-indent-inside-paren-1, python-indent-inside-paren-2)
(python-indent-after-block-1, python-indent-after-block-2)
(python-indent-after-backslash-1, python-indent-after-backslash-2)
(python-indent-after-backslash-3, python-indent-block-enders-1)
(python-indent-block-enders-2, python-indent-block-enders-3)
(python-indent-block-enders-4, python-indent-block-enders-5)
(python-indent-dedenters-1, python-indent-dedenters-2)
(python-indent-dedenters-3, python-indent-dedenters-4)
(python-indent-dedenters-5, python-indent-dedenters-6)
(python-indent-dedenters-7, python-indent-dedenters-8): Fix tests.
(python-indent-base-case, python-indent-after-block-3)
(python-indent-after-backslash-5, python-indent-inside-paren-3)
(python-indent-inside-paren-4, python-indent-inside-paren-5)
(python-indent-inside-paren-6, python-indent-inside-string-1)
(python-indent-inside-string-2, python-indent-inside-string-3)
(python-indent-dedent-line-backspace-1): New Tests.
2015-01-27 00:17:24 -03:00
|
|
|
|
|
|
|
|
|
(defun python-indent--calculate-levels (indentation)
|
|
|
|
|
"Calculate levels list given INDENTATION.
|
|
|
|
|
Argument INDENTATION can either be an integer or a list of
|
|
|
|
|
integers. Levels are returned in ascending order, and in the
|
|
|
|
|
case INDENTATION is a list, this order is enforced."
|
|
|
|
|
(if (listp indentation)
|
|
|
|
|
(sort (copy-sequence indentation) #'<)
|
2015-06-19 13:38:24 +00:00
|
|
|
|
(nconc (number-sequence (prog-first-column) (1- indentation)
|
|
|
|
|
python-indent-offset)
|
|
|
|
|
(list indentation))))
|
python.el: New non-global state dependent indentation engine.
Fixes: debbugs:18319
Fixes: debbugs:19595
* lisp/progmodes/python.el (python-syntax-comment-or-string-p): Accept
PPSS as argument.
(python-syntax-closing-paren-p): New function.
(python-indent-current-level)
(python-indent-levels): Mark obsolete.
(python-indent-context): Return more context cases.
(python-indent--calculate-indentation)
(python-indent--calculate-levels): New functions.
(python-indent-calculate-levels): Use them.
(python-indent-calculate-indentation, python-indent-line):
(python-indent-line-function): Rewritten to use new API.
(python-indent-dedent-line): Simplify logic.
(python-indent-dedent-line-backspace): Use `unless`.
(python-indent-toggle-levels): Delete function.
* test/automated/python-tests.el (python-indent-pep8-1)
(python-indent-pep8-2, python-indent-pep8-3)
(python-indent-after-comment-1, python-indent-after-comment-2)
(python-indent-inside-paren-1, python-indent-inside-paren-2)
(python-indent-after-block-1, python-indent-after-block-2)
(python-indent-after-backslash-1, python-indent-after-backslash-2)
(python-indent-after-backslash-3, python-indent-block-enders-1)
(python-indent-block-enders-2, python-indent-block-enders-3)
(python-indent-block-enders-4, python-indent-block-enders-5)
(python-indent-dedenters-1, python-indent-dedenters-2)
(python-indent-dedenters-3, python-indent-dedenters-4)
(python-indent-dedenters-5, python-indent-dedenters-6)
(python-indent-dedenters-7, python-indent-dedenters-8): Fix tests.
(python-indent-base-case, python-indent-after-block-3)
(python-indent-after-backslash-5, python-indent-inside-paren-3)
(python-indent-inside-paren-4, python-indent-inside-paren-5)
(python-indent-inside-paren-6, python-indent-inside-string-1)
(python-indent-inside-string-2, python-indent-inside-string-3)
(python-indent-dedent-line-backspace-1): New Tests.
2015-01-27 00:17:24 -03:00
|
|
|
|
|
|
|
|
|
(defun python-indent--previous-level (levels indentation)
|
|
|
|
|
"Return previous level from LEVELS relative to INDENTATION."
|
|
|
|
|
(let* ((levels (sort (copy-sequence levels) #'>))
|
|
|
|
|
(default (car levels)))
|
|
|
|
|
(catch 'return
|
|
|
|
|
(dolist (level levels)
|
|
|
|
|
(when (funcall #'< level indentation)
|
|
|
|
|
(throw 'return level)))
|
|
|
|
|
default)))
|
|
|
|
|
|
|
|
|
|
(defun python-indent-calculate-indentation (&optional previous)
|
|
|
|
|
"Calculate indentation.
|
|
|
|
|
Get indentation of PREVIOUS level when argument is non-nil.
|
|
|
|
|
Return the max level of the cycle when indentation reaches the
|
|
|
|
|
minimum."
|
|
|
|
|
(let* ((indentation (python-indent--calculate-indentation))
|
|
|
|
|
(levels (python-indent--calculate-levels indentation)))
|
|
|
|
|
(if previous
|
|
|
|
|
(python-indent--previous-level levels (current-indentation))
|
2015-02-04 16:26:43 -05:00
|
|
|
|
(if levels
|
|
|
|
|
(apply #'max levels)
|
2015-06-19 13:38:24 +00:00
|
|
|
|
(prog-first-column)))))
|
python.el: New non-global state dependent indentation engine.
Fixes: debbugs:18319
Fixes: debbugs:19595
* lisp/progmodes/python.el (python-syntax-comment-or-string-p): Accept
PPSS as argument.
(python-syntax-closing-paren-p): New function.
(python-indent-current-level)
(python-indent-levels): Mark obsolete.
(python-indent-context): Return more context cases.
(python-indent--calculate-indentation)
(python-indent--calculate-levels): New functions.
(python-indent-calculate-levels): Use them.
(python-indent-calculate-indentation, python-indent-line):
(python-indent-line-function): Rewritten to use new API.
(python-indent-dedent-line): Simplify logic.
(python-indent-dedent-line-backspace): Use `unless`.
(python-indent-toggle-levels): Delete function.
* test/automated/python-tests.el (python-indent-pep8-1)
(python-indent-pep8-2, python-indent-pep8-3)
(python-indent-after-comment-1, python-indent-after-comment-2)
(python-indent-inside-paren-1, python-indent-inside-paren-2)
(python-indent-after-block-1, python-indent-after-block-2)
(python-indent-after-backslash-1, python-indent-after-backslash-2)
(python-indent-after-backslash-3, python-indent-block-enders-1)
(python-indent-block-enders-2, python-indent-block-enders-3)
(python-indent-block-enders-4, python-indent-block-enders-5)
(python-indent-dedenters-1, python-indent-dedenters-2)
(python-indent-dedenters-3, python-indent-dedenters-4)
(python-indent-dedenters-5, python-indent-dedenters-6)
(python-indent-dedenters-7, python-indent-dedenters-8): Fix tests.
(python-indent-base-case, python-indent-after-block-3)
(python-indent-after-backslash-5, python-indent-inside-paren-3)
(python-indent-inside-paren-4, python-indent-inside-paren-5)
(python-indent-inside-paren-6, python-indent-inside-string-1)
(python-indent-inside-string-2, python-indent-inside-string-3)
(python-indent-dedent-line-backspace-1): New Tests.
2015-01-27 00:17:24 -03:00
|
|
|
|
|
|
|
|
|
(defun python-indent-line (&optional previous)
|
2012-05-17 00:02:52 -03:00
|
|
|
|
"Internal implementation of `python-indent-line-function'.
|
python.el: New non-global state dependent indentation engine.
Fixes: debbugs:18319
Fixes: debbugs:19595
* lisp/progmodes/python.el (python-syntax-comment-or-string-p): Accept
PPSS as argument.
(python-syntax-closing-paren-p): New function.
(python-indent-current-level)
(python-indent-levels): Mark obsolete.
(python-indent-context): Return more context cases.
(python-indent--calculate-indentation)
(python-indent--calculate-levels): New functions.
(python-indent-calculate-levels): Use them.
(python-indent-calculate-indentation, python-indent-line):
(python-indent-line-function): Rewritten to use new API.
(python-indent-dedent-line): Simplify logic.
(python-indent-dedent-line-backspace): Use `unless`.
(python-indent-toggle-levels): Delete function.
* test/automated/python-tests.el (python-indent-pep8-1)
(python-indent-pep8-2, python-indent-pep8-3)
(python-indent-after-comment-1, python-indent-after-comment-2)
(python-indent-inside-paren-1, python-indent-inside-paren-2)
(python-indent-after-block-1, python-indent-after-block-2)
(python-indent-after-backslash-1, python-indent-after-backslash-2)
(python-indent-after-backslash-3, python-indent-block-enders-1)
(python-indent-block-enders-2, python-indent-block-enders-3)
(python-indent-block-enders-4, python-indent-block-enders-5)
(python-indent-dedenters-1, python-indent-dedenters-2)
(python-indent-dedenters-3, python-indent-dedenters-4)
(python-indent-dedenters-5, python-indent-dedenters-6)
(python-indent-dedenters-7, python-indent-dedenters-8): Fix tests.
(python-indent-base-case, python-indent-after-block-3)
(python-indent-after-backslash-5, python-indent-inside-paren-3)
(python-indent-inside-paren-4, python-indent-inside-paren-5)
(python-indent-inside-paren-6, python-indent-inside-string-1)
(python-indent-inside-string-2, python-indent-inside-string-3)
(python-indent-dedent-line-backspace-1): New Tests.
2015-01-27 00:17:24 -03:00
|
|
|
|
Use the PREVIOUS level when argument is non-nil, otherwise indent
|
2015-01-29 19:45:04 -08:00
|
|
|
|
to the maximum available level. When indentation is the minimum
|
python.el: New non-global state dependent indentation engine.
Fixes: debbugs:18319
Fixes: debbugs:19595
* lisp/progmodes/python.el (python-syntax-comment-or-string-p): Accept
PPSS as argument.
(python-syntax-closing-paren-p): New function.
(python-indent-current-level)
(python-indent-levels): Mark obsolete.
(python-indent-context): Return more context cases.
(python-indent--calculate-indentation)
(python-indent--calculate-levels): New functions.
(python-indent-calculate-levels): Use them.
(python-indent-calculate-indentation, python-indent-line):
(python-indent-line-function): Rewritten to use new API.
(python-indent-dedent-line): Simplify logic.
(python-indent-dedent-line-backspace): Use `unless`.
(python-indent-toggle-levels): Delete function.
* test/automated/python-tests.el (python-indent-pep8-1)
(python-indent-pep8-2, python-indent-pep8-3)
(python-indent-after-comment-1, python-indent-after-comment-2)
(python-indent-inside-paren-1, python-indent-inside-paren-2)
(python-indent-after-block-1, python-indent-after-block-2)
(python-indent-after-backslash-1, python-indent-after-backslash-2)
(python-indent-after-backslash-3, python-indent-block-enders-1)
(python-indent-block-enders-2, python-indent-block-enders-3)
(python-indent-block-enders-4, python-indent-block-enders-5)
(python-indent-dedenters-1, python-indent-dedenters-2)
(python-indent-dedenters-3, python-indent-dedenters-4)
(python-indent-dedenters-5, python-indent-dedenters-6)
(python-indent-dedenters-7, python-indent-dedenters-8): Fix tests.
(python-indent-base-case, python-indent-after-block-3)
(python-indent-after-backslash-5, python-indent-inside-paren-3)
(python-indent-inside-paren-4, python-indent-inside-paren-5)
(python-indent-inside-paren-6, python-indent-inside-string-1)
(python-indent-inside-string-2, python-indent-inside-string-3)
(python-indent-dedent-line-backspace-1): New Tests.
2015-01-27 00:17:24 -03:00
|
|
|
|
possible and PREVIOUS is non-nil, cycle back to the maximum
|
|
|
|
|
level."
|
|
|
|
|
(let ((follow-indentation-p
|
|
|
|
|
;; Check if point is within indentation.
|
|
|
|
|
(and (<= (line-beginning-position) (point))
|
|
|
|
|
(>= (+ (line-beginning-position)
|
|
|
|
|
(current-indentation))
|
|
|
|
|
(point)))))
|
|
|
|
|
(save-excursion
|
|
|
|
|
(indent-line-to
|
|
|
|
|
(python-indent-calculate-indentation previous))
|
|
|
|
|
(python-info-dedenter-opening-block-message))
|
|
|
|
|
(when follow-indentation-p
|
|
|
|
|
(back-to-indentation))))
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
python.el: New non-global state dependent indentation engine.
Fixes: debbugs:18319
Fixes: debbugs:19595
* lisp/progmodes/python.el (python-syntax-comment-or-string-p): Accept
PPSS as argument.
(python-syntax-closing-paren-p): New function.
(python-indent-current-level)
(python-indent-levels): Mark obsolete.
(python-indent-context): Return more context cases.
(python-indent--calculate-indentation)
(python-indent--calculate-levels): New functions.
(python-indent-calculate-levels): Use them.
(python-indent-calculate-indentation, python-indent-line):
(python-indent-line-function): Rewritten to use new API.
(python-indent-dedent-line): Simplify logic.
(python-indent-dedent-line-backspace): Use `unless`.
(python-indent-toggle-levels): Delete function.
* test/automated/python-tests.el (python-indent-pep8-1)
(python-indent-pep8-2, python-indent-pep8-3)
(python-indent-after-comment-1, python-indent-after-comment-2)
(python-indent-inside-paren-1, python-indent-inside-paren-2)
(python-indent-after-block-1, python-indent-after-block-2)
(python-indent-after-backslash-1, python-indent-after-backslash-2)
(python-indent-after-backslash-3, python-indent-block-enders-1)
(python-indent-block-enders-2, python-indent-block-enders-3)
(python-indent-block-enders-4, python-indent-block-enders-5)
(python-indent-dedenters-1, python-indent-dedenters-2)
(python-indent-dedenters-3, python-indent-dedenters-4)
(python-indent-dedenters-5, python-indent-dedenters-6)
(python-indent-dedenters-7, python-indent-dedenters-8): Fix tests.
(python-indent-base-case, python-indent-after-block-3)
(python-indent-after-backslash-5, python-indent-inside-paren-3)
(python-indent-inside-paren-4, python-indent-inside-paren-5)
(python-indent-inside-paren-6, python-indent-inside-string-1)
(python-indent-inside-string-2, python-indent-inside-string-3)
(python-indent-dedent-line-backspace-1): New Tests.
2015-01-27 00:17:24 -03:00
|
|
|
|
(defun python-indent-calculate-levels ()
|
|
|
|
|
"Return possible indentation levels."
|
|
|
|
|
(python-indent--calculate-levels
|
|
|
|
|
(python-indent--calculate-indentation)))
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
|
|
|
|
(defun python-indent-line-function ()
|
|
|
|
|
"`indent-line-function' for Python mode.
|
python.el: New non-global state dependent indentation engine.
Fixes: debbugs:18319
Fixes: debbugs:19595
* lisp/progmodes/python.el (python-syntax-comment-or-string-p): Accept
PPSS as argument.
(python-syntax-closing-paren-p): New function.
(python-indent-current-level)
(python-indent-levels): Mark obsolete.
(python-indent-context): Return more context cases.
(python-indent--calculate-indentation)
(python-indent--calculate-levels): New functions.
(python-indent-calculate-levels): Use them.
(python-indent-calculate-indentation, python-indent-line):
(python-indent-line-function): Rewritten to use new API.
(python-indent-dedent-line): Simplify logic.
(python-indent-dedent-line-backspace): Use `unless`.
(python-indent-toggle-levels): Delete function.
* test/automated/python-tests.el (python-indent-pep8-1)
(python-indent-pep8-2, python-indent-pep8-3)
(python-indent-after-comment-1, python-indent-after-comment-2)
(python-indent-inside-paren-1, python-indent-inside-paren-2)
(python-indent-after-block-1, python-indent-after-block-2)
(python-indent-after-backslash-1, python-indent-after-backslash-2)
(python-indent-after-backslash-3, python-indent-block-enders-1)
(python-indent-block-enders-2, python-indent-block-enders-3)
(python-indent-block-enders-4, python-indent-block-enders-5)
(python-indent-dedenters-1, python-indent-dedenters-2)
(python-indent-dedenters-3, python-indent-dedenters-4)
(python-indent-dedenters-5, python-indent-dedenters-6)
(python-indent-dedenters-7, python-indent-dedenters-8): Fix tests.
(python-indent-base-case, python-indent-after-block-3)
(python-indent-after-backslash-5, python-indent-inside-paren-3)
(python-indent-inside-paren-4, python-indent-inside-paren-5)
(python-indent-inside-paren-6, python-indent-inside-string-1)
(python-indent-inside-string-2, python-indent-inside-string-3)
(python-indent-dedent-line-backspace-1): New Tests.
2015-01-27 00:17:24 -03:00
|
|
|
|
When the variable `last-command' is equal to one of the symbols
|
|
|
|
|
inside `python-indent-trigger-commands' it cycles possible
|
|
|
|
|
indentation levels from right to left."
|
|
|
|
|
(python-indent-line
|
|
|
|
|
(and (memq this-command python-indent-trigger-commands)
|
|
|
|
|
(eq last-command this-command))))
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
|
|
|
|
(defun python-indent-dedent-line ()
|
2012-05-17 00:03:09 -03:00
|
|
|
|
"De-indent current line."
|
2012-05-17 00:02:52 -03:00
|
|
|
|
(interactive "*")
|
python.el: New non-global state dependent indentation engine.
Fixes: debbugs:18319
Fixes: debbugs:19595
* lisp/progmodes/python.el (python-syntax-comment-or-string-p): Accept
PPSS as argument.
(python-syntax-closing-paren-p): New function.
(python-indent-current-level)
(python-indent-levels): Mark obsolete.
(python-indent-context): Return more context cases.
(python-indent--calculate-indentation)
(python-indent--calculate-levels): New functions.
(python-indent-calculate-levels): Use them.
(python-indent-calculate-indentation, python-indent-line):
(python-indent-line-function): Rewritten to use new API.
(python-indent-dedent-line): Simplify logic.
(python-indent-dedent-line-backspace): Use `unless`.
(python-indent-toggle-levels): Delete function.
* test/automated/python-tests.el (python-indent-pep8-1)
(python-indent-pep8-2, python-indent-pep8-3)
(python-indent-after-comment-1, python-indent-after-comment-2)
(python-indent-inside-paren-1, python-indent-inside-paren-2)
(python-indent-after-block-1, python-indent-after-block-2)
(python-indent-after-backslash-1, python-indent-after-backslash-2)
(python-indent-after-backslash-3, python-indent-block-enders-1)
(python-indent-block-enders-2, python-indent-block-enders-3)
(python-indent-block-enders-4, python-indent-block-enders-5)
(python-indent-dedenters-1, python-indent-dedenters-2)
(python-indent-dedenters-3, python-indent-dedenters-4)
(python-indent-dedenters-5, python-indent-dedenters-6)
(python-indent-dedenters-7, python-indent-dedenters-8): Fix tests.
(python-indent-base-case, python-indent-after-block-3)
(python-indent-after-backslash-5, python-indent-inside-paren-3)
(python-indent-inside-paren-4, python-indent-inside-paren-5)
(python-indent-inside-paren-6, python-indent-inside-string-1)
(python-indent-inside-string-2, python-indent-inside-string-3)
(python-indent-dedent-line-backspace-1): New Tests.
2015-01-27 00:17:24 -03:00
|
|
|
|
(when (and (not (bolp))
|
|
|
|
|
(not (python-syntax-comment-or-string-p))
|
2015-01-30 00:41:52 -03:00
|
|
|
|
(= (current-indentation) (current-column)))
|
python.el: New non-global state dependent indentation engine.
Fixes: debbugs:18319
Fixes: debbugs:19595
* lisp/progmodes/python.el (python-syntax-comment-or-string-p): Accept
PPSS as argument.
(python-syntax-closing-paren-p): New function.
(python-indent-current-level)
(python-indent-levels): Mark obsolete.
(python-indent-context): Return more context cases.
(python-indent--calculate-indentation)
(python-indent--calculate-levels): New functions.
(python-indent-calculate-levels): Use them.
(python-indent-calculate-indentation, python-indent-line):
(python-indent-line-function): Rewritten to use new API.
(python-indent-dedent-line): Simplify logic.
(python-indent-dedent-line-backspace): Use `unless`.
(python-indent-toggle-levels): Delete function.
* test/automated/python-tests.el (python-indent-pep8-1)
(python-indent-pep8-2, python-indent-pep8-3)
(python-indent-after-comment-1, python-indent-after-comment-2)
(python-indent-inside-paren-1, python-indent-inside-paren-2)
(python-indent-after-block-1, python-indent-after-block-2)
(python-indent-after-backslash-1, python-indent-after-backslash-2)
(python-indent-after-backslash-3, python-indent-block-enders-1)
(python-indent-block-enders-2, python-indent-block-enders-3)
(python-indent-block-enders-4, python-indent-block-enders-5)
(python-indent-dedenters-1, python-indent-dedenters-2)
(python-indent-dedenters-3, python-indent-dedenters-4)
(python-indent-dedenters-5, python-indent-dedenters-6)
(python-indent-dedenters-7, python-indent-dedenters-8): Fix tests.
(python-indent-base-case, python-indent-after-block-3)
(python-indent-after-backslash-5, python-indent-inside-paren-3)
(python-indent-inside-paren-4, python-indent-inside-paren-5)
(python-indent-inside-paren-6, python-indent-inside-string-1)
(python-indent-inside-string-2, python-indent-inside-string-3)
(python-indent-dedent-line-backspace-1): New Tests.
2015-01-27 00:17:24 -03:00
|
|
|
|
(python-indent-line t)
|
|
|
|
|
t))
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
|
|
|
|
(defun python-indent-dedent-line-backspace (arg)
|
2012-05-17 00:03:09 -03:00
|
|
|
|
"De-indent current line.
|
2012-05-17 00:02:52 -03:00
|
|
|
|
Argument ARG is passed to `backward-delete-char-untabify' when
|
lisp/progmodes/python.el: Fix docstring typos.
(defconst, python-syntax-count-quotes)
(python-indent-region, python-indent-shift-right)
(python-indent-dedent-line-backspace, python-nav-backward-sexp)
(python-nav-backward-sexp-safe, python-nav-backward-up-list)
(python-shell-prompt-block-regexp, python-shell-prompt-output-regexp)
(python-shell-prompt-pdb-regexp, python-shell-enable-font-lock)
(inferior-python-mode, python-shell-make-comint, run-python-internal)
(python-shell-buffer-substring, python-shell-send-buffer)
(python-pdbtrack-activate, python-pdbtrack-stacktrace-info-regexp)
(python-completion-complete-at-point, python-fill-docstring-style)
(python-eldoc-function, python-imenu-format-item-label)
(python-imenu-format-parent-item-label)
(python-imenu-format-parent-item-jump-label)
(python-imenu--build-tree, python-imenu-create-index)
(python-imenu-create-flat-index): Fix docstring typos.
(python-indent-context, python-shell-prompt-regexp, run-python):
Remove superfluous backslashes.
(python-indent-line, python-nav-beginning-of-defun)
(python-shell-get-buffer, python-shell-get-process)
(python-info-current-defun, python-info-current-line-comment-p)
(python-info-current-line-empty-p, python-util-popn): Doc fixes.
(python-indent-post-self-insert-function, python-shell-send-file)
(python-shell-completion-get-completions)
(python-shell-completion-complete-or-indent)
(python-eldoc--get-doc-at-point): Reflow docstrings.
2014-03-15 18:37:58 +01:00
|
|
|
|
point is not in between the indentation."
|
2012-05-17 00:02:52 -03:00
|
|
|
|
(interactive "*p")
|
python.el: New non-global state dependent indentation engine.
Fixes: debbugs:18319
Fixes: debbugs:19595
* lisp/progmodes/python.el (python-syntax-comment-or-string-p): Accept
PPSS as argument.
(python-syntax-closing-paren-p): New function.
(python-indent-current-level)
(python-indent-levels): Mark obsolete.
(python-indent-context): Return more context cases.
(python-indent--calculate-indentation)
(python-indent--calculate-levels): New functions.
(python-indent-calculate-levels): Use them.
(python-indent-calculate-indentation, python-indent-line):
(python-indent-line-function): Rewritten to use new API.
(python-indent-dedent-line): Simplify logic.
(python-indent-dedent-line-backspace): Use `unless`.
(python-indent-toggle-levels): Delete function.
* test/automated/python-tests.el (python-indent-pep8-1)
(python-indent-pep8-2, python-indent-pep8-3)
(python-indent-after-comment-1, python-indent-after-comment-2)
(python-indent-inside-paren-1, python-indent-inside-paren-2)
(python-indent-after-block-1, python-indent-after-block-2)
(python-indent-after-backslash-1, python-indent-after-backslash-2)
(python-indent-after-backslash-3, python-indent-block-enders-1)
(python-indent-block-enders-2, python-indent-block-enders-3)
(python-indent-block-enders-4, python-indent-block-enders-5)
(python-indent-dedenters-1, python-indent-dedenters-2)
(python-indent-dedenters-3, python-indent-dedenters-4)
(python-indent-dedenters-5, python-indent-dedenters-6)
(python-indent-dedenters-7, python-indent-dedenters-8): Fix tests.
(python-indent-base-case, python-indent-after-block-3)
(python-indent-after-backslash-5, python-indent-inside-paren-3)
(python-indent-inside-paren-4, python-indent-inside-paren-5)
(python-indent-inside-paren-6, python-indent-inside-string-1)
(python-indent-inside-string-2, python-indent-inside-string-3)
(python-indent-dedent-line-backspace-1): New Tests.
2015-01-27 00:17:24 -03:00
|
|
|
|
(unless (python-indent-dedent-line)
|
2012-05-17 00:02:52 -03:00
|
|
|
|
(backward-delete-char-untabify arg)))
|
python.el: New non-global state dependent indentation engine.
Fixes: debbugs:18319
Fixes: debbugs:19595
* lisp/progmodes/python.el (python-syntax-comment-or-string-p): Accept
PPSS as argument.
(python-syntax-closing-paren-p): New function.
(python-indent-current-level)
(python-indent-levels): Mark obsolete.
(python-indent-context): Return more context cases.
(python-indent--calculate-indentation)
(python-indent--calculate-levels): New functions.
(python-indent-calculate-levels): Use them.
(python-indent-calculate-indentation, python-indent-line):
(python-indent-line-function): Rewritten to use new API.
(python-indent-dedent-line): Simplify logic.
(python-indent-dedent-line-backspace): Use `unless`.
(python-indent-toggle-levels): Delete function.
* test/automated/python-tests.el (python-indent-pep8-1)
(python-indent-pep8-2, python-indent-pep8-3)
(python-indent-after-comment-1, python-indent-after-comment-2)
(python-indent-inside-paren-1, python-indent-inside-paren-2)
(python-indent-after-block-1, python-indent-after-block-2)
(python-indent-after-backslash-1, python-indent-after-backslash-2)
(python-indent-after-backslash-3, python-indent-block-enders-1)
(python-indent-block-enders-2, python-indent-block-enders-3)
(python-indent-block-enders-4, python-indent-block-enders-5)
(python-indent-dedenters-1, python-indent-dedenters-2)
(python-indent-dedenters-3, python-indent-dedenters-4)
(python-indent-dedenters-5, python-indent-dedenters-6)
(python-indent-dedenters-7, python-indent-dedenters-8): Fix tests.
(python-indent-base-case, python-indent-after-block-3)
(python-indent-after-backslash-5, python-indent-inside-paren-3)
(python-indent-inside-paren-4, python-indent-inside-paren-5)
(python-indent-inside-paren-6, python-indent-inside-string-1)
(python-indent-inside-string-2, python-indent-inside-string-3)
(python-indent-dedent-line-backspace-1): New Tests.
2015-01-27 00:17:24 -03:00
|
|
|
|
|
2012-05-17 00:02:53 -03:00
|
|
|
|
(put 'python-indent-dedent-line-backspace 'delete-selection 'supersede)
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
|
|
|
|
(defun python-indent-region (start end)
|
lisp/progmodes/python.el: Fix docstring typos.
(defconst, python-syntax-count-quotes)
(python-indent-region, python-indent-shift-right)
(python-indent-dedent-line-backspace, python-nav-backward-sexp)
(python-nav-backward-sexp-safe, python-nav-backward-up-list)
(python-shell-prompt-block-regexp, python-shell-prompt-output-regexp)
(python-shell-prompt-pdb-regexp, python-shell-enable-font-lock)
(inferior-python-mode, python-shell-make-comint, run-python-internal)
(python-shell-buffer-substring, python-shell-send-buffer)
(python-pdbtrack-activate, python-pdbtrack-stacktrace-info-regexp)
(python-completion-complete-at-point, python-fill-docstring-style)
(python-eldoc-function, python-imenu-format-item-label)
(python-imenu-format-parent-item-label)
(python-imenu-format-parent-item-jump-label)
(python-imenu--build-tree, python-imenu-create-index)
(python-imenu-create-flat-index): Fix docstring typos.
(python-indent-context, python-shell-prompt-regexp, run-python):
Remove superfluous backslashes.
(python-indent-line, python-nav-beginning-of-defun)
(python-shell-get-buffer, python-shell-get-process)
(python-info-current-defun, python-info-current-line-comment-p)
(python-info-current-line-empty-p, python-util-popn): Doc fixes.
(python-indent-post-self-insert-function, python-shell-send-file)
(python-shell-completion-get-completions)
(python-shell-completion-complete-or-indent)
(python-eldoc--get-doc-at-point): Reflow docstrings.
2014-03-15 18:37:58 +01:00
|
|
|
|
"Indent a Python region automagically.
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
|
|
|
|
Called from a program, START and END specify the region to indent."
|
2012-05-17 00:03:04 -03:00
|
|
|
|
(let ((deactivate-mark nil))
|
|
|
|
|
(save-excursion
|
|
|
|
|
(goto-char end)
|
|
|
|
|
(setq end (point-marker))
|
|
|
|
|
(goto-char start)
|
|
|
|
|
(or (bolp) (forward-line 1))
|
|
|
|
|
(while (< (point) end)
|
|
|
|
|
(or (and (bolp) (eolp))
|
2014-11-15 18:10:58 -03:00
|
|
|
|
(when (and
|
|
|
|
|
;; Skip if previous line is empty or a comment.
|
|
|
|
|
(save-excursion
|
|
|
|
|
(let ((line-is-comment-p
|
|
|
|
|
(python-info-current-line-comment-p)))
|
|
|
|
|
(forward-line -1)
|
|
|
|
|
(not
|
|
|
|
|
(or (and (python-info-current-line-comment-p)
|
|
|
|
|
;; Unless this line is a comment too.
|
|
|
|
|
(not line-is-comment-p))
|
|
|
|
|
(python-info-current-line-empty-p)))))
|
|
|
|
|
;; Don't mess with strings, unless it's the
|
2015-04-09 01:41:55 -03:00
|
|
|
|
;; enclosing set of quotes or a docstring.
|
2014-11-15 18:10:58 -03:00
|
|
|
|
(or (not (python-syntax-context 'string))
|
|
|
|
|
(eq
|
|
|
|
|
(syntax-after
|
|
|
|
|
(+ (1- (point))
|
|
|
|
|
(current-indentation)
|
|
|
|
|
(python-syntax-count-quotes (char-after) (point))))
|
2015-04-09 01:41:55 -03:00
|
|
|
|
(string-to-syntax "|"))
|
|
|
|
|
(python-info-docstring-p))
|
2014-11-15 18:10:58 -03:00
|
|
|
|
;; Skip if current line is a block start, a
|
|
|
|
|
;; dedenter or block ender.
|
|
|
|
|
(save-excursion
|
|
|
|
|
(back-to-indentation)
|
|
|
|
|
(not (looking-at
|
|
|
|
|
(python-rx
|
|
|
|
|
(or block-start dedenter block-ender))))))
|
|
|
|
|
(python-indent-line)))
|
2012-05-17 00:03:04 -03:00
|
|
|
|
(forward-line 1))
|
|
|
|
|
(move-marker end nil))))
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
|
|
|
|
(defun python-indent-shift-left (start end &optional count)
|
|
|
|
|
"Shift lines contained in region START END by COUNT columns to the left.
|
2012-05-17 00:03:09 -03:00
|
|
|
|
COUNT defaults to `python-indent-offset'. If region isn't
|
|
|
|
|
active, the current line is shifted. The shifted region includes
|
|
|
|
|
the lines in which START and END lie. An error is signaled if
|
|
|
|
|
any lines in the region are indented less than COUNT columns."
|
2012-05-17 00:02:52 -03:00
|
|
|
|
(interactive
|
|
|
|
|
(if mark-active
|
|
|
|
|
(list (region-beginning) (region-end) current-prefix-arg)
|
|
|
|
|
(list (line-beginning-position) (line-end-position) current-prefix-arg)))
|
|
|
|
|
(if count
|
|
|
|
|
(setq count (prefix-numeric-value count))
|
|
|
|
|
(setq count python-indent-offset))
|
|
|
|
|
(when (> count 0)
|
2012-05-17 00:03:04 -03:00
|
|
|
|
(let ((deactivate-mark nil))
|
|
|
|
|
(save-excursion
|
|
|
|
|
(goto-char start)
|
|
|
|
|
(while (< (point) end)
|
|
|
|
|
(if (and (< (current-indentation) count)
|
|
|
|
|
(not (looking-at "[ \t]*$")))
|
2014-07-27 04:05:13 -03:00
|
|
|
|
(user-error "Can't shift all lines enough"))
|
2012-05-17 00:03:04 -03:00
|
|
|
|
(forward-line))
|
|
|
|
|
(indent-rigidly start end (- count))))))
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
|
|
|
|
(defun python-indent-shift-right (start end &optional count)
|
lisp/progmodes/python.el: Fix docstring typos.
(defconst, python-syntax-count-quotes)
(python-indent-region, python-indent-shift-right)
(python-indent-dedent-line-backspace, python-nav-backward-sexp)
(python-nav-backward-sexp-safe, python-nav-backward-up-list)
(python-shell-prompt-block-regexp, python-shell-prompt-output-regexp)
(python-shell-prompt-pdb-regexp, python-shell-enable-font-lock)
(inferior-python-mode, python-shell-make-comint, run-python-internal)
(python-shell-buffer-substring, python-shell-send-buffer)
(python-pdbtrack-activate, python-pdbtrack-stacktrace-info-regexp)
(python-completion-complete-at-point, python-fill-docstring-style)
(python-eldoc-function, python-imenu-format-item-label)
(python-imenu-format-parent-item-label)
(python-imenu-format-parent-item-jump-label)
(python-imenu--build-tree, python-imenu-create-index)
(python-imenu-create-flat-index): Fix docstring typos.
(python-indent-context, python-shell-prompt-regexp, run-python):
Remove superfluous backslashes.
(python-indent-line, python-nav-beginning-of-defun)
(python-shell-get-buffer, python-shell-get-process)
(python-info-current-defun, python-info-current-line-comment-p)
(python-info-current-line-empty-p, python-util-popn): Doc fixes.
(python-indent-post-self-insert-function, python-shell-send-file)
(python-shell-completion-get-completions)
(python-shell-completion-complete-or-indent)
(python-eldoc--get-doc-at-point): Reflow docstrings.
2014-03-15 18:37:58 +01:00
|
|
|
|
"Shift lines contained in region START END by COUNT columns to the right.
|
2012-05-17 00:03:09 -03:00
|
|
|
|
COUNT defaults to `python-indent-offset'. If region isn't
|
|
|
|
|
active, the current line is shifted. The shifted region includes
|
|
|
|
|
the lines in which START and END lie."
|
2012-05-17 00:02:52 -03:00
|
|
|
|
(interactive
|
|
|
|
|
(if mark-active
|
|
|
|
|
(list (region-beginning) (region-end) current-prefix-arg)
|
|
|
|
|
(list (line-beginning-position) (line-end-position) current-prefix-arg)))
|
2012-05-17 00:03:04 -03:00
|
|
|
|
(let ((deactivate-mark nil))
|
2013-11-28 21:03:39 -05:00
|
|
|
|
(setq count (if count (prefix-numeric-value count)
|
|
|
|
|
python-indent-offset))
|
2012-05-17 00:03:04 -03:00
|
|
|
|
(indent-rigidly start end count)))
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
2012-05-17 00:03:42 -03:00
|
|
|
|
(defun python-indent-post-self-insert-function ()
|
2013-11-28 21:03:39 -05:00
|
|
|
|
"Adjust indentation after insertion of some characters.
|
lisp/progmodes/python.el: Fix docstring typos.
(defconst, python-syntax-count-quotes)
(python-indent-region, python-indent-shift-right)
(python-indent-dedent-line-backspace, python-nav-backward-sexp)
(python-nav-backward-sexp-safe, python-nav-backward-up-list)
(python-shell-prompt-block-regexp, python-shell-prompt-output-regexp)
(python-shell-prompt-pdb-regexp, python-shell-enable-font-lock)
(inferior-python-mode, python-shell-make-comint, run-python-internal)
(python-shell-buffer-substring, python-shell-send-buffer)
(python-pdbtrack-activate, python-pdbtrack-stacktrace-info-regexp)
(python-completion-complete-at-point, python-fill-docstring-style)
(python-eldoc-function, python-imenu-format-item-label)
(python-imenu-format-parent-item-label)
(python-imenu-format-parent-item-jump-label)
(python-imenu--build-tree, python-imenu-create-index)
(python-imenu-create-flat-index): Fix docstring typos.
(python-indent-context, python-shell-prompt-regexp, run-python):
Remove superfluous backslashes.
(python-indent-line, python-nav-beginning-of-defun)
(python-shell-get-buffer, python-shell-get-process)
(python-info-current-defun, python-info-current-line-comment-p)
(python-info-current-line-empty-p, python-util-popn): Doc fixes.
(python-indent-post-self-insert-function, python-shell-send-file)
(python-shell-completion-get-completions)
(python-shell-completion-complete-or-indent)
(python-eldoc--get-doc-at-point): Reflow docstrings.
2014-03-15 18:37:58 +01:00
|
|
|
|
This function is intended to be added to `post-self-insert-hook.'
|
|
|
|
|
If a line renders a paren alone, after adding a char before it,
|
|
|
|
|
the line will be re-indented automatically if needed."
|
2013-11-28 21:03:39 -05:00
|
|
|
|
(when (and electric-indent-mode
|
2017-11-19 09:00:43 -05:00
|
|
|
|
(eq (char-before) last-command-event)
|
|
|
|
|
(not (python-syntax-context 'string))
|
|
|
|
|
(save-excursion
|
|
|
|
|
(beginning-of-line)
|
|
|
|
|
(not (python-syntax-context 'string (syntax-ppss)))))
|
2013-11-28 21:03:39 -05:00
|
|
|
|
(cond
|
2014-07-01 00:54:11 -03:00
|
|
|
|
;; Electric indent inside parens
|
|
|
|
|
((and
|
|
|
|
|
(not (bolp))
|
|
|
|
|
(let ((paren-start (python-syntax-context 'paren)))
|
|
|
|
|
;; Check that point is inside parens.
|
|
|
|
|
(when paren-start
|
|
|
|
|
(not
|
|
|
|
|
;; Filter the case where input is happening in the same
|
|
|
|
|
;; line where the open paren is.
|
|
|
|
|
(= (line-number-at-pos)
|
|
|
|
|
(line-number-at-pos paren-start)))))
|
|
|
|
|
;; When content has been added before the closing paren or a
|
|
|
|
|
;; comma has been inserted, it's ok to do the trick.
|
|
|
|
|
(or
|
|
|
|
|
(memq (char-after) '(?\) ?\] ?\}))
|
|
|
|
|
(eq (char-before) ?,)))
|
2013-11-28 21:03:39 -05:00
|
|
|
|
(save-excursion
|
|
|
|
|
(goto-char (line-beginning-position))
|
2014-07-01 00:54:11 -03:00
|
|
|
|
(let ((indentation (python-indent-calculate-indentation)))
|
2014-12-12 09:55:42 -05:00
|
|
|
|
(when (and (numberp indentation) (< (current-indentation) indentation))
|
2014-07-01 00:54:11 -03:00
|
|
|
|
(indent-line-to indentation)))))
|
|
|
|
|
;; Electric colon
|
2013-11-28 21:03:39 -05:00
|
|
|
|
((and (eq ?: last-command-event)
|
|
|
|
|
(memq ?: electric-indent-chars)
|
|
|
|
|
(not current-prefix-arg)
|
2014-09-01 19:51:46 -03:00
|
|
|
|
;; Trigger electric colon only at end of line
|
2013-11-28 21:03:39 -05:00
|
|
|
|
(eolp)
|
2014-09-01 19:51:46 -03:00
|
|
|
|
;; Avoid re-indenting on extra colon
|
2013-11-28 21:03:39 -05:00
|
|
|
|
(not (equal ?: (char-before (1- (point)))))
|
2014-12-22 02:24:42 -03:00
|
|
|
|
(not (python-syntax-comment-or-string-p)))
|
|
|
|
|
;; Just re-indent dedenters
|
2018-12-27 16:52:07 +01:00
|
|
|
|
(let ((dedenter-pos (python-info-dedenter-statement-p)))
|
2014-12-22 02:24:42 -03:00
|
|
|
|
(when dedenter-pos
|
2018-12-27 16:52:07 +01:00
|
|
|
|
(let ((start (copy-marker dedenter-pos))
|
|
|
|
|
(end (point-marker)))
|
|
|
|
|
(save-excursion
|
|
|
|
|
(goto-char start)
|
|
|
|
|
(python-indent-line)
|
|
|
|
|
(unless (= (line-number-at-pos start)
|
|
|
|
|
(line-number-at-pos end))
|
|
|
|
|
;; Reindent region if this is a multiline statement
|
|
|
|
|
(python-indent-region start end))))))))))
|
2012-05-17 00:03:42 -03:00
|
|
|
|
|
2015-07-06 01:03:46 -03:00
|
|
|
|
|
|
|
|
|
;;; Mark
|
|
|
|
|
|
|
|
|
|
(defun python-mark-defun (&optional allow-extend)
|
|
|
|
|
"Put mark at end of this defun, point at beginning.
|
|
|
|
|
The defun marked is the one that contains point or follows point.
|
|
|
|
|
|
|
|
|
|
Interactively (or with ALLOW-EXTEND non-nil), if this command is
|
|
|
|
|
repeated or (in Transient Mark mode) if the mark is active, it
|
|
|
|
|
marks the next defun after the ones already marked."
|
|
|
|
|
(interactive "p")
|
|
|
|
|
(when (python-info-looking-at-beginning-of-defun)
|
|
|
|
|
(end-of-line 1))
|
|
|
|
|
(mark-defun allow-extend))
|
|
|
|
|
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
|
|
|
|
;;; Navigation
|
|
|
|
|
|
2012-05-17 00:03:11 -03:00
|
|
|
|
(defvar python-nav-beginning-of-defun-regexp
|
2012-05-17 00:03:13 -03:00
|
|
|
|
(python-rx line-start (* space) defun (+ space) (group symbol-name))
|
2012-05-17 00:03:25 -03:00
|
|
|
|
"Regexp matching class or function definition.
|
2012-05-17 00:03:14 -03:00
|
|
|
|
The name of the defun should be grouped so it can be retrieved
|
|
|
|
|
via `match-string'.")
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
2012-11-12 10:26:50 -03:00
|
|
|
|
(defun python-nav--beginning-of-defun (&optional arg)
|
|
|
|
|
"Internal implementation of `python-nav-beginning-of-defun'.
|
|
|
|
|
With positive ARG search backwards, else search forwards."
|
2012-05-17 00:03:44 -03:00
|
|
|
|
(when (or (null arg) (= arg 0)) (setq arg 1))
|
|
|
|
|
(let* ((re-search-fn (if (> arg 0)
|
|
|
|
|
#'re-search-backward
|
|
|
|
|
#'re-search-forward))
|
|
|
|
|
(line-beg-pos (line-beginning-position))
|
|
|
|
|
(line-content-start (+ line-beg-pos (current-indentation)))
|
|
|
|
|
(pos (point-marker))
|
2012-11-12 10:26:50 -03:00
|
|
|
|
(beg-indentation
|
|
|
|
|
(and (> arg 0)
|
|
|
|
|
(save-excursion
|
2012-11-26 18:45:58 -03:00
|
|
|
|
(while (and
|
|
|
|
|
(not (python-info-looking-at-beginning-of-defun))
|
|
|
|
|
(python-nav-backward-block)))
|
|
|
|
|
(or (and (python-info-looking-at-beginning-of-defun)
|
|
|
|
|
(+ (current-indentation) python-indent-offset))
|
|
|
|
|
0))))
|
2012-05-17 00:03:44 -03:00
|
|
|
|
(found
|
|
|
|
|
(progn
|
|
|
|
|
(when (and (< arg 0)
|
|
|
|
|
(python-info-looking-at-beginning-of-defun))
|
|
|
|
|
(end-of-line 1))
|
|
|
|
|
(while (and (funcall re-search-fn
|
|
|
|
|
python-nav-beginning-of-defun-regexp nil t)
|
2012-11-12 10:26:50 -03:00
|
|
|
|
(or (python-syntax-context-type)
|
|
|
|
|
;; Handle nested defuns when moving
|
|
|
|
|
;; backwards by checking indentation.
|
|
|
|
|
(and (> arg 0)
|
|
|
|
|
(not (= (current-indentation) 0))
|
|
|
|
|
(>= (current-indentation) beg-indentation)))))
|
2012-05-17 00:03:44 -03:00
|
|
|
|
(and (python-info-looking-at-beginning-of-defun)
|
|
|
|
|
(or (not (= (line-number-at-pos pos)
|
|
|
|
|
(line-number-at-pos)))
|
|
|
|
|
(and (>= (point) line-beg-pos)
|
|
|
|
|
(<= (point) line-content-start)
|
|
|
|
|
(> pos line-content-start)))))))
|
|
|
|
|
(if found
|
|
|
|
|
(or (beginning-of-line 1) t)
|
|
|
|
|
(and (goto-char pos) nil))))
|
|
|
|
|
|
2012-11-12 10:26:50 -03:00
|
|
|
|
(defun python-nav-beginning-of-defun (&optional arg)
|
|
|
|
|
"Move point to `beginning-of-defun'.
|
lisp/progmodes/python.el: Fix docstring typos.
(defconst, python-syntax-count-quotes)
(python-indent-region, python-indent-shift-right)
(python-indent-dedent-line-backspace, python-nav-backward-sexp)
(python-nav-backward-sexp-safe, python-nav-backward-up-list)
(python-shell-prompt-block-regexp, python-shell-prompt-output-regexp)
(python-shell-prompt-pdb-regexp, python-shell-enable-font-lock)
(inferior-python-mode, python-shell-make-comint, run-python-internal)
(python-shell-buffer-substring, python-shell-send-buffer)
(python-pdbtrack-activate, python-pdbtrack-stacktrace-info-regexp)
(python-completion-complete-at-point, python-fill-docstring-style)
(python-eldoc-function, python-imenu-format-item-label)
(python-imenu-format-parent-item-label)
(python-imenu-format-parent-item-jump-label)
(python-imenu--build-tree, python-imenu-create-index)
(python-imenu-create-flat-index): Fix docstring typos.
(python-indent-context, python-shell-prompt-regexp, run-python):
Remove superfluous backslashes.
(python-indent-line, python-nav-beginning-of-defun)
(python-shell-get-buffer, python-shell-get-process)
(python-info-current-defun, python-info-current-line-comment-p)
(python-info-current-line-empty-p, python-util-popn): Doc fixes.
(python-indent-post-self-insert-function, python-shell-send-file)
(python-shell-completion-get-completions)
(python-shell-completion-complete-or-indent)
(python-eldoc--get-doc-at-point): Reflow docstrings.
2014-03-15 18:37:58 +01:00
|
|
|
|
With positive ARG search backwards else search forward.
|
|
|
|
|
ARG nil or 0 defaults to 1. When searching backwards,
|
|
|
|
|
nested defuns are handled with care depending on current
|
|
|
|
|
point position. Return non-nil if point is moved to
|
2012-11-12 10:26:50 -03:00
|
|
|
|
`beginning-of-defun'."
|
2012-05-17 00:03:11 -03:00
|
|
|
|
(when (or (null arg) (= arg 0)) (setq arg 1))
|
2012-05-17 00:03:44 -03:00
|
|
|
|
(let ((found))
|
2013-12-26 13:45:19 -03:00
|
|
|
|
(while (and (not (= arg 0))
|
|
|
|
|
(let ((keep-searching-p
|
|
|
|
|
(python-nav--beginning-of-defun arg)))
|
|
|
|
|
(when (and keep-searching-p (null found))
|
|
|
|
|
(setq found t))
|
|
|
|
|
keep-searching-p))
|
|
|
|
|
(setq arg (if (> arg 0) (1- arg) (1+ arg))))
|
2012-05-17 00:03:44 -03:00
|
|
|
|
found))
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
2012-11-12 10:26:50 -03:00
|
|
|
|
(defun python-nav-end-of-defun ()
|
2012-05-17 00:02:52 -03:00
|
|
|
|
"Move point to the end of def or class.
|
|
|
|
|
Returns nil if point is not in a def or class."
|
2012-05-17 00:03:11 -03:00
|
|
|
|
(interactive)
|
2012-11-12 10:26:50 -03:00
|
|
|
|
(let ((beg-defun-indent)
|
|
|
|
|
(beg-pos (point)))
|
2012-05-17 00:03:44 -03:00
|
|
|
|
(when (or (python-info-looking-at-beginning-of-defun)
|
2012-11-12 10:26:50 -03:00
|
|
|
|
(python-nav-beginning-of-defun 1)
|
|
|
|
|
(python-nav-beginning-of-defun -1))
|
2012-05-17 00:03:44 -03:00
|
|
|
|
(setq beg-defun-indent (current-indentation))
|
2012-11-12 10:26:50 -03:00
|
|
|
|
(while (progn
|
|
|
|
|
(python-nav-end-of-statement)
|
|
|
|
|
(python-util-forward-comment 1)
|
|
|
|
|
(and (> (current-indentation) beg-defun-indent)
|
|
|
|
|
(not (eobp)))))
|
|
|
|
|
(python-util-forward-comment -1)
|
2012-05-17 00:03:44 -03:00
|
|
|
|
(forward-line 1)
|
2012-11-12 10:26:50 -03:00
|
|
|
|
;; Ensure point moves forward.
|
|
|
|
|
(and (> beg-pos (point)) (goto-char beg-pos)))))
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
2013-04-17 19:23:13 -03:00
|
|
|
|
(defun python-nav--syntactically (fn poscompfn &optional contextfn)
|
|
|
|
|
"Move point using FN avoiding places with specific context.
|
2013-04-18 23:31:09 -03:00
|
|
|
|
FN must take no arguments. POSCOMPFN is a two arguments function
|
2013-04-17 19:23:13 -03:00
|
|
|
|
used to compare current and previous point after it is moved
|
|
|
|
|
using FN, this is normally a less-than or greater-than
|
|
|
|
|
comparison. Optional argument CONTEXTFN defaults to
|
|
|
|
|
`python-syntax-context-type' and is used for checking current
|
|
|
|
|
point context, it must return a non-nil value if this point must
|
|
|
|
|
be skipped."
|
|
|
|
|
(let ((contextfn (or contextfn 'python-syntax-context-type))
|
|
|
|
|
(start-pos (point-marker))
|
|
|
|
|
(prev-pos))
|
|
|
|
|
(catch 'found
|
|
|
|
|
(while t
|
|
|
|
|
(let* ((newpos
|
|
|
|
|
(and (funcall fn) (point-marker)))
|
|
|
|
|
(context (funcall contextfn)))
|
|
|
|
|
(cond ((and (not context) newpos
|
|
|
|
|
(or (and (not prev-pos) newpos)
|
|
|
|
|
(and prev-pos newpos
|
|
|
|
|
(funcall poscompfn newpos prev-pos))))
|
|
|
|
|
(throw 'found (point-marker)))
|
|
|
|
|
((and newpos context)
|
|
|
|
|
(setq prev-pos (point)))
|
|
|
|
|
(t (when (not newpos) (goto-char start-pos))
|
|
|
|
|
(throw 'found nil))))))))
|
2013-04-17 02:08:20 -03:00
|
|
|
|
|
|
|
|
|
(defun python-nav--forward-defun (arg)
|
|
|
|
|
"Internal implementation of python-nav-{backward,forward}-defun.
|
|
|
|
|
Uses ARG to define which function to call, and how many times
|
|
|
|
|
repeat it."
|
|
|
|
|
(let ((found))
|
|
|
|
|
(while (and (> arg 0)
|
|
|
|
|
(setq found
|
|
|
|
|
(python-nav--syntactically
|
|
|
|
|
(lambda ()
|
|
|
|
|
(re-search-forward
|
|
|
|
|
python-nav-beginning-of-defun-regexp nil t))
|
|
|
|
|
'>)))
|
|
|
|
|
(setq arg (1- arg)))
|
|
|
|
|
(while (and (< arg 0)
|
|
|
|
|
(setq found
|
|
|
|
|
(python-nav--syntactically
|
|
|
|
|
(lambda ()
|
|
|
|
|
(re-search-backward
|
|
|
|
|
python-nav-beginning-of-defun-regexp nil t))
|
|
|
|
|
'<)))
|
|
|
|
|
(setq arg (1+ arg)))
|
|
|
|
|
found))
|
|
|
|
|
|
|
|
|
|
(defun python-nav-backward-defun (&optional arg)
|
|
|
|
|
"Navigate to closer defun backward ARG times.
|
|
|
|
|
Unlikely `python-nav-beginning-of-defun' this doesn't care about
|
|
|
|
|
nested definitions."
|
|
|
|
|
(interactive "^p")
|
|
|
|
|
(python-nav--forward-defun (- (or arg 1))))
|
|
|
|
|
|
|
|
|
|
(defun python-nav-forward-defun (&optional arg)
|
|
|
|
|
"Navigate to closer defun forward ARG times.
|
|
|
|
|
Unlikely `python-nav-beginning-of-defun' this doesn't care about
|
|
|
|
|
nested definitions."
|
|
|
|
|
(interactive "^p")
|
|
|
|
|
(python-nav--forward-defun (or arg 1)))
|
|
|
|
|
|
2012-07-17 15:02:53 -03:00
|
|
|
|
(defun python-nav-beginning-of-statement ()
|
2012-07-16 10:13:01 -03:00
|
|
|
|
"Move to start of current statement."
|
2012-05-17 00:03:15 -03:00
|
|
|
|
(interactive "^")
|
2018-02-12 03:27:52 +03:00
|
|
|
|
(forward-line 0)
|
2013-12-24 16:48:40 -03:00
|
|
|
|
(let* ((ppss (syntax-ppss))
|
|
|
|
|
(context-point
|
|
|
|
|
(or
|
|
|
|
|
(python-syntax-context 'paren ppss)
|
|
|
|
|
(python-syntax-context 'string ppss))))
|
|
|
|
|
(cond ((bobp))
|
|
|
|
|
(context-point
|
|
|
|
|
(goto-char context-point)
|
|
|
|
|
(python-nav-beginning-of-statement))
|
|
|
|
|
((save-excursion
|
|
|
|
|
(forward-line -1)
|
|
|
|
|
(python-info-line-ends-backslash-p))
|
|
|
|
|
(forward-line -1)
|
|
|
|
|
(python-nav-beginning-of-statement))))
|
2018-02-12 03:27:52 +03:00
|
|
|
|
(back-to-indentation)
|
2012-10-08 02:19:15 -03:00
|
|
|
|
(point-marker))
|
2012-05-17 00:03:15 -03:00
|
|
|
|
|
2012-12-31 17:58:57 -03:00
|
|
|
|
(defun python-nav-end-of-statement (&optional noend)
|
|
|
|
|
"Move to end of current statement.
|
|
|
|
|
Optional argument NOEND is internal and makes the logic to not
|
|
|
|
|
jump to the end of line when moving forward searching for the end
|
|
|
|
|
of the statement."
|
2012-05-17 00:03:15 -03:00
|
|
|
|
(interactive "^")
|
2017-02-28 22:21:37 +01:00
|
|
|
|
(let (string-start bs-pos (last-string-end 0))
|
2012-12-31 17:58:57 -03:00
|
|
|
|
(while (and (or noend (goto-char (line-end-position)))
|
|
|
|
|
(not (eobp))
|
|
|
|
|
(cond ((setq string-start (python-syntax-context 'string))
|
2017-02-28 22:21:37 +01:00
|
|
|
|
;; The assertion can only fail if syntax table
|
|
|
|
|
;; text properties and the `syntax-ppss' cache
|
|
|
|
|
;; are somehow out of whack. This has been
|
|
|
|
|
;; observed when using `syntax-ppss' during
|
|
|
|
|
;; narrowing.
|
2018-06-02 16:22:17 -04:00
|
|
|
|
(cl-assert (>= string-start last-string-end)
|
2017-02-28 22:21:37 +01:00
|
|
|
|
:show-args
|
2018-03-01 21:52:27 -05:00
|
|
|
|
"\
|
2018-02-27 19:44:35 -05:00
|
|
|
|
Overlapping strings detected (start=%d, last-end=%d)")
|
2012-12-31 17:58:57 -03:00
|
|
|
|
(goto-char string-start)
|
2013-01-10 00:44:12 -03:00
|
|
|
|
(if (python-syntax-context 'paren)
|
|
|
|
|
;; Ended up inside a paren, roll again.
|
|
|
|
|
(python-nav-end-of-statement t)
|
|
|
|
|
;; This is not inside a paren, move to the
|
|
|
|
|
;; end of this string.
|
|
|
|
|
(goto-char (+ (point)
|
|
|
|
|
(python-syntax-count-quotes
|
|
|
|
|
(char-after (point)) (point))))
|
2017-02-28 22:21:37 +01:00
|
|
|
|
(setq last-string-end
|
|
|
|
|
(or (re-search-forward
|
|
|
|
|
(rx (syntax string-delimiter)) nil t)
|
|
|
|
|
(goto-char (point-max))))))
|
2012-12-31 17:58:57 -03:00
|
|
|
|
((python-syntax-context 'paren)
|
|
|
|
|
;; The statement won't end before we've escaped
|
|
|
|
|
;; at least one level of parenthesis.
|
|
|
|
|
(condition-case err
|
|
|
|
|
(goto-char (scan-lists (point) 1 -1))
|
|
|
|
|
(scan-error (goto-char (nth 3 err)))))
|
|
|
|
|
((setq bs-pos (python-info-line-ends-backslash-p))
|
|
|
|
|
(goto-char bs-pos)
|
|
|
|
|
(forward-line 1))))))
|
2012-10-08 02:19:15 -03:00
|
|
|
|
(point-marker))
|
2012-05-17 00:03:15 -03:00
|
|
|
|
|
2012-07-16 10:13:01 -03:00
|
|
|
|
(defun python-nav-backward-statement (&optional arg)
|
|
|
|
|
"Move backward to previous statement.
|
|
|
|
|
With ARG, repeat. See `python-nav-forward-statement'."
|
2012-05-17 00:03:15 -03:00
|
|
|
|
(interactive "^p")
|
|
|
|
|
(or arg (setq arg 1))
|
2012-07-16 10:13:01 -03:00
|
|
|
|
(python-nav-forward-statement (- arg)))
|
2012-05-17 00:03:15 -03:00
|
|
|
|
|
2012-07-16 10:13:01 -03:00
|
|
|
|
(defun python-nav-forward-statement (&optional arg)
|
|
|
|
|
"Move forward to next statement.
|
|
|
|
|
With ARG, repeat. With negative argument, move ARG times
|
|
|
|
|
backward to previous statement."
|
2012-05-17 00:03:15 -03:00
|
|
|
|
(interactive "^p")
|
|
|
|
|
(or arg (setq arg 1))
|
|
|
|
|
(while (> arg 0)
|
2012-07-17 15:02:53 -03:00
|
|
|
|
(python-nav-end-of-statement)
|
2012-05-17 00:03:34 -03:00
|
|
|
|
(python-util-forward-comment)
|
2012-07-17 15:02:53 -03:00
|
|
|
|
(python-nav-beginning-of-statement)
|
2012-05-17 00:03:15 -03:00
|
|
|
|
(setq arg (1- arg)))
|
|
|
|
|
(while (< arg 0)
|
2012-07-17 15:02:53 -03:00
|
|
|
|
(python-nav-beginning-of-statement)
|
2012-05-17 00:03:34 -03:00
|
|
|
|
(python-util-forward-comment -1)
|
2012-07-17 15:02:53 -03:00
|
|
|
|
(python-nav-beginning-of-statement)
|
2012-07-16 10:13:01 -03:00
|
|
|
|
(setq arg (1+ arg))))
|
|
|
|
|
|
2012-07-17 15:02:53 -03:00
|
|
|
|
(defun python-nav-beginning-of-block ()
|
2012-07-16 10:13:01 -03:00
|
|
|
|
"Move to start of current block."
|
|
|
|
|
(interactive "^")
|
2013-09-04 23:46:34 -04:00
|
|
|
|
(let ((starting-pos (point)))
|
2012-07-16 10:13:01 -03:00
|
|
|
|
(if (progn
|
2012-07-17 15:02:53 -03:00
|
|
|
|
(python-nav-beginning-of-statement)
|
2012-07-16 10:13:01 -03:00
|
|
|
|
(looking-at (python-rx block-start)))
|
|
|
|
|
(point-marker)
|
|
|
|
|
;; Go to first line beginning a statement
|
|
|
|
|
(while (and (not (bobp))
|
2012-07-17 15:02:53 -03:00
|
|
|
|
(or (and (python-nav-beginning-of-statement) nil)
|
2012-07-16 10:13:01 -03:00
|
|
|
|
(python-info-current-line-comment-p)
|
|
|
|
|
(python-info-current-line-empty-p)))
|
|
|
|
|
(forward-line -1))
|
|
|
|
|
(let ((block-matching-indent
|
|
|
|
|
(- (current-indentation) python-indent-offset)))
|
|
|
|
|
(while
|
|
|
|
|
(and (python-nav-backward-block)
|
|
|
|
|
(> (current-indentation) block-matching-indent)))
|
|
|
|
|
(if (and (looking-at (python-rx block-start))
|
|
|
|
|
(= (current-indentation) block-matching-indent))
|
|
|
|
|
(point-marker)
|
|
|
|
|
(and (goto-char starting-pos) nil))))))
|
|
|
|
|
|
2012-07-17 15:02:53 -03:00
|
|
|
|
(defun python-nav-end-of-block ()
|
2012-07-16 10:13:01 -03:00
|
|
|
|
"Move to end of current block."
|
|
|
|
|
(interactive "^")
|
2012-07-17 15:02:53 -03:00
|
|
|
|
(when (python-nav-beginning-of-block)
|
2012-07-16 10:13:01 -03:00
|
|
|
|
(let ((block-indentation (current-indentation)))
|
2012-07-17 15:02:53 -03:00
|
|
|
|
(python-nav-end-of-statement)
|
2012-07-16 10:13:01 -03:00
|
|
|
|
(while (and (forward-line 1)
|
|
|
|
|
(not (eobp))
|
|
|
|
|
(or (and (> (current-indentation) block-indentation)
|
2012-07-17 15:02:53 -03:00
|
|
|
|
(or (python-nav-end-of-statement) t))
|
2012-07-16 10:13:01 -03:00
|
|
|
|
(python-info-current-line-comment-p)
|
|
|
|
|
(python-info-current-line-empty-p))))
|
|
|
|
|
(python-util-forward-comment -1)
|
|
|
|
|
(point-marker))))
|
|
|
|
|
|
|
|
|
|
(defun python-nav-backward-block (&optional arg)
|
|
|
|
|
"Move backward to previous block of code.
|
|
|
|
|
With ARG, repeat. See `python-nav-forward-block'."
|
|
|
|
|
(interactive "^p")
|
|
|
|
|
(or arg (setq arg 1))
|
|
|
|
|
(python-nav-forward-block (- arg)))
|
|
|
|
|
|
|
|
|
|
(defun python-nav-forward-block (&optional arg)
|
|
|
|
|
"Move forward to next block of code.
|
|
|
|
|
With ARG, repeat. With negative argument, move ARG times
|
|
|
|
|
backward to previous block."
|
|
|
|
|
(interactive "^p")
|
|
|
|
|
(or arg (setq arg 1))
|
|
|
|
|
(let ((block-start-regexp
|
|
|
|
|
(python-rx line-start (* whitespace) block-start))
|
|
|
|
|
(starting-pos (point)))
|
|
|
|
|
(while (> arg 0)
|
2012-07-17 15:02:53 -03:00
|
|
|
|
(python-nav-end-of-statement)
|
2012-07-16 10:13:01 -03:00
|
|
|
|
(while (and
|
|
|
|
|
(re-search-forward block-start-regexp nil t)
|
2012-08-07 23:30:08 -03:00
|
|
|
|
(python-syntax-context-type)))
|
2012-07-16 10:13:01 -03:00
|
|
|
|
(setq arg (1- arg)))
|
|
|
|
|
(while (< arg 0)
|
2012-07-17 15:02:53 -03:00
|
|
|
|
(python-nav-beginning-of-statement)
|
2012-07-16 10:13:01 -03:00
|
|
|
|
(while (and
|
|
|
|
|
(re-search-backward block-start-regexp nil t)
|
2012-08-07 23:30:08 -03:00
|
|
|
|
(python-syntax-context-type)))
|
2012-07-16 10:13:01 -03:00
|
|
|
|
(setq arg (1+ arg)))
|
2012-07-17 15:02:53 -03:00
|
|
|
|
(python-nav-beginning-of-statement)
|
2012-07-16 10:13:01 -03:00
|
|
|
|
(if (not (looking-at (python-rx block-start)))
|
|
|
|
|
(and (goto-char starting-pos) nil)
|
|
|
|
|
(and (not (= (point) starting-pos)) (point-marker)))))
|
|
|
|
|
|
2013-12-25 15:07:31 -03:00
|
|
|
|
(defun python-nav--lisp-forward-sexp (&optional arg)
|
|
|
|
|
"Standard version `forward-sexp'.
|
|
|
|
|
It ignores completely the value of `forward-sexp-function' by
|
|
|
|
|
setting it to nil before calling `forward-sexp'. With positive
|
|
|
|
|
ARG move forward only one sexp, else move backwards."
|
2013-01-10 00:44:12 -03:00
|
|
|
|
(let ((forward-sexp-function)
|
2013-12-25 15:07:31 -03:00
|
|
|
|
(arg (if (or (not arg) (> arg 0)) 1 -1)))
|
|
|
|
|
(forward-sexp arg)))
|
|
|
|
|
|
|
|
|
|
(defun python-nav--lisp-forward-sexp-safe (&optional arg)
|
|
|
|
|
"Safe version of standard `forward-sexp'.
|
2018-02-16 15:16:15 -05:00
|
|
|
|
When at end of sexp (i.e. looking at an opening/closing paren)
|
2013-12-25 15:07:31 -03:00
|
|
|
|
skips it instead of throwing an error. With positive ARG move
|
|
|
|
|
forward only one sexp, else move backwards."
|
|
|
|
|
(let* ((arg (if (or (not arg) (> arg 0)) 1 -1))
|
|
|
|
|
(paren-regexp
|
|
|
|
|
(if (> arg 0) (python-rx close-paren) (python-rx open-paren)))
|
|
|
|
|
(search-fn
|
|
|
|
|
(if (> arg 0) #'re-search-forward #'re-search-backward)))
|
2012-08-09 00:30:37 -03:00
|
|
|
|
(condition-case nil
|
2013-12-25 15:07:31 -03:00
|
|
|
|
(python-nav--lisp-forward-sexp arg)
|
2012-08-09 00:30:37 -03:00
|
|
|
|
(error
|
|
|
|
|
(while (and (funcall search-fn paren-regexp nil t)
|
|
|
|
|
(python-syntax-context 'paren)))))))
|
|
|
|
|
|
2015-04-12 22:43:44 -03:00
|
|
|
|
(defun python-nav--forward-sexp (&optional dir safe skip-parens-p)
|
2012-10-08 02:19:15 -03:00
|
|
|
|
"Move to forward sexp.
|
2013-12-25 15:07:31 -03:00
|
|
|
|
With positive optional argument DIR direction move forward, else
|
|
|
|
|
backwards. When optional argument SAFE is non-nil do not throw
|
2015-04-12 22:43:44 -03:00
|
|
|
|
errors when at end of sexp, skip it instead. With optional
|
2015-04-19 23:59:04 -07:00
|
|
|
|
argument SKIP-PARENS-P force sexp motion to ignore parenthesized
|
2015-04-12 22:43:44 -03:00
|
|
|
|
expressions when looking at them in either direction."
|
2012-10-08 02:19:15 -03:00
|
|
|
|
(setq dir (or dir 1))
|
|
|
|
|
(unless (= dir 0)
|
|
|
|
|
(let* ((forward-p (if (> dir 0)
|
|
|
|
|
(and (setq dir 1) t)
|
|
|
|
|
(and (setq dir -1) nil)))
|
|
|
|
|
(context-type (python-syntax-context-type)))
|
|
|
|
|
(cond
|
2013-02-13 21:42:11 -03:00
|
|
|
|
((memq context-type '(string comment))
|
2012-10-08 02:19:15 -03:00
|
|
|
|
;; Inside of a string, get out of it.
|
2013-02-13 21:42:11 -03:00
|
|
|
|
(let ((forward-sexp-function))
|
|
|
|
|
(forward-sexp dir)))
|
2015-04-12 22:43:44 -03:00
|
|
|
|
((and (not skip-parens-p)
|
|
|
|
|
(or (eq context-type 'paren)
|
|
|
|
|
(if forward-p
|
|
|
|
|
(eq (syntax-class (syntax-after (point)))
|
|
|
|
|
(car (string-to-syntax "(")))
|
|
|
|
|
(eq (syntax-class (syntax-after (1- (point))))
|
|
|
|
|
(car (string-to-syntax ")"))))))
|
2012-10-08 02:19:15 -03:00
|
|
|
|
;; Inside a paren or looking at it, lisp knows what to do.
|
2013-12-25 15:07:31 -03:00
|
|
|
|
(if safe
|
|
|
|
|
(python-nav--lisp-forward-sexp-safe dir)
|
|
|
|
|
(python-nav--lisp-forward-sexp dir)))
|
2012-10-08 02:19:15 -03:00
|
|
|
|
(t
|
|
|
|
|
;; This part handles the lispy feel of
|
|
|
|
|
;; `python-nav-forward-sexp'. Knowing everything about the
|
|
|
|
|
;; current context and the context of the next sexp tries to
|
|
|
|
|
;; follow the lisp sexp motion commands in a symmetric manner.
|
|
|
|
|
(let* ((context
|
|
|
|
|
(cond
|
|
|
|
|
((python-info-beginning-of-block-p) 'block-start)
|
|
|
|
|
((python-info-end-of-block-p) 'block-end)
|
|
|
|
|
((python-info-beginning-of-statement-p) 'statement-start)
|
|
|
|
|
((python-info-end-of-statement-p) 'statement-end)))
|
|
|
|
|
(next-sexp-pos
|
|
|
|
|
(save-excursion
|
2013-12-25 15:07:31 -03:00
|
|
|
|
(if safe
|
|
|
|
|
(python-nav--lisp-forward-sexp-safe dir)
|
|
|
|
|
(python-nav--lisp-forward-sexp dir))
|
2012-10-08 02:19:15 -03:00
|
|
|
|
(point)))
|
2013-02-13 21:42:11 -03:00
|
|
|
|
(next-sexp-context
|
|
|
|
|
(save-excursion
|
|
|
|
|
(goto-char next-sexp-pos)
|
|
|
|
|
(cond
|
|
|
|
|
((python-info-beginning-of-block-p) 'block-start)
|
|
|
|
|
((python-info-end-of-block-p) 'block-end)
|
|
|
|
|
((python-info-beginning-of-statement-p) 'statement-start)
|
|
|
|
|
((python-info-end-of-statement-p) 'statement-end)
|
|
|
|
|
((python-info-statement-starts-block-p) 'starts-block)
|
|
|
|
|
((python-info-statement-ends-block-p) 'ends-block)))))
|
2012-10-08 02:19:15 -03:00
|
|
|
|
(if forward-p
|
|
|
|
|
(cond ((and (not (eobp))
|
|
|
|
|
(python-info-current-line-empty-p))
|
|
|
|
|
(python-util-forward-comment dir)
|
2015-04-12 22:43:44 -03:00
|
|
|
|
(python-nav--forward-sexp dir safe skip-parens-p))
|
2012-10-08 02:19:15 -03:00
|
|
|
|
((eq context 'block-start)
|
|
|
|
|
(python-nav-end-of-block))
|
|
|
|
|
((eq context 'statement-start)
|
|
|
|
|
(python-nav-end-of-statement))
|
|
|
|
|
((and (memq context '(statement-end block-end))
|
|
|
|
|
(eq next-sexp-context 'ends-block))
|
|
|
|
|
(goto-char next-sexp-pos)
|
|
|
|
|
(python-nav-end-of-block))
|
|
|
|
|
((and (memq context '(statement-end block-end))
|
|
|
|
|
(eq next-sexp-context 'starts-block))
|
|
|
|
|
(goto-char next-sexp-pos)
|
|
|
|
|
(python-nav-end-of-block))
|
|
|
|
|
((memq context '(statement-end block-end))
|
|
|
|
|
(goto-char next-sexp-pos)
|
|
|
|
|
(python-nav-end-of-statement))
|
|
|
|
|
(t (goto-char next-sexp-pos)))
|
|
|
|
|
(cond ((and (not (bobp))
|
|
|
|
|
(python-info-current-line-empty-p))
|
2013-02-13 21:42:11 -03:00
|
|
|
|
(python-util-forward-comment dir)
|
2015-04-12 22:43:44 -03:00
|
|
|
|
(python-nav--forward-sexp dir safe skip-parens-p))
|
2012-10-08 02:19:15 -03:00
|
|
|
|
((eq context 'block-end)
|
|
|
|
|
(python-nav-beginning-of-block))
|
|
|
|
|
((eq context 'statement-end)
|
|
|
|
|
(python-nav-beginning-of-statement))
|
|
|
|
|
((and (memq context '(statement-start block-start))
|
|
|
|
|
(eq next-sexp-context 'starts-block))
|
|
|
|
|
(goto-char next-sexp-pos)
|
|
|
|
|
(python-nav-beginning-of-block))
|
|
|
|
|
((and (memq context '(statement-start block-start))
|
|
|
|
|
(eq next-sexp-context 'ends-block))
|
|
|
|
|
(goto-char next-sexp-pos)
|
|
|
|
|
(python-nav-beginning-of-block))
|
|
|
|
|
((memq context '(statement-start block-start))
|
|
|
|
|
(goto-char next-sexp-pos)
|
|
|
|
|
(python-nav-beginning-of-statement))
|
|
|
|
|
(t (goto-char next-sexp-pos))))))))))
|
2012-08-09 00:30:37 -03:00
|
|
|
|
|
2015-04-12 22:43:44 -03:00
|
|
|
|
(defun python-nav-forward-sexp (&optional arg safe skip-parens-p)
|
2013-12-25 15:07:31 -03:00
|
|
|
|
"Move forward across expressions.
|
|
|
|
|
With ARG, do it that many times. Negative arg -N means move
|
2015-04-12 22:43:44 -03:00
|
|
|
|
backward N times. When optional argument SAFE is non-nil do not
|
|
|
|
|
throw errors when at end of sexp, skip it instead. With optional
|
2015-04-19 23:59:04 -07:00
|
|
|
|
argument SKIP-PARENS-P force sexp motion to ignore parenthesized
|
2015-04-12 22:43:44 -03:00
|
|
|
|
expressions when looking at them in either direction (forced to t
|
|
|
|
|
in interactive calls)."
|
2013-12-25 15:07:31 -03:00
|
|
|
|
(interactive "^p")
|
|
|
|
|
(or arg (setq arg 1))
|
2015-04-12 22:43:44 -03:00
|
|
|
|
;; Do not follow parens on interactive calls. This hack to detect
|
|
|
|
|
;; if the function was called interactively copes with the way
|
|
|
|
|
;; `forward-sexp' works by calling `forward-sexp-function', losing
|
|
|
|
|
;; interactive detection by checking `current-prefix-arg'. The
|
|
|
|
|
;; reason to make this distinction is that lisp functions like
|
|
|
|
|
;; `blink-matching-open' get confused causing issues like the one in
|
2015-04-19 23:59:04 -07:00
|
|
|
|
;; Bug#16191. With this approach the user gets a symmetric behavior
|
2015-04-12 22:43:44 -03:00
|
|
|
|
;; when working interactively while called functions expecting
|
|
|
|
|
;; paren-based sexp motion work just fine.
|
|
|
|
|
(or
|
|
|
|
|
skip-parens-p
|
|
|
|
|
(setq skip-parens-p
|
|
|
|
|
(memq real-this-command
|
|
|
|
|
(list
|
|
|
|
|
#'forward-sexp #'backward-sexp
|
|
|
|
|
#'python-nav-forward-sexp #'python-nav-backward-sexp
|
|
|
|
|
#'python-nav-forward-sexp-safe #'python-nav-backward-sexp))))
|
2013-12-25 15:07:31 -03:00
|
|
|
|
(while (> arg 0)
|
2015-04-12 22:43:44 -03:00
|
|
|
|
(python-nav--forward-sexp 1 safe skip-parens-p)
|
2013-12-25 15:07:31 -03:00
|
|
|
|
(setq arg (1- arg)))
|
|
|
|
|
(while (< arg 0)
|
2015-04-12 22:43:44 -03:00
|
|
|
|
(python-nav--forward-sexp -1 safe skip-parens-p)
|
2013-12-25 15:07:31 -03:00
|
|
|
|
(setq arg (1+ arg))))
|
|
|
|
|
|
2015-04-12 22:43:44 -03:00
|
|
|
|
(defun python-nav-backward-sexp (&optional arg safe skip-parens-p)
|
2013-12-25 15:07:31 -03:00
|
|
|
|
"Move backward across expressions.
|
|
|
|
|
With ARG, do it that many times. Negative arg -N means move
|
2015-04-12 22:43:44 -03:00
|
|
|
|
forward N times. When optional argument SAFE is non-nil do not
|
|
|
|
|
throw errors when at end of sexp, skip it instead. With optional
|
2015-04-19 23:59:04 -07:00
|
|
|
|
argument SKIP-PARENS-P force sexp motion to ignore parenthesized
|
2015-04-12 22:43:44 -03:00
|
|
|
|
expressions when looking at them in either direction (forced to t
|
|
|
|
|
in interactive calls)."
|
2013-12-25 15:07:31 -03:00
|
|
|
|
(interactive "^p")
|
|
|
|
|
(or arg (setq arg 1))
|
2015-04-12 22:43:44 -03:00
|
|
|
|
(python-nav-forward-sexp (- arg) safe skip-parens-p))
|
2013-12-25 15:07:31 -03:00
|
|
|
|
|
2015-04-12 22:43:44 -03:00
|
|
|
|
(defun python-nav-forward-sexp-safe (&optional arg skip-parens-p)
|
2013-12-25 15:07:31 -03:00
|
|
|
|
"Move forward safely across expressions.
|
|
|
|
|
With ARG, do it that many times. Negative arg -N means move
|
2015-04-12 22:43:44 -03:00
|
|
|
|
backward N times. With optional argument SKIP-PARENS-P force
|
2015-04-19 23:59:04 -07:00
|
|
|
|
sexp motion to ignore parenthesized expressions when looking at
|
2015-04-12 22:43:44 -03:00
|
|
|
|
them in either direction (forced to t in interactive calls)."
|
2012-07-16 10:13:01 -03:00
|
|
|
|
(interactive "^p")
|
2015-04-12 22:43:44 -03:00
|
|
|
|
(python-nav-forward-sexp arg t skip-parens-p))
|
2012-05-17 00:03:15 -03:00
|
|
|
|
|
2015-04-12 22:43:44 -03:00
|
|
|
|
(defun python-nav-backward-sexp-safe (&optional arg skip-parens-p)
|
2013-12-25 15:07:31 -03:00
|
|
|
|
"Move backward safely across expressions.
|
|
|
|
|
With ARG, do it that many times. Negative arg -N means move
|
2015-04-12 22:43:44 -03:00
|
|
|
|
forward N times. With optional argument SKIP-PARENS-P force sexp
|
2015-04-19 23:59:04 -07:00
|
|
|
|
motion to ignore parenthesized expressions when looking at them in
|
2015-04-12 22:43:44 -03:00
|
|
|
|
either direction (forced to t in interactive calls)."
|
2013-12-25 15:07:31 -03:00
|
|
|
|
(interactive "^p")
|
2015-04-12 22:43:44 -03:00
|
|
|
|
(python-nav-backward-sexp arg t skip-parens-p))
|
2013-12-25 15:07:31 -03:00
|
|
|
|
|
2012-10-08 23:07:26 -03:00
|
|
|
|
(defun python-nav--up-list (&optional dir)
|
|
|
|
|
"Internal implementation of `python-nav-up-list'.
|
|
|
|
|
DIR is always 1 or -1 and comes sanitized from
|
|
|
|
|
`python-nav-up-list' calls."
|
|
|
|
|
(let ((context (python-syntax-context-type))
|
|
|
|
|
(forward-p (> dir 0)))
|
|
|
|
|
(cond
|
|
|
|
|
((memq context '(string comment)))
|
|
|
|
|
((eq context 'paren)
|
|
|
|
|
(let ((forward-sexp-function))
|
|
|
|
|
(up-list dir)))
|
|
|
|
|
((and forward-p (python-info-end-of-block-p))
|
|
|
|
|
(let ((parent-end-pos
|
|
|
|
|
(save-excursion
|
|
|
|
|
(let ((indentation (and
|
|
|
|
|
(python-nav-beginning-of-block)
|
|
|
|
|
(current-indentation))))
|
|
|
|
|
(while (and indentation
|
|
|
|
|
(> indentation 0)
|
|
|
|
|
(>= (current-indentation) indentation)
|
|
|
|
|
(python-nav-backward-block)))
|
|
|
|
|
(python-nav-end-of-block)))))
|
|
|
|
|
(and (> (or parent-end-pos (point)) (point))
|
|
|
|
|
(goto-char parent-end-pos))))
|
|
|
|
|
(forward-p (python-nav-end-of-block))
|
|
|
|
|
((and (not forward-p)
|
|
|
|
|
(> (current-indentation) 0)
|
|
|
|
|
(python-info-beginning-of-block-p))
|
|
|
|
|
(let ((prev-block-pos
|
|
|
|
|
(save-excursion
|
|
|
|
|
(let ((indentation (current-indentation)))
|
|
|
|
|
(while (and (python-nav-backward-block)
|
2012-10-11 21:07:25 -03:00
|
|
|
|
(>= (current-indentation) indentation))))
|
2012-10-08 23:07:26 -03:00
|
|
|
|
(point))))
|
|
|
|
|
(and (> (point) prev-block-pos)
|
|
|
|
|
(goto-char prev-block-pos))))
|
|
|
|
|
((not forward-p) (python-nav-beginning-of-block)))))
|
|
|
|
|
|
|
|
|
|
(defun python-nav-up-list (&optional arg)
|
|
|
|
|
"Move forward out of one level of parentheses (or blocks).
|
|
|
|
|
With ARG, do this that many times.
|
|
|
|
|
A negative argument means move backward but still to a less deep spot.
|
|
|
|
|
This command assumes point is not in a string or comment."
|
|
|
|
|
(interactive "^p")
|
|
|
|
|
(or arg (setq arg 1))
|
|
|
|
|
(while (> arg 0)
|
|
|
|
|
(python-nav--up-list 1)
|
|
|
|
|
(setq arg (1- arg)))
|
|
|
|
|
(while (< arg 0)
|
|
|
|
|
(python-nav--up-list -1)
|
|
|
|
|
(setq arg (1+ arg))))
|
|
|
|
|
|
|
|
|
|
(defun python-nav-backward-up-list (&optional arg)
|
|
|
|
|
"Move backward out of one level of parentheses (or blocks).
|
|
|
|
|
With ARG, do this that many times.
|
lisp/progmodes/python.el: Fix docstring typos.
(defconst, python-syntax-count-quotes)
(python-indent-region, python-indent-shift-right)
(python-indent-dedent-line-backspace, python-nav-backward-sexp)
(python-nav-backward-sexp-safe, python-nav-backward-up-list)
(python-shell-prompt-block-regexp, python-shell-prompt-output-regexp)
(python-shell-prompt-pdb-regexp, python-shell-enable-font-lock)
(inferior-python-mode, python-shell-make-comint, run-python-internal)
(python-shell-buffer-substring, python-shell-send-buffer)
(python-pdbtrack-activate, python-pdbtrack-stacktrace-info-regexp)
(python-completion-complete-at-point, python-fill-docstring-style)
(python-eldoc-function, python-imenu-format-item-label)
(python-imenu-format-parent-item-label)
(python-imenu-format-parent-item-jump-label)
(python-imenu--build-tree, python-imenu-create-index)
(python-imenu-create-flat-index): Fix docstring typos.
(python-indent-context, python-shell-prompt-regexp, run-python):
Remove superfluous backslashes.
(python-indent-line, python-nav-beginning-of-defun)
(python-shell-get-buffer, python-shell-get-process)
(python-info-current-defun, python-info-current-line-comment-p)
(python-info-current-line-empty-p, python-util-popn): Doc fixes.
(python-indent-post-self-insert-function, python-shell-send-file)
(python-shell-completion-get-completions)
(python-shell-completion-complete-or-indent)
(python-eldoc--get-doc-at-point): Reflow docstrings.
2014-03-15 18:37:58 +01:00
|
|
|
|
A negative argument means move forward but still to a less deep spot.
|
2012-10-08 23:07:26 -03:00
|
|
|
|
This command assumes point is not in a string or comment."
|
|
|
|
|
(interactive "^p")
|
|
|
|
|
(or arg (setq arg 1))
|
|
|
|
|
(python-nav-up-list (- arg)))
|
|
|
|
|
|
2013-09-02 00:37:18 -03:00
|
|
|
|
(defun python-nav-if-name-main ()
|
|
|
|
|
"Move point at the beginning the __main__ block.
|
2015-11-17 15:28:50 -08:00
|
|
|
|
When \"if __name__ == \\='__main__\\=':\" is found returns its
|
2013-09-02 00:37:18 -03:00
|
|
|
|
position, else returns nil."
|
|
|
|
|
(interactive)
|
|
|
|
|
(let ((point (point))
|
|
|
|
|
(found (catch 'found
|
|
|
|
|
(goto-char (point-min))
|
|
|
|
|
(while (re-search-forward
|
|
|
|
|
(python-rx line-start
|
|
|
|
|
"if" (+ space)
|
|
|
|
|
"__name__" (+ space)
|
|
|
|
|
"==" (+ space)
|
|
|
|
|
(group-n 1 (or ?\" ?\'))
|
|
|
|
|
"__main__" (backref 1) (* space) ":")
|
|
|
|
|
nil t)
|
|
|
|
|
(when (not (python-syntax-context-type))
|
|
|
|
|
(beginning-of-line)
|
|
|
|
|
(throw 'found t))))))
|
|
|
|
|
(if found
|
|
|
|
|
(point)
|
|
|
|
|
(ignore (goto-char point)))))
|
|
|
|
|
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
|
|
|
|
;;; Shell integration
|
|
|
|
|
|
2012-05-17 00:03:23 -03:00
|
|
|
|
(defcustom python-shell-buffer-name "Python"
|
|
|
|
|
"Default buffer name for Python interpreter."
|
|
|
|
|
:type 'string
|
|
|
|
|
:group 'python
|
|
|
|
|
:safe 'stringp)
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
|
|
|
|
(defcustom python-shell-interpreter "python"
|
|
|
|
|
"Default Python interpreter for shell."
|
|
|
|
|
:type 'string
|
2012-05-17 00:03:33 -03:00
|
|
|
|
:group 'python)
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
2012-05-17 00:03:23 -03:00
|
|
|
|
(defcustom python-shell-internal-buffer-name "Python Internal"
|
|
|
|
|
"Default buffer name for the Internal Python interpreter."
|
|
|
|
|
:type 'string
|
|
|
|
|
:group 'python
|
|
|
|
|
:safe 'stringp)
|
2012-05-17 00:03:21 -03:00
|
|
|
|
|
2012-05-17 00:02:52 -03:00
|
|
|
|
(defcustom python-shell-interpreter-args "-i"
|
|
|
|
|
"Default arguments for the Python interpreter."
|
|
|
|
|
:type 'string
|
2012-05-17 00:03:33 -03:00
|
|
|
|
:group 'python)
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
2014-07-19 10:13:07 -03:00
|
|
|
|
(defcustom python-shell-interpreter-interactive-arg "-i"
|
|
|
|
|
"Interpreter argument to force it to run interactively."
|
|
|
|
|
:type 'string
|
|
|
|
|
:version "24.4")
|
|
|
|
|
|
|
|
|
|
(defcustom python-shell-prompt-detect-enabled t
|
|
|
|
|
"Non-nil enables autodetection of interpreter prompts."
|
|
|
|
|
:type 'boolean
|
|
|
|
|
:safe 'booleanp
|
|
|
|
|
:version "24.4")
|
|
|
|
|
|
|
|
|
|
(defcustom python-shell-prompt-detect-failure-warning t
|
|
|
|
|
"Non-nil enables warnings when detection of prompts fail."
|
|
|
|
|
:type 'boolean
|
|
|
|
|
:safe 'booleanp
|
|
|
|
|
:version "24.4")
|
|
|
|
|
|
|
|
|
|
(defcustom python-shell-prompt-input-regexps
|
|
|
|
|
'(">>> " "\\.\\.\\. " ; Python
|
2014-07-20 15:12:30 -03:00
|
|
|
|
"In \\[[0-9]+\\]: " ; IPython
|
2014-07-26 20:43:51 -03:00
|
|
|
|
" \\.\\.\\.: " ; IPython
|
2014-07-20 15:12:30 -03:00
|
|
|
|
;; Using ipdb outside IPython may fail to cleanup and leave static
|
|
|
|
|
;; IPython prompts activated, this adds some safeguard for that.
|
|
|
|
|
"In : " "\\.\\.\\.: ")
|
2014-07-19 10:13:07 -03:00
|
|
|
|
"List of regular expressions matching input prompts."
|
|
|
|
|
:type '(repeat string)
|
|
|
|
|
:version "24.4")
|
|
|
|
|
|
|
|
|
|
(defcustom python-shell-prompt-output-regexps
|
|
|
|
|
'("" ; Python
|
2014-07-20 15:12:30 -03:00
|
|
|
|
"Out\\[[0-9]+\\]: " ; IPython
|
|
|
|
|
"Out :") ; ipdb safeguard
|
2014-07-19 10:13:07 -03:00
|
|
|
|
"List of regular expressions matching output prompts."
|
|
|
|
|
:type '(repeat string)
|
|
|
|
|
:version "24.4")
|
|
|
|
|
|
2012-05-17 00:02:52 -03:00
|
|
|
|
(defcustom python-shell-prompt-regexp ">>> "
|
2014-07-19 10:13:07 -03:00
|
|
|
|
"Regular expression matching top level input prompt of Python shell.
|
2012-05-17 00:03:09 -03:00
|
|
|
|
It should not contain a caret (^) at the beginning."
|
2014-07-19 10:13:07 -03:00
|
|
|
|
:type 'string)
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
2019-02-19 23:57:07 +02:00
|
|
|
|
(defcustom python-shell-prompt-block-regexp "\\.\\.\\.:? "
|
lisp/progmodes/python.el: Fix docstring typos.
(defconst, python-syntax-count-quotes)
(python-indent-region, python-indent-shift-right)
(python-indent-dedent-line-backspace, python-nav-backward-sexp)
(python-nav-backward-sexp-safe, python-nav-backward-up-list)
(python-shell-prompt-block-regexp, python-shell-prompt-output-regexp)
(python-shell-prompt-pdb-regexp, python-shell-enable-font-lock)
(inferior-python-mode, python-shell-make-comint, run-python-internal)
(python-shell-buffer-substring, python-shell-send-buffer)
(python-pdbtrack-activate, python-pdbtrack-stacktrace-info-regexp)
(python-completion-complete-at-point, python-fill-docstring-style)
(python-eldoc-function, python-imenu-format-item-label)
(python-imenu-format-parent-item-label)
(python-imenu-format-parent-item-jump-label)
(python-imenu--build-tree, python-imenu-create-index)
(python-imenu-create-flat-index): Fix docstring typos.
(python-indent-context, python-shell-prompt-regexp, run-python):
Remove superfluous backslashes.
(python-indent-line, python-nav-beginning-of-defun)
(python-shell-get-buffer, python-shell-get-process)
(python-info-current-defun, python-info-current-line-comment-p)
(python-info-current-line-empty-p, python-util-popn): Doc fixes.
(python-indent-post-self-insert-function, python-shell-send-file)
(python-shell-completion-get-completions)
(python-shell-completion-complete-or-indent)
(python-eldoc--get-doc-at-point): Reflow docstrings.
2014-03-15 18:37:58 +01:00
|
|
|
|
"Regular expression matching block input prompt of Python shell.
|
2012-05-17 00:03:09 -03:00
|
|
|
|
It should not contain a caret (^) at the beginning."
|
2014-07-19 10:13:07 -03:00
|
|
|
|
:type 'string)
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
2012-05-17 00:03:23 -03:00
|
|
|
|
(defcustom python-shell-prompt-output-regexp ""
|
lisp/progmodes/python.el: Fix docstring typos.
(defconst, python-syntax-count-quotes)
(python-indent-region, python-indent-shift-right)
(python-indent-dedent-line-backspace, python-nav-backward-sexp)
(python-nav-backward-sexp-safe, python-nav-backward-up-list)
(python-shell-prompt-block-regexp, python-shell-prompt-output-regexp)
(python-shell-prompt-pdb-regexp, python-shell-enable-font-lock)
(inferior-python-mode, python-shell-make-comint, run-python-internal)
(python-shell-buffer-substring, python-shell-send-buffer)
(python-pdbtrack-activate, python-pdbtrack-stacktrace-info-regexp)
(python-completion-complete-at-point, python-fill-docstring-style)
(python-eldoc-function, python-imenu-format-item-label)
(python-imenu-format-parent-item-label)
(python-imenu-format-parent-item-jump-label)
(python-imenu--build-tree, python-imenu-create-index)
(python-imenu-create-flat-index): Fix docstring typos.
(python-indent-context, python-shell-prompt-regexp, run-python):
Remove superfluous backslashes.
(python-indent-line, python-nav-beginning-of-defun)
(python-shell-get-buffer, python-shell-get-process)
(python-info-current-defun, python-info-current-line-comment-p)
(python-info-current-line-empty-p, python-util-popn): Doc fixes.
(python-indent-post-self-insert-function, python-shell-send-file)
(python-shell-completion-get-completions)
(python-shell-completion-complete-or-indent)
(python-eldoc--get-doc-at-point): Reflow docstrings.
2014-03-15 18:37:58 +01:00
|
|
|
|
"Regular expression matching output prompt of Python shell.
|
2012-05-17 00:03:09 -03:00
|
|
|
|
It should not contain a caret (^) at the beginning."
|
2014-07-19 10:13:07 -03:00
|
|
|
|
:type 'string)
|
2012-05-17 00:03:06 -03:00
|
|
|
|
|
2012-05-17 00:02:52 -03:00
|
|
|
|
(defcustom python-shell-prompt-pdb-regexp "[(<]*[Ii]?[Pp]db[>)]+ "
|
lisp/progmodes/python.el: Fix docstring typos.
(defconst, python-syntax-count-quotes)
(python-indent-region, python-indent-shift-right)
(python-indent-dedent-line-backspace, python-nav-backward-sexp)
(python-nav-backward-sexp-safe, python-nav-backward-up-list)
(python-shell-prompt-block-regexp, python-shell-prompt-output-regexp)
(python-shell-prompt-pdb-regexp, python-shell-enable-font-lock)
(inferior-python-mode, python-shell-make-comint, run-python-internal)
(python-shell-buffer-substring, python-shell-send-buffer)
(python-pdbtrack-activate, python-pdbtrack-stacktrace-info-regexp)
(python-completion-complete-at-point, python-fill-docstring-style)
(python-eldoc-function, python-imenu-format-item-label)
(python-imenu-format-parent-item-label)
(python-imenu-format-parent-item-jump-label)
(python-imenu--build-tree, python-imenu-create-index)
(python-imenu-create-flat-index): Fix docstring typos.
(python-indent-context, python-shell-prompt-regexp, run-python):
Remove superfluous backslashes.
(python-indent-line, python-nav-beginning-of-defun)
(python-shell-get-buffer, python-shell-get-process)
(python-info-current-defun, python-info-current-line-comment-p)
(python-info-current-line-empty-p, python-util-popn): Doc fixes.
(python-indent-post-self-insert-function, python-shell-send-file)
(python-shell-completion-get-completions)
(python-shell-completion-complete-or-indent)
(python-eldoc--get-doc-at-point): Reflow docstrings.
2014-03-15 18:37:58 +01:00
|
|
|
|
"Regular expression matching pdb input prompt of Python shell.
|
2012-05-17 00:03:09 -03:00
|
|
|
|
It should not contain a caret (^) at the beginning."
|
2014-07-19 10:13:07 -03:00
|
|
|
|
:type 'string)
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
2014-07-26 22:59:49 -04:00
|
|
|
|
(define-obsolete-variable-alias
|
2014-09-29 14:14:08 -04:00
|
|
|
|
'python-shell-enable-font-lock 'python-shell-font-lock-enable "25.1")
|
2014-07-26 22:59:49 -04:00
|
|
|
|
|
2014-07-26 20:43:51 -03:00
|
|
|
|
(defcustom python-shell-font-lock-enable t
|
lisp/progmodes/python.el: Fix docstring typos.
(defconst, python-syntax-count-quotes)
(python-indent-region, python-indent-shift-right)
(python-indent-dedent-line-backspace, python-nav-backward-sexp)
(python-nav-backward-sexp-safe, python-nav-backward-up-list)
(python-shell-prompt-block-regexp, python-shell-prompt-output-regexp)
(python-shell-prompt-pdb-regexp, python-shell-enable-font-lock)
(inferior-python-mode, python-shell-make-comint, run-python-internal)
(python-shell-buffer-substring, python-shell-send-buffer)
(python-pdbtrack-activate, python-pdbtrack-stacktrace-info-regexp)
(python-completion-complete-at-point, python-fill-docstring-style)
(python-eldoc-function, python-imenu-format-item-label)
(python-imenu-format-parent-item-label)
(python-imenu-format-parent-item-jump-label)
(python-imenu--build-tree, python-imenu-create-index)
(python-imenu-create-flat-index): Fix docstring typos.
(python-indent-context, python-shell-prompt-regexp, run-python):
Remove superfluous backslashes.
(python-indent-line, python-nav-beginning-of-defun)
(python-shell-get-buffer, python-shell-get-process)
(python-info-current-defun, python-info-current-line-comment-p)
(python-info-current-line-empty-p, python-util-popn): Doc fixes.
(python-indent-post-self-insert-function, python-shell-send-file)
(python-shell-completion-get-completions)
(python-shell-completion-complete-or-indent)
(python-eldoc--get-doc-at-point): Reflow docstrings.
2014-03-15 18:37:58 +01:00
|
|
|
|
"Should syntax highlighting be enabled in the Python shell buffer?
|
|
|
|
|
Restart the Python shell after changing this variable for it to take effect."
|
2012-05-17 00:03:40 -03:00
|
|
|
|
:type 'boolean
|
|
|
|
|
:group 'python
|
|
|
|
|
:safe 'booleanp)
|
|
|
|
|
|
2014-11-22 20:09:30 -03:00
|
|
|
|
(defcustom python-shell-unbuffered t
|
|
|
|
|
"Should shell output be unbuffered?.
|
|
|
|
|
When non-nil, this may prevent delayed and missing output in the
|
|
|
|
|
Python shell. See commentary for details."
|
|
|
|
|
:type 'boolean
|
|
|
|
|
:group 'python
|
|
|
|
|
:safe 'booleanp)
|
|
|
|
|
|
2012-05-17 00:03:10 -03:00
|
|
|
|
(defcustom python-shell-process-environment nil
|
2015-08-21 19:06:57 -03:00
|
|
|
|
"List of overridden environment variables for subprocesses to inherit.
|
|
|
|
|
Each element should be a string of the form ENVVARNAME=VALUE.
|
|
|
|
|
When this variable is non-nil, values are exported into the
|
|
|
|
|
process environment before starting it. Any variables already
|
|
|
|
|
present in the current environment are superseded by variables
|
|
|
|
|
set here."
|
2012-05-17 00:03:10 -03:00
|
|
|
|
:type '(repeat string)
|
2015-08-21 19:06:57 -03:00
|
|
|
|
:group 'python)
|
2012-05-17 00:03:10 -03:00
|
|
|
|
|
2012-05-17 00:03:27 -03:00
|
|
|
|
(defcustom python-shell-extra-pythonpaths nil
|
|
|
|
|
"List of extra pythonpaths for Python shell.
|
2015-08-21 19:06:57 -03:00
|
|
|
|
When this variable is non-nil, values added at the beginning of
|
|
|
|
|
the PYTHONPATH before starting processes. Any values present
|
|
|
|
|
here that already exists in PYTHONPATH are moved to the beginning
|
|
|
|
|
of the list so that they are prioritized when looking for
|
|
|
|
|
modules."
|
2012-05-17 00:03:27 -03:00
|
|
|
|
:type '(repeat string)
|
2015-08-21 19:06:57 -03:00
|
|
|
|
:group 'python)
|
2012-05-17 00:03:27 -03:00
|
|
|
|
|
2012-05-17 00:03:10 -03:00
|
|
|
|
(defcustom python-shell-exec-path nil
|
2015-08-21 19:06:57 -03:00
|
|
|
|
"List of paths for searching executables.
|
|
|
|
|
When this variable is non-nil, values added at the beginning of
|
|
|
|
|
the PATH before starting processes. Any values present here that
|
|
|
|
|
already exists in PATH are moved to the beginning of the list so
|
|
|
|
|
that they are prioritized when looking for executables."
|
2012-05-17 00:03:10 -03:00
|
|
|
|
:type '(repeat string)
|
2015-08-21 19:06:57 -03:00
|
|
|
|
:group 'python)
|
|
|
|
|
|
|
|
|
|
(defcustom python-shell-remote-exec-path nil
|
|
|
|
|
"List of paths to be ensured remotely for searching executables.
|
|
|
|
|
When this variable is non-nil, values are exported into remote
|
|
|
|
|
hosts PATH before starting processes. Values defined in
|
|
|
|
|
`python-shell-exec-path' will take precedence to paths defined
|
|
|
|
|
here. Normally you wont use this variable directly unless you
|
|
|
|
|
plan to ensure a particular set of paths to all Python shell
|
|
|
|
|
executed through tramp connections."
|
2016-01-12 20:06:49 -05:00
|
|
|
|
:version "25.1"
|
2015-08-21 19:06:57 -03:00
|
|
|
|
:type '(repeat string)
|
|
|
|
|
:group 'python)
|
2012-05-17 00:03:10 -03:00
|
|
|
|
|
2017-12-20 16:05:46 -05:00
|
|
|
|
(define-obsolete-variable-alias
|
|
|
|
|
'python-shell-virtualenv-path 'python-shell-virtualenv-root "25.1")
|
|
|
|
|
|
2014-11-14 03:26:08 -03:00
|
|
|
|
(defcustom python-shell-virtualenv-root nil
|
2012-05-17 00:03:21 -03:00
|
|
|
|
"Path to virtualenv root.
|
2015-08-21 19:06:57 -03:00
|
|
|
|
This variable, when set to a string, makes the environment to be
|
|
|
|
|
modified such that shells are started within the specified
|
2012-05-17 00:03:21 -03:00
|
|
|
|
virtualenv."
|
2013-05-08 21:40:20 -04:00
|
|
|
|
:type '(choice (const nil) string)
|
2015-08-21 19:06:57 -03:00
|
|
|
|
:group 'python)
|
2012-05-17 00:03:21 -03:00
|
|
|
|
|
2015-08-22 20:42:04 -03:00
|
|
|
|
(defcustom python-shell-setup-codes nil
|
2012-05-17 00:03:29 -03:00
|
|
|
|
"List of code run by `python-shell-send-setup-codes'."
|
2012-05-17 00:03:09 -03:00
|
|
|
|
:type '(repeat symbol)
|
2015-08-21 19:06:57 -03:00
|
|
|
|
:group 'python)
|
2012-05-17 00:03:09 -03:00
|
|
|
|
|
2012-05-17 00:02:52 -03:00
|
|
|
|
(defcustom python-shell-compilation-regexp-alist
|
|
|
|
|
`((,(rx line-start (1+ (any " \t")) "File \""
|
2012-05-17 00:03:35 -03:00
|
|
|
|
(group (1+ (not (any "\"<")))) ; avoid `<stdin>' &c
|
|
|
|
|
"\", line " (group (1+ digit)))
|
2012-05-17 00:02:52 -03:00
|
|
|
|
1 2)
|
|
|
|
|
(,(rx " in file " (group (1+ not-newline)) " on line "
|
2012-05-17 00:03:35 -03:00
|
|
|
|
(group (1+ digit)))
|
2012-05-17 00:02:52 -03:00
|
|
|
|
1 2)
|
|
|
|
|
(,(rx line-start "> " (group (1+ (not (any "(\"<"))))
|
2012-05-17 00:03:35 -03:00
|
|
|
|
"(" (group (1+ digit)) ")" (1+ (not (any "("))) "()")
|
2012-05-17 00:02:52 -03:00
|
|
|
|
1 2))
|
|
|
|
|
"`compilation-error-regexp-alist' for inferior Python."
|
|
|
|
|
:type '(alist string)
|
|
|
|
|
:group 'python)
|
|
|
|
|
|
2015-08-21 19:06:57 -03:00
|
|
|
|
(defmacro python-shell--add-to-path-with-priority (pathvar paths)
|
|
|
|
|
"Modify PATHVAR and ensure PATHS are added only once at beginning."
|
|
|
|
|
`(dolist (path (reverse ,paths))
|
|
|
|
|
(cl-delete path ,pathvar :test #'string=)
|
|
|
|
|
(cl-pushnew path ,pathvar :test #'string=)))
|
|
|
|
|
|
|
|
|
|
(defun python-shell-calculate-pythonpath ()
|
|
|
|
|
"Calculate the PYTHONPATH using `python-shell-extra-pythonpaths'."
|
|
|
|
|
(let ((pythonpath
|
2016-01-15 11:53:05 -05:00
|
|
|
|
(split-string
|
|
|
|
|
(or (getenv "PYTHONPATH") "") path-separator 'omit)))
|
2015-08-21 19:06:57 -03:00
|
|
|
|
(python-shell--add-to-path-with-priority
|
|
|
|
|
pythonpath python-shell-extra-pythonpaths)
|
|
|
|
|
(mapconcat 'identity pythonpath path-separator)))
|
|
|
|
|
|
2015-07-06 07:57:14 -03:00
|
|
|
|
(defun python-shell-calculate-process-environment ()
|
|
|
|
|
"Calculate `process-environment' or `tramp-remote-process-environment'.
|
2015-08-21 19:06:57 -03:00
|
|
|
|
Prepends `python-shell-process-environment', sets extra
|
2015-07-06 07:57:14 -03:00
|
|
|
|
pythonpaths from `python-shell-extra-pythonpaths' and sets a few
|
|
|
|
|
virtualenv related vars. If `default-directory' points to a
|
2015-08-21 19:06:57 -03:00
|
|
|
|
remote host, the returned value is intended for
|
2015-07-06 07:57:14 -03:00
|
|
|
|
`tramp-remote-process-environment'."
|
|
|
|
|
(let* ((remote-p (file-remote-p default-directory))
|
2015-08-21 19:06:57 -03:00
|
|
|
|
(process-environment (if remote-p
|
|
|
|
|
tramp-remote-process-environment
|
|
|
|
|
process-environment))
|
|
|
|
|
(virtualenv (when python-shell-virtualenv-root
|
|
|
|
|
(directory-file-name python-shell-virtualenv-root))))
|
|
|
|
|
(dolist (env python-shell-process-environment)
|
|
|
|
|
(pcase-let ((`(,key ,value) (split-string env "=")))
|
|
|
|
|
(setenv key value)))
|
2015-07-06 07:57:14 -03:00
|
|
|
|
(when python-shell-unbuffered
|
|
|
|
|
(setenv "PYTHONUNBUFFERED" "1"))
|
|
|
|
|
(when python-shell-extra-pythonpaths
|
|
|
|
|
(setenv "PYTHONPATH" (python-shell-calculate-pythonpath)))
|
|
|
|
|
(if (not virtualenv)
|
|
|
|
|
process-environment
|
|
|
|
|
(setenv "PYTHONHOME" nil)
|
|
|
|
|
(setenv "VIRTUAL_ENV" virtualenv))
|
|
|
|
|
process-environment))
|
|
|
|
|
|
|
|
|
|
(defun python-shell-calculate-exec-path ()
|
2015-08-21 19:06:57 -03:00
|
|
|
|
"Calculate `exec-path'.
|
|
|
|
|
Prepends `python-shell-exec-path' and adds the binary directory
|
2016-12-11 19:39:56 -05:00
|
|
|
|
for virtualenv if `python-shell-virtualenv-root' is set - this
|
|
|
|
|
will use the python interpreter from inside the virtualenv when
|
|
|
|
|
starting the shell. If `default-directory' points to a remote host,
|
|
|
|
|
the returned value appends `python-shell-remote-exec-path' instead
|
|
|
|
|
of `exec-path'."
|
2015-08-21 19:06:57 -03:00
|
|
|
|
(let ((new-path (copy-sequence
|
|
|
|
|
(if (file-remote-p default-directory)
|
|
|
|
|
python-shell-remote-exec-path
|
2016-12-11 19:39:56 -05:00
|
|
|
|
exec-path)))
|
|
|
|
|
|
|
|
|
|
;; Windows and POSIX systems use different venv directory structures
|
|
|
|
|
(virtualenv-bin-dir (if (eq system-type 'windows-nt) "Scripts" "bin")))
|
2015-08-21 19:06:57 -03:00
|
|
|
|
(python-shell--add-to-path-with-priority
|
|
|
|
|
new-path python-shell-exec-path)
|
2015-07-06 07:57:14 -03:00
|
|
|
|
(if (not python-shell-virtualenv-root)
|
2015-08-21 19:06:57 -03:00
|
|
|
|
new-path
|
|
|
|
|
(python-shell--add-to-path-with-priority
|
|
|
|
|
new-path
|
2016-12-11 19:39:56 -05:00
|
|
|
|
(list (expand-file-name virtualenv-bin-dir python-shell-virtualenv-root)))
|
2015-08-21 19:06:57 -03:00
|
|
|
|
new-path)))
|
|
|
|
|
|
|
|
|
|
(defun python-shell-tramp-refresh-remote-path (vec paths)
|
|
|
|
|
"Update VEC's remote-path giving PATHS priority."
|
|
|
|
|
(let ((remote-path (tramp-get-connection-property vec "remote-path" nil)))
|
|
|
|
|
(when remote-path
|
|
|
|
|
(python-shell--add-to-path-with-priority remote-path paths)
|
|
|
|
|
(tramp-set-connection-property vec "remote-path" remote-path)
|
|
|
|
|
(tramp-set-remote-path vec))))
|
|
|
|
|
|
2015-08-21 22:34:39 -03:00
|
|
|
|
(defun python-shell-tramp-refresh-process-environment (vec env)
|
|
|
|
|
"Update VEC's process environment with ENV."
|
|
|
|
|
;; Stolen from `tramp-open-connection-setup-interactive-shell'.
|
2018-02-27 19:44:35 -05:00
|
|
|
|
(let ((env (append (when (fboundp 'tramp-get-remote-locale)
|
2015-08-21 23:26:44 -03:00
|
|
|
|
;; Emacs<24.4 compat.
|
|
|
|
|
(list (tramp-get-remote-locale vec)))
|
2015-08-21 22:34:39 -03:00
|
|
|
|
(copy-sequence env)))
|
2015-08-21 23:42:01 -03:00
|
|
|
|
(tramp-end-of-heredoc
|
|
|
|
|
(if (boundp 'tramp-end-of-heredoc)
|
|
|
|
|
tramp-end-of-heredoc
|
|
|
|
|
(md5 tramp-end-of-output)))
|
2015-08-21 22:34:39 -03:00
|
|
|
|
unset vars item)
|
|
|
|
|
(while env
|
2016-01-15 11:53:05 -05:00
|
|
|
|
(setq item (split-string (car env) "=" 'omit))
|
2015-08-21 22:34:39 -03:00
|
|
|
|
(setcdr item (mapconcat 'identity (cdr item) "="))
|
|
|
|
|
(if (and (stringp (cdr item)) (not (string-equal (cdr item) "")))
|
|
|
|
|
(push (format "%s %s" (car item) (cdr item)) vars)
|
|
|
|
|
(push (car item) unset))
|
|
|
|
|
(setq env (cdr env)))
|
|
|
|
|
(when vars
|
|
|
|
|
(tramp-send-command
|
|
|
|
|
vec
|
|
|
|
|
(format "while read var val; do export $var=$val; done <<'%s'\n%s\n%s"
|
|
|
|
|
tramp-end-of-heredoc
|
|
|
|
|
(mapconcat 'identity vars "\n")
|
|
|
|
|
tramp-end-of-heredoc)
|
|
|
|
|
t))
|
|
|
|
|
(when unset
|
|
|
|
|
(tramp-send-command
|
|
|
|
|
vec (format "unset %s" (mapconcat 'identity unset " ")) t))))
|
2015-07-06 07:57:14 -03:00
|
|
|
|
|
|
|
|
|
(defmacro python-shell-with-environment (&rest body)
|
|
|
|
|
"Modify shell environment during execution of BODY.
|
|
|
|
|
Temporarily sets `process-environment' and `exec-path' during
|
|
|
|
|
execution of body. If `default-directory' points to a remote
|
|
|
|
|
machine then modifies `tramp-remote-process-environment' and
|
2015-08-21 19:06:57 -03:00
|
|
|
|
`python-shell-remote-exec-path' instead."
|
2015-07-06 07:57:14 -03:00
|
|
|
|
(declare (indent 0) (debug (body)))
|
2015-08-21 19:06:57 -03:00
|
|
|
|
(let ((vec (make-symbol "vec")))
|
|
|
|
|
`(progn
|
2015-08-21 22:34:39 -03:00
|
|
|
|
(let* ((,vec
|
|
|
|
|
(when (file-remote-p default-directory)
|
|
|
|
|
(ignore-errors
|
|
|
|
|
(tramp-dissect-file-name default-directory 'noexpand))))
|
|
|
|
|
(process-environment
|
|
|
|
|
(if ,vec
|
|
|
|
|
process-environment
|
|
|
|
|
(python-shell-calculate-process-environment)))
|
|
|
|
|
(exec-path
|
|
|
|
|
(if ,vec
|
|
|
|
|
exec-path
|
|
|
|
|
(python-shell-calculate-exec-path)))
|
|
|
|
|
(tramp-remote-process-environment
|
|
|
|
|
(if ,vec
|
|
|
|
|
(python-shell-calculate-process-environment)
|
|
|
|
|
tramp-remote-process-environment)))
|
|
|
|
|
(when (tramp-get-connection-process ,vec)
|
|
|
|
|
;; For already existing connections, the new exec path must
|
|
|
|
|
;; be re-set, otherwise it won't take effect. One example
|
|
|
|
|
;; of such case is when remote dir-locals are read and
|
|
|
|
|
;; *then* subprocesses are triggered within the same
|
|
|
|
|
;; connection.
|
|
|
|
|
(python-shell-tramp-refresh-remote-path
|
|
|
|
|
,vec (python-shell-calculate-exec-path))
|
|
|
|
|
;; The `tramp-remote-process-environment' variable is only
|
|
|
|
|
;; effective when the started process is an interactive
|
|
|
|
|
;; shell, otherwise (like in the case of processes started
|
|
|
|
|
;; with `process-file') the environment is not changed.
|
|
|
|
|
;; This makes environment modifications effective
|
2015-08-25 00:42:17 -07:00
|
|
|
|
;; unconditionally.
|
2015-08-21 22:34:39 -03:00
|
|
|
|
(python-shell-tramp-refresh-process-environment
|
|
|
|
|
,vec tramp-remote-process-environment))
|
|
|
|
|
,(macroexp-progn body)))))
|
2015-07-06 07:57:14 -03:00
|
|
|
|
|
2014-07-19 10:13:07 -03:00
|
|
|
|
(defvar python-shell--prompt-calculated-input-regexp nil
|
|
|
|
|
"Calculated input prompt regexp for inferior python shell.
|
|
|
|
|
Do not set this variable directly, instead use
|
|
|
|
|
`python-shell-prompt-set-calculated-regexps'.")
|
|
|
|
|
|
2017-08-19 11:45:07 -04:00
|
|
|
|
(defvar python-shell--block-prompt nil
|
|
|
|
|
"Input block prompt for inferior python shell.
|
|
|
|
|
Do not set this variable directly, instead use
|
|
|
|
|
`python-shell-prompt-set-calculated-regexps'.")
|
|
|
|
|
|
2014-07-19 10:13:07 -03:00
|
|
|
|
(defvar python-shell--prompt-calculated-output-regexp nil
|
|
|
|
|
"Calculated output prompt regexp for inferior python shell.
|
|
|
|
|
Do not set this variable directly, instead use
|
2019-07-05 21:34:16 -04:00
|
|
|
|
`python-shell-prompt-set-calculated-regexps'.")
|
2014-07-19 10:13:07 -03:00
|
|
|
|
|
|
|
|
|
(defun python-shell-prompt-detect ()
|
|
|
|
|
"Detect prompts for the current `python-shell-interpreter'.
|
|
|
|
|
When prompts can be retrieved successfully from the
|
|
|
|
|
`python-shell-interpreter' run with
|
|
|
|
|
`python-shell-interpreter-interactive-arg', returns a list of
|
|
|
|
|
three elements, where the first two are input prompts and the
|
|
|
|
|
last one is an output prompt. When no prompts can be detected
|
|
|
|
|
and `python-shell-prompt-detect-failure-warning' is non-nil,
|
|
|
|
|
shows a warning with instructions to avoid hangs and returns nil.
|
|
|
|
|
When `python-shell-prompt-detect-enabled' is nil avoids any
|
|
|
|
|
detection and just returns nil."
|
|
|
|
|
(when python-shell-prompt-detect-enabled
|
2015-07-06 07:57:14 -03:00
|
|
|
|
(python-shell-with-environment
|
|
|
|
|
(let* ((code (concat
|
|
|
|
|
"import sys\n"
|
|
|
|
|
"ps = [getattr(sys, 'ps%s' % i, '') for i in range(1,4)]\n"
|
|
|
|
|
;; JSON is built manually for compatibility
|
|
|
|
|
"ps_json = '\\n[\"%s\", \"%s\", \"%s\"]\\n' % tuple(ps)\n"
|
|
|
|
|
"print (ps_json)\n"
|
|
|
|
|
"sys.exit(0)\n"))
|
2015-08-23 13:58:17 -03:00
|
|
|
|
(interpreter python-shell-interpreter)
|
|
|
|
|
(interpreter-arg python-shell-interpreter-interactive-arg)
|
2015-07-06 07:57:14 -03:00
|
|
|
|
(output
|
|
|
|
|
(with-temp-buffer
|
|
|
|
|
;; TODO: improve error handling by using
|
|
|
|
|
;; `condition-case' and displaying the error message to
|
|
|
|
|
;; the user in the no-prompts warning.
|
|
|
|
|
(ignore-errors
|
2017-08-15 17:49:10 -04:00
|
|
|
|
(let ((code-file
|
|
|
|
|
;; Python 2.x on Windows does not handle
|
|
|
|
|
;; carriage returns in unbuffered mode.
|
|
|
|
|
(let ((inhibit-eol-conversion (getenv "PYTHONUNBUFFERED")))
|
|
|
|
|
(python-shell--save-temp-file code))))
|
2019-04-14 18:45:35 -04:00
|
|
|
|
(unwind-protect
|
|
|
|
|
;; Use `process-file' as it is remote-host friendly.
|
|
|
|
|
(process-file
|
|
|
|
|
interpreter
|
|
|
|
|
code-file
|
|
|
|
|
'(t nil)
|
|
|
|
|
nil
|
|
|
|
|
interpreter-arg)
|
|
|
|
|
;; Try to cleanup
|
|
|
|
|
(delete-file code-file))))
|
2015-07-06 07:57:14 -03:00
|
|
|
|
(buffer-string)))
|
|
|
|
|
(prompts
|
|
|
|
|
(catch 'prompts
|
|
|
|
|
(dolist (line (split-string output "\n" t))
|
|
|
|
|
(let ((res
|
|
|
|
|
;; Check if current line is a valid JSON array
|
|
|
|
|
(and (string= (substring line 0 2) "[\"")
|
|
|
|
|
(ignore-errors
|
|
|
|
|
;; Return prompts as a list, not vector
|
|
|
|
|
(append (json-read-from-string line) nil)))))
|
|
|
|
|
;; The list must contain 3 strings, where the first
|
|
|
|
|
;; is the input prompt, the second is the block
|
|
|
|
|
;; prompt and the last one is the output prompt. The
|
|
|
|
|
;; input prompt is the only one that can't be empty.
|
|
|
|
|
(when (and (= (length res) 3)
|
|
|
|
|
(cl-every #'stringp res)
|
|
|
|
|
(not (string= (car res) "")))
|
|
|
|
|
(throw 'prompts res))))
|
|
|
|
|
nil)))
|
|
|
|
|
(when (and (not prompts)
|
|
|
|
|
python-shell-prompt-detect-failure-warning)
|
|
|
|
|
(lwarn
|
|
|
|
|
'(python python-shell-prompt-regexp)
|
|
|
|
|
:warning
|
|
|
|
|
(concat
|
|
|
|
|
"Python shell prompts cannot be detected.\n"
|
|
|
|
|
"If your emacs session hangs when starting python shells\n"
|
|
|
|
|
"recover with `keyboard-quit' and then try fixing the\n"
|
|
|
|
|
"interactive flag for your interpreter by adjusting the\n"
|
|
|
|
|
"`python-shell-interpreter-interactive-arg' or add regexps\n"
|
|
|
|
|
"matching shell prompts in the directory-local friendly vars:\n"
|
|
|
|
|
" + `python-shell-prompt-regexp'\n"
|
|
|
|
|
" + `python-shell-prompt-block-regexp'\n"
|
|
|
|
|
" + `python-shell-prompt-output-regexp'\n"
|
|
|
|
|
"Or alternatively in:\n"
|
|
|
|
|
" + `python-shell-prompt-input-regexps'\n"
|
|
|
|
|
" + `python-shell-prompt-output-regexps'")))
|
|
|
|
|
prompts))))
|
2014-07-19 10:13:07 -03:00
|
|
|
|
|
|
|
|
|
(defun python-shell-prompt-validate-regexps ()
|
|
|
|
|
"Validate all user provided regexps for prompts.
|
|
|
|
|
Signals `user-error' if any of these vars contain invalid
|
|
|
|
|
regexps: `python-shell-prompt-regexp',
|
|
|
|
|
`python-shell-prompt-block-regexp',
|
|
|
|
|
`python-shell-prompt-pdb-regexp',
|
|
|
|
|
`python-shell-prompt-output-regexp',
|
|
|
|
|
`python-shell-prompt-input-regexps',
|
|
|
|
|
`python-shell-prompt-output-regexps'."
|
|
|
|
|
(dolist (symbol (list 'python-shell-prompt-input-regexps
|
|
|
|
|
'python-shell-prompt-output-regexps
|
|
|
|
|
'python-shell-prompt-regexp
|
|
|
|
|
'python-shell-prompt-block-regexp
|
|
|
|
|
'python-shell-prompt-pdb-regexp
|
|
|
|
|
'python-shell-prompt-output-regexp))
|
|
|
|
|
(dolist (regexp (let ((regexps (symbol-value symbol)))
|
|
|
|
|
(if (listp regexps)
|
|
|
|
|
regexps
|
|
|
|
|
(list regexps))))
|
|
|
|
|
(when (not (python-util-valid-regexp-p regexp))
|
|
|
|
|
(user-error "Invalid regexp %s in `%s'"
|
|
|
|
|
regexp symbol)))))
|
|
|
|
|
|
|
|
|
|
(defun python-shell-prompt-set-calculated-regexps ()
|
|
|
|
|
"Detect and set input and output prompt regexps.
|
|
|
|
|
Build and set the values for `python-shell-input-prompt-regexp'
|
|
|
|
|
and `python-shell-output-prompt-regexp' using the values from
|
|
|
|
|
`python-shell-prompt-regexp', `python-shell-prompt-block-regexp',
|
|
|
|
|
`python-shell-prompt-pdb-regexp',
|
|
|
|
|
`python-shell-prompt-output-regexp',
|
|
|
|
|
`python-shell-prompt-input-regexps',
|
|
|
|
|
`python-shell-prompt-output-regexps' and detected prompts from
|
|
|
|
|
`python-shell-prompt-detect'."
|
|
|
|
|
(when (not (and python-shell--prompt-calculated-input-regexp
|
|
|
|
|
python-shell--prompt-calculated-output-regexp))
|
|
|
|
|
(let* ((detected-prompts (python-shell-prompt-detect))
|
|
|
|
|
(input-prompts nil)
|
|
|
|
|
(output-prompts nil)
|
|
|
|
|
(build-regexp
|
|
|
|
|
(lambda (prompts)
|
|
|
|
|
(concat "^\\("
|
|
|
|
|
(mapconcat #'identity
|
|
|
|
|
(sort prompts
|
|
|
|
|
(lambda (a b)
|
|
|
|
|
(let ((length-a (length a))
|
|
|
|
|
(length-b (length b)))
|
|
|
|
|
(if (= length-a length-b)
|
|
|
|
|
(string< a b)
|
|
|
|
|
(> (length a) (length b))))))
|
|
|
|
|
"\\|")
|
|
|
|
|
"\\)"))))
|
|
|
|
|
;; Validate ALL regexps
|
|
|
|
|
(python-shell-prompt-validate-regexps)
|
|
|
|
|
;; Collect all user defined input prompts
|
|
|
|
|
(dolist (prompt (append python-shell-prompt-input-regexps
|
|
|
|
|
(list python-shell-prompt-regexp
|
|
|
|
|
python-shell-prompt-block-regexp
|
|
|
|
|
python-shell-prompt-pdb-regexp)))
|
|
|
|
|
(cl-pushnew prompt input-prompts :test #'string=))
|
|
|
|
|
;; Collect all user defined output prompts
|
|
|
|
|
(dolist (prompt (cons python-shell-prompt-output-regexp
|
|
|
|
|
python-shell-prompt-output-regexps))
|
|
|
|
|
(cl-pushnew prompt output-prompts :test #'string=))
|
|
|
|
|
;; Collect detected prompts if any
|
|
|
|
|
(when detected-prompts
|
|
|
|
|
(dolist (prompt (butlast detected-prompts))
|
|
|
|
|
(setq prompt (regexp-quote prompt))
|
|
|
|
|
(cl-pushnew prompt input-prompts :test #'string=))
|
2017-08-19 11:45:07 -04:00
|
|
|
|
(setq python-shell--block-prompt (nth 1 detected-prompts))
|
2014-07-19 10:13:07 -03:00
|
|
|
|
(cl-pushnew (regexp-quote
|
|
|
|
|
(car (last detected-prompts)))
|
|
|
|
|
output-prompts :test #'string=))
|
|
|
|
|
;; Set input and output prompt regexps from collected prompts
|
|
|
|
|
(setq python-shell--prompt-calculated-input-regexp
|
|
|
|
|
(funcall build-regexp input-prompts)
|
|
|
|
|
python-shell--prompt-calculated-output-regexp
|
|
|
|
|
(funcall build-regexp output-prompts)))))
|
|
|
|
|
|
2012-05-17 00:02:52 -03:00
|
|
|
|
(defun python-shell-get-process-name (dedicated)
|
2012-05-17 00:03:33 -03:00
|
|
|
|
"Calculate the appropriate process name for inferior Python process.
|
2014-12-26 17:59:33 -03:00
|
|
|
|
If DEDICATED is t returns a string with the form
|
|
|
|
|
`python-shell-buffer-name'[`buffer-name'] else returns the value
|
|
|
|
|
of `python-shell-buffer-name'."
|
|
|
|
|
(if dedicated
|
|
|
|
|
(format "%s[%s]" python-shell-buffer-name (buffer-name))
|
|
|
|
|
python-shell-buffer-name))
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
2012-05-17 00:03:21 -03:00
|
|
|
|
(defun python-shell-internal-get-process-name ()
|
2012-05-17 00:03:33 -03:00
|
|
|
|
"Calculate the appropriate process name for Internal Python process.
|
2012-05-17 00:03:21 -03:00
|
|
|
|
The name is calculated from `python-shell-global-buffer-name' and
|
2014-12-26 17:59:33 -03:00
|
|
|
|
the `buffer-name'."
|
|
|
|
|
(format "%s[%s]" python-shell-internal-buffer-name (buffer-name)))
|
2012-05-17 00:03:21 -03:00
|
|
|
|
|
2014-11-16 10:47:14 -03:00
|
|
|
|
(defun python-shell-calculate-command ()
|
2012-05-17 00:03:09 -03:00
|
|
|
|
"Calculate the string used to execute the inferior Python process."
|
2015-08-21 19:06:57 -03:00
|
|
|
|
(format "%s %s"
|
2016-12-09 00:14:48 -05:00
|
|
|
|
;; `python-shell-make-comint' expects to be able to
|
|
|
|
|
;; `split-string-and-unquote' the result of this function.
|
|
|
|
|
(combine-and-quote-strings (list python-shell-interpreter))
|
2015-08-21 19:06:57 -03:00
|
|
|
|
python-shell-interpreter-args))
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
2014-11-16 10:47:14 -03:00
|
|
|
|
(define-obsolete-function-alias
|
|
|
|
|
'python-shell-parse-command
|
|
|
|
|
#'python-shell-calculate-command "25.1")
|
|
|
|
|
|
2014-07-27 03:39:17 -03:00
|
|
|
|
(defvar python-shell--package-depth 10)
|
|
|
|
|
|
|
|
|
|
(defun python-shell-package-enable (directory package)
|
|
|
|
|
"Add DIRECTORY parent to $PYTHONPATH and enable PACKAGE."
|
|
|
|
|
(interactive
|
|
|
|
|
(let* ((dir (expand-file-name
|
|
|
|
|
(read-directory-name
|
|
|
|
|
"Package root: "
|
|
|
|
|
(file-name-directory
|
|
|
|
|
(or (buffer-file-name) default-directory)))))
|
|
|
|
|
(name (completing-read
|
|
|
|
|
"Package: "
|
|
|
|
|
(python-util-list-packages
|
|
|
|
|
dir python-shell--package-depth))))
|
|
|
|
|
(list dir name)))
|
|
|
|
|
(python-shell-send-string
|
|
|
|
|
(format
|
|
|
|
|
(concat
|
|
|
|
|
"import os.path;import sys;"
|
|
|
|
|
"sys.path.append(os.path.dirname(os.path.dirname('''%s''')));"
|
|
|
|
|
"__package__ = '''%s''';"
|
|
|
|
|
"import %s")
|
|
|
|
|
directory package package)
|
|
|
|
|
(python-shell-get-process)))
|
|
|
|
|
|
2014-07-31 21:18:19 -03:00
|
|
|
|
(defun python-shell-accept-process-output (process &optional timeout regexp)
|
|
|
|
|
"Accept PROCESS output with TIMEOUT until REGEXP is found.
|
|
|
|
|
Optional argument TIMEOUT is the timeout argument to
|
|
|
|
|
`accept-process-output' calls. Optional argument REGEXP
|
|
|
|
|
overrides the regexp to match the end of output, defaults to
|
2017-12-17 17:09:55 +01:00
|
|
|
|
`comint-prompt-regexp'. Returns non-nil when output was
|
2014-07-31 21:18:19 -03:00
|
|
|
|
properly captured.
|
|
|
|
|
|
|
|
|
|
This utility is useful in situations where the output may be
|
|
|
|
|
received in chunks, since `accept-process-output' gives no
|
|
|
|
|
guarantees they will be grabbed in a single call. An example use
|
|
|
|
|
case for this would be the CPython shell start-up, where the
|
2014-09-11 12:44:25 -07:00
|
|
|
|
banner and the initial prompt are received separately."
|
2014-07-31 21:18:19 -03:00
|
|
|
|
(let ((regexp (or regexp comint-prompt-regexp)))
|
|
|
|
|
(catch 'found
|
|
|
|
|
(while t
|
|
|
|
|
(when (not (accept-process-output process timeout))
|
|
|
|
|
(throw 'found nil))
|
2015-05-11 00:03:08 -03:00
|
|
|
|
(when (looking-back
|
|
|
|
|
regexp (car (python-util-comint-last-prompt)))
|
2014-07-31 21:18:19 -03:00
|
|
|
|
(throw 'found t))))))
|
|
|
|
|
|
2014-07-26 20:43:51 -03:00
|
|
|
|
(defun python-shell-comint-end-of-output-p (output)
|
2017-12-17 17:09:55 +01:00
|
|
|
|
"Return non-nil if OUTPUT ends with input prompt."
|
2014-07-26 20:43:51 -03:00
|
|
|
|
(string-match
|
2016-11-06 00:33:43 -07:00
|
|
|
|
;; XXX: It seems on macOS an extra carriage return is attached
|
2014-07-26 20:43:51 -03:00
|
|
|
|
;; at the end of output, this handles that too.
|
|
|
|
|
(concat
|
|
|
|
|
"\r?\n?"
|
|
|
|
|
;; Remove initial caret from calculated regexp
|
|
|
|
|
(replace-regexp-in-string
|
|
|
|
|
(rx string-start ?^) ""
|
|
|
|
|
python-shell--prompt-calculated-input-regexp)
|
|
|
|
|
(rx eos))
|
|
|
|
|
output))
|
|
|
|
|
|
2014-07-26 23:02:38 -03:00
|
|
|
|
(define-obsolete-function-alias
|
|
|
|
|
'python-comint-output-filter-function
|
|
|
|
|
'ansi-color-filter-apply
|
2014-09-29 14:14:08 -04:00
|
|
|
|
"25.1")
|
2014-07-26 23:02:38 -03:00
|
|
|
|
|
|
|
|
|
(defun python-comint-postoutput-scroll-to-bottom (output)
|
|
|
|
|
"Faster version of `comint-postoutput-scroll-to-bottom'.
|
|
|
|
|
Avoids `recenter' calls until OUTPUT is completely sent."
|
|
|
|
|
(when (and (not (string= "" output))
|
|
|
|
|
(python-shell-comint-end-of-output-p
|
|
|
|
|
(ansi-color-filter-apply output)))
|
|
|
|
|
(comint-postoutput-scroll-to-bottom output))
|
|
|
|
|
output)
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
2012-10-07 16:37:37 -03:00
|
|
|
|
(defvar python-shell--parent-buffer nil)
|
|
|
|
|
|
2014-07-28 00:35:37 -03:00
|
|
|
|
(defmacro python-shell-with-shell-buffer (&rest body)
|
|
|
|
|
"Execute the forms in BODY with the shell buffer temporarily current.
|
|
|
|
|
Signals an error if no shell buffer is available for current buffer."
|
|
|
|
|
(declare (indent 0) (debug t))
|
2014-12-27 20:12:00 -03:00
|
|
|
|
(let ((shell-process (make-symbol "shell-process")))
|
|
|
|
|
`(let ((,shell-process (python-shell-get-process-or-error)))
|
|
|
|
|
(with-current-buffer (process-buffer ,shell-process)
|
2014-07-28 00:35:37 -03:00
|
|
|
|
,@body))))
|
|
|
|
|
|
2014-07-26 20:43:51 -03:00
|
|
|
|
(defvar python-shell--font-lock-buffer nil)
|
|
|
|
|
|
|
|
|
|
(defun python-shell-font-lock-get-or-create-buffer ()
|
|
|
|
|
"Get or create a font-lock buffer for current inferior process."
|
2014-07-28 00:35:37 -03:00
|
|
|
|
(python-shell-with-shell-buffer
|
|
|
|
|
(if python-shell--font-lock-buffer
|
|
|
|
|
python-shell--font-lock-buffer
|
|
|
|
|
(let ((process-name
|
|
|
|
|
(process-name (get-buffer-process (current-buffer)))))
|
|
|
|
|
(generate-new-buffer
|
2015-02-09 23:44:06 -03:00
|
|
|
|
(format " *%s-font-lock*" process-name))))))
|
2014-07-26 20:43:51 -03:00
|
|
|
|
|
|
|
|
|
(defun python-shell-font-lock-kill-buffer ()
|
|
|
|
|
"Kill the font-lock buffer safely."
|
2015-02-12 00:41:07 -03:00
|
|
|
|
(when (and python-shell--font-lock-buffer
|
|
|
|
|
(buffer-live-p python-shell--font-lock-buffer))
|
|
|
|
|
(kill-buffer python-shell--font-lock-buffer)
|
|
|
|
|
(when (derived-mode-p 'inferior-python-mode)
|
|
|
|
|
(setq python-shell--font-lock-buffer nil))))
|
2014-07-26 20:43:51 -03:00
|
|
|
|
|
|
|
|
|
(defmacro python-shell-font-lock-with-font-lock-buffer (&rest body)
|
|
|
|
|
"Execute the forms in BODY in the font-lock buffer.
|
|
|
|
|
The value returned is the value of the last form in BODY. See
|
|
|
|
|
also `with-current-buffer'."
|
|
|
|
|
(declare (indent 0) (debug t))
|
2014-07-28 00:35:37 -03:00
|
|
|
|
`(python-shell-with-shell-buffer
|
|
|
|
|
(save-current-buffer
|
|
|
|
|
(when (not (and python-shell--font-lock-buffer
|
|
|
|
|
(get-buffer python-shell--font-lock-buffer)))
|
|
|
|
|
(setq python-shell--font-lock-buffer
|
|
|
|
|
(python-shell-font-lock-get-or-create-buffer)))
|
|
|
|
|
(set-buffer python-shell--font-lock-buffer)
|
2015-02-09 23:44:06 -03:00
|
|
|
|
(when (not font-lock-mode)
|
|
|
|
|
(font-lock-mode 1))
|
2014-07-28 00:35:37 -03:00
|
|
|
|
(set (make-local-variable 'delay-mode-hooks) t)
|
|
|
|
|
(let ((python-indent-guess-indent-offset nil))
|
2014-11-01 12:33:02 -06:00
|
|
|
|
(when (not (derived-mode-p 'python-mode))
|
2014-07-28 00:35:37 -03:00
|
|
|
|
(python-mode))
|
|
|
|
|
,@body))))
|
2014-07-26 20:43:51 -03:00
|
|
|
|
|
|
|
|
|
(defun python-shell-font-lock-cleanup-buffer ()
|
|
|
|
|
"Cleanup the font-lock buffer.
|
|
|
|
|
Provided as a command because this might be handy if something
|
|
|
|
|
goes wrong and syntax highlighting in the shell gets messed up."
|
|
|
|
|
(interactive)
|
2014-07-28 00:35:37 -03:00
|
|
|
|
(python-shell-with-shell-buffer
|
|
|
|
|
(python-shell-font-lock-with-font-lock-buffer
|
2015-02-08 00:25:20 -03:00
|
|
|
|
(erase-buffer))))
|
2014-07-26 20:43:51 -03:00
|
|
|
|
|
|
|
|
|
(defun python-shell-font-lock-comint-output-filter-function (output)
|
|
|
|
|
"Clean up the font-lock buffer after any OUTPUT."
|
2019-10-14 21:37:20 -03:00
|
|
|
|
(unless (string= output "") ;; See Bug#33959.
|
|
|
|
|
(if (let ((output (ansi-color-filter-apply output)))
|
|
|
|
|
(and (python-shell-comint-end-of-output-p output)
|
|
|
|
|
;; Assume "..." represents a continuation prompt.
|
|
|
|
|
(not (string-match "\\.\\.\\." output))))
|
|
|
|
|
;; If output ends with an initial (not continuation) input prompt
|
|
|
|
|
;; then the font-lock buffer must be cleaned up.
|
|
|
|
|
(python-shell-font-lock-cleanup-buffer)
|
|
|
|
|
;; Otherwise just add a newline.
|
|
|
|
|
(python-shell-font-lock-with-font-lock-buffer
|
|
|
|
|
(goto-char (point-max))
|
|
|
|
|
(newline)))
|
|
|
|
|
output))
|
2014-07-26 20:43:51 -03:00
|
|
|
|
|
|
|
|
|
(defun python-shell-font-lock-post-command-hook ()
|
|
|
|
|
"Fontifies current line in shell buffer."
|
2015-02-09 23:44:06 -03:00
|
|
|
|
(let ((prompt-end (cdr (python-util-comint-last-prompt))))
|
2015-02-12 00:41:07 -03:00
|
|
|
|
(when (and prompt-end (> (point) prompt-end)
|
|
|
|
|
(process-live-p (get-buffer-process (current-buffer))))
|
2015-02-09 23:44:06 -03:00
|
|
|
|
(let* ((input (buffer-substring-no-properties
|
|
|
|
|
prompt-end (point-max)))
|
2015-02-16 19:53:59 -03:00
|
|
|
|
(deactivate-mark nil)
|
2015-02-09 23:44:06 -03:00
|
|
|
|
(start-pos prompt-end)
|
|
|
|
|
(buffer-undo-list t)
|
|
|
|
|
(font-lock-buffer-pos nil)
|
|
|
|
|
(replacement
|
|
|
|
|
(python-shell-font-lock-with-font-lock-buffer
|
|
|
|
|
(delete-region (line-beginning-position)
|
|
|
|
|
(point-max))
|
|
|
|
|
(setq font-lock-buffer-pos (point))
|
|
|
|
|
(insert input)
|
|
|
|
|
;; Ensure buffer is fontified, keeping it
|
|
|
|
|
;; compatible with Emacs < 24.4.
|
|
|
|
|
(if (fboundp 'font-lock-ensure)
|
|
|
|
|
(funcall 'font-lock-ensure)
|
|
|
|
|
(font-lock-default-fontify-buffer))
|
|
|
|
|
(buffer-substring font-lock-buffer-pos
|
|
|
|
|
(point-max))))
|
|
|
|
|
(replacement-length (length replacement))
|
|
|
|
|
(i 0))
|
|
|
|
|
;; Inject text properties to get input fontified.
|
|
|
|
|
(while (not (= i replacement-length))
|
|
|
|
|
(let* ((plist (text-properties-at i replacement))
|
|
|
|
|
(next-change (or (next-property-change i replacement)
|
|
|
|
|
replacement-length))
|
|
|
|
|
(plist (let ((face (plist-get plist 'face)))
|
|
|
|
|
(if (not face)
|
|
|
|
|
plist
|
|
|
|
|
;; Replace FACE text properties with
|
|
|
|
|
;; FONT-LOCK-FACE so input is fontified.
|
|
|
|
|
(plist-put plist 'face nil)
|
|
|
|
|
(plist-put plist 'font-lock-face face)))))
|
|
|
|
|
(set-text-properties
|
|
|
|
|
(+ start-pos i) (+ start-pos next-change) plist)
|
|
|
|
|
(setq i next-change)))))))
|
2014-07-26 20:43:51 -03:00
|
|
|
|
|
|
|
|
|
(defun python-shell-font-lock-turn-on (&optional msg)
|
|
|
|
|
"Turn on shell font-lock.
|
|
|
|
|
With argument MSG show activation message."
|
2014-07-28 00:35:37 -03:00
|
|
|
|
(interactive "p")
|
|
|
|
|
(python-shell-with-shell-buffer
|
|
|
|
|
(python-shell-font-lock-kill-buffer)
|
|
|
|
|
(set (make-local-variable 'python-shell--font-lock-buffer) nil)
|
|
|
|
|
(add-hook 'post-command-hook
|
|
|
|
|
#'python-shell-font-lock-post-command-hook nil 'local)
|
|
|
|
|
(add-hook 'kill-buffer-hook
|
|
|
|
|
#'python-shell-font-lock-kill-buffer nil 'local)
|
|
|
|
|
(add-hook 'comint-output-filter-functions
|
|
|
|
|
#'python-shell-font-lock-comint-output-filter-function
|
|
|
|
|
'append 'local)
|
|
|
|
|
(when msg
|
|
|
|
|
(message "Shell font-lock is enabled"))))
|
2014-07-26 20:43:51 -03:00
|
|
|
|
|
|
|
|
|
(defun python-shell-font-lock-turn-off (&optional msg)
|
|
|
|
|
"Turn off shell font-lock.
|
|
|
|
|
With argument MSG show deactivation message."
|
2014-07-28 00:35:37 -03:00
|
|
|
|
(interactive "p")
|
|
|
|
|
(python-shell-with-shell-buffer
|
|
|
|
|
(python-shell-font-lock-kill-buffer)
|
|
|
|
|
(when (python-util-comint-last-prompt)
|
|
|
|
|
;; Cleanup current fontification
|
|
|
|
|
(remove-text-properties
|
|
|
|
|
(cdr (python-util-comint-last-prompt))
|
|
|
|
|
(line-end-position)
|
|
|
|
|
'(face nil font-lock-face nil)))
|
|
|
|
|
(set (make-local-variable 'python-shell--font-lock-buffer) nil)
|
|
|
|
|
(remove-hook 'post-command-hook
|
2015-02-09 23:44:06 -03:00
|
|
|
|
#'python-shell-font-lock-post-command-hook 'local)
|
2014-07-28 00:35:37 -03:00
|
|
|
|
(remove-hook 'kill-buffer-hook
|
|
|
|
|
#'python-shell-font-lock-kill-buffer 'local)
|
|
|
|
|
(remove-hook 'comint-output-filter-functions
|
|
|
|
|
#'python-shell-font-lock-comint-output-filter-function
|
|
|
|
|
'local)
|
|
|
|
|
(when msg
|
|
|
|
|
(message "Shell font-lock is disabled"))))
|
2014-07-26 20:43:51 -03:00
|
|
|
|
|
|
|
|
|
(defun python-shell-font-lock-toggle (&optional msg)
|
|
|
|
|
"Toggle font-lock for shell.
|
|
|
|
|
With argument MSG show activation/deactivation message."
|
|
|
|
|
(interactive "p")
|
2014-07-28 00:35:37 -03:00
|
|
|
|
(python-shell-with-shell-buffer
|
|
|
|
|
(set (make-local-variable 'python-shell-font-lock-enable)
|
|
|
|
|
(not python-shell-font-lock-enable))
|
|
|
|
|
(if python-shell-font-lock-enable
|
|
|
|
|
(python-shell-font-lock-turn-on msg)
|
|
|
|
|
(python-shell-font-lock-turn-off msg))
|
|
|
|
|
python-shell-font-lock-enable))
|
2012-10-08 18:30:36 -03:00
|
|
|
|
|
2015-08-23 16:53:02 -03:00
|
|
|
|
(defvar python-shell--first-prompt-received-output-buffer nil)
|
|
|
|
|
(defvar python-shell--first-prompt-received nil)
|
|
|
|
|
|
|
|
|
|
(defcustom python-shell-first-prompt-hook nil
|
|
|
|
|
"Hook run upon first (non-pdb) shell prompt detection.
|
|
|
|
|
This is the place for shell setup functions that need to wait for
|
|
|
|
|
output. Since the first prompt is ensured, this helps the
|
2017-12-17 17:09:55 +01:00
|
|
|
|
current process to not hang while waiting. This is useful to
|
|
|
|
|
safely attach setup code for long-running processes that
|
|
|
|
|
eventually provide a shell."
|
2016-01-12 20:06:49 -05:00
|
|
|
|
:version "25.1"
|
2015-08-23 16:53:02 -03:00
|
|
|
|
:type 'hook
|
|
|
|
|
:group 'python)
|
|
|
|
|
|
|
|
|
|
(defun python-shell-comint-watch-for-first-prompt-output-filter (output)
|
|
|
|
|
"Run `python-shell-first-prompt-hook' when first prompt is found in OUTPUT."
|
|
|
|
|
(when (not python-shell--first-prompt-received)
|
|
|
|
|
(set (make-local-variable 'python-shell--first-prompt-received-output-buffer)
|
|
|
|
|
(concat python-shell--first-prompt-received-output-buffer
|
|
|
|
|
(ansi-color-filter-apply output)))
|
|
|
|
|
(when (python-shell-comint-end-of-output-p
|
|
|
|
|
python-shell--first-prompt-received-output-buffer)
|
|
|
|
|
(if (string-match-p
|
|
|
|
|
(concat python-shell-prompt-pdb-regexp (rx eos))
|
|
|
|
|
(or python-shell--first-prompt-received-output-buffer ""))
|
|
|
|
|
;; Skip pdb prompts and reset the buffer.
|
|
|
|
|
(setq python-shell--first-prompt-received-output-buffer nil)
|
|
|
|
|
(set (make-local-variable 'python-shell--first-prompt-received) t)
|
|
|
|
|
(setq python-shell--first-prompt-received-output-buffer nil)
|
|
|
|
|
(with-current-buffer (current-buffer)
|
|
|
|
|
(let ((inhibit-quit nil))
|
|
|
|
|
(run-hooks 'python-shell-first-prompt-hook))))))
|
|
|
|
|
output)
|
|
|
|
|
|
2015-07-06 02:34:44 -03:00
|
|
|
|
;; Used to hold user interactive overrides to
|
|
|
|
|
;; `python-shell-interpreter' and `python-shell-interpreter-args' that
|
|
|
|
|
;; will be made buffer-local by `inferior-python-mode':
|
|
|
|
|
(defvar python-shell--interpreter)
|
|
|
|
|
(defvar python-shell--interpreter-args)
|
|
|
|
|
|
2012-05-17 00:02:52 -03:00
|
|
|
|
(define-derived-mode inferior-python-mode comint-mode "Inferior Python"
|
2012-05-17 00:03:06 -03:00
|
|
|
|
"Major mode for Python inferior process.
|
2012-05-17 00:03:09 -03:00
|
|
|
|
Runs a Python interpreter as a subprocess of Emacs, with Python
|
lisp/progmodes/python.el: Fix docstring typos.
(defconst, python-syntax-count-quotes)
(python-indent-region, python-indent-shift-right)
(python-indent-dedent-line-backspace, python-nav-backward-sexp)
(python-nav-backward-sexp-safe, python-nav-backward-up-list)
(python-shell-prompt-block-regexp, python-shell-prompt-output-regexp)
(python-shell-prompt-pdb-regexp, python-shell-enable-font-lock)
(inferior-python-mode, python-shell-make-comint, run-python-internal)
(python-shell-buffer-substring, python-shell-send-buffer)
(python-pdbtrack-activate, python-pdbtrack-stacktrace-info-regexp)
(python-completion-complete-at-point, python-fill-docstring-style)
(python-eldoc-function, python-imenu-format-item-label)
(python-imenu-format-parent-item-label)
(python-imenu-format-parent-item-jump-label)
(python-imenu--build-tree, python-imenu-create-index)
(python-imenu-create-flat-index): Fix docstring typos.
(python-indent-context, python-shell-prompt-regexp, run-python):
Remove superfluous backslashes.
(python-indent-line, python-nav-beginning-of-defun)
(python-shell-get-buffer, python-shell-get-process)
(python-info-current-defun, python-info-current-line-comment-p)
(python-info-current-line-empty-p, python-util-popn): Doc fixes.
(python-indent-post-self-insert-function, python-shell-send-file)
(python-shell-completion-get-completions)
(python-shell-completion-complete-or-indent)
(python-eldoc--get-doc-at-point): Reflow docstrings.
2014-03-15 18:37:58 +01:00
|
|
|
|
I/O through an Emacs buffer. Variables `python-shell-interpreter'
|
|
|
|
|
and `python-shell-interpreter-args' control which Python
|
|
|
|
|
interpreter is run. Variables
|
2012-05-17 00:03:09 -03:00
|
|
|
|
`python-shell-prompt-regexp',
|
|
|
|
|
`python-shell-prompt-output-regexp',
|
|
|
|
|
`python-shell-prompt-block-regexp',
|
2014-07-26 20:43:51 -03:00
|
|
|
|
`python-shell-font-lock-enable',
|
2012-05-17 00:03:09 -03:00
|
|
|
|
`python-shell-completion-setup-code',
|
2012-05-17 00:03:29 -03:00
|
|
|
|
`python-shell-completion-string-code',
|
|
|
|
|
`python-eldoc-setup-code', `python-eldoc-string-code',
|
|
|
|
|
`python-ffap-setup-code' and `python-ffap-string-code' can
|
|
|
|
|
customize this mode for different Python interpreters.
|
2012-05-17 00:03:09 -03:00
|
|
|
|
|
2014-07-26 23:02:38 -03:00
|
|
|
|
This mode resets `comint-output-filter-functions' locally, so you
|
|
|
|
|
may want to re-add custom functions to it using the
|
|
|
|
|
`inferior-python-mode-hook'.
|
|
|
|
|
|
2012-05-17 00:03:09 -03:00
|
|
|
|
You can also add additional setup code to be run at
|
|
|
|
|
initialization of the interpreter via `python-shell-setup-codes'
|
|
|
|
|
variable.
|
|
|
|
|
|
|
|
|
|
\(Type \\[describe-mode] in the process buffer for a list of commands.)"
|
2015-07-06 02:34:44 -03:00
|
|
|
|
(when python-shell--parent-buffer
|
|
|
|
|
(python-util-clone-local-variables python-shell--parent-buffer))
|
2016-06-07 18:26:33 -04:00
|
|
|
|
(set (make-local-variable 'indent-tabs-mode) nil)
|
2015-07-06 02:34:44 -03:00
|
|
|
|
;; Users can interactively override default values for
|
|
|
|
|
;; `python-shell-interpreter' and `python-shell-interpreter-args'
|
|
|
|
|
;; when calling `run-python'. This ensures values let-bound in
|
|
|
|
|
;; `python-shell-make-comint' are locally set if needed.
|
|
|
|
|
(set (make-local-variable 'python-shell-interpreter)
|
|
|
|
|
(or python-shell--interpreter python-shell-interpreter))
|
|
|
|
|
(set (make-local-variable 'python-shell-interpreter-args)
|
|
|
|
|
(or python-shell--interpreter-args python-shell-interpreter-args))
|
2014-07-19 10:13:07 -03:00
|
|
|
|
(set (make-local-variable 'python-shell--prompt-calculated-input-regexp) nil)
|
2017-08-19 11:45:07 -04:00
|
|
|
|
(set (make-local-variable 'python-shell--block-prompt) nil)
|
2014-07-19 10:13:07 -03:00
|
|
|
|
(set (make-local-variable 'python-shell--prompt-calculated-output-regexp) nil)
|
|
|
|
|
(python-shell-prompt-set-calculated-regexps)
|
2014-12-08 22:19:37 -03:00
|
|
|
|
(setq comint-prompt-regexp python-shell--prompt-calculated-input-regexp)
|
|
|
|
|
(set (make-local-variable 'comint-prompt-read-only) t)
|
2012-05-17 00:02:52 -03:00
|
|
|
|
(setq mode-line-process '(":%s"))
|
2014-07-26 23:02:38 -03:00
|
|
|
|
(set (make-local-variable 'comint-output-filter-functions)
|
|
|
|
|
'(ansi-color-process-output
|
2015-08-23 16:53:02 -03:00
|
|
|
|
python-shell-comint-watch-for-first-prompt-output-filter
|
2017-06-02 20:06:12 -04:00
|
|
|
|
python-comint-postoutput-scroll-to-bottom
|
|
|
|
|
comint-watch-for-password-prompt))
|
2012-05-17 00:02:52 -03:00
|
|
|
|
(set (make-local-variable 'compilation-error-regexp-alist)
|
|
|
|
|
python-shell-compilation-regexp-alist)
|
2012-05-17 00:02:58 -03:00
|
|
|
|
(add-hook 'completion-at-point-functions
|
2014-10-03 22:35:28 -04:00
|
|
|
|
#'python-shell-completion-at-point nil 'local)
|
2012-07-27 13:42:19 -03:00
|
|
|
|
(define-key inferior-python-mode-map "\t"
|
2012-05-17 00:03:06 -03:00
|
|
|
|
'python-shell-completion-complete-or-indent)
|
2012-08-09 01:08:29 -03:00
|
|
|
|
(make-local-variable 'python-shell-internal-last-output)
|
2014-07-26 20:43:51 -03:00
|
|
|
|
(when python-shell-font-lock-enable
|
|
|
|
|
(python-shell-font-lock-turn-on))
|
2019-11-02 18:08:13 +02:00
|
|
|
|
(compilation-shell-minor-mode 1)
|
|
|
|
|
(python-pdbtrack-setup-tracking))
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
2014-12-27 20:12:00 -03:00
|
|
|
|
(defun python-shell-make-comint (cmd proc-name &optional show internal)
|
lisp/progmodes/python.el: Fix docstring typos.
(defconst, python-syntax-count-quotes)
(python-indent-region, python-indent-shift-right)
(python-indent-dedent-line-backspace, python-nav-backward-sexp)
(python-nav-backward-sexp-safe, python-nav-backward-up-list)
(python-shell-prompt-block-regexp, python-shell-prompt-output-regexp)
(python-shell-prompt-pdb-regexp, python-shell-enable-font-lock)
(inferior-python-mode, python-shell-make-comint, run-python-internal)
(python-shell-buffer-substring, python-shell-send-buffer)
(python-pdbtrack-activate, python-pdbtrack-stacktrace-info-regexp)
(python-completion-complete-at-point, python-fill-docstring-style)
(python-eldoc-function, python-imenu-format-item-label)
(python-imenu-format-parent-item-label)
(python-imenu-format-parent-item-jump-label)
(python-imenu--build-tree, python-imenu-create-index)
(python-imenu-create-flat-index): Fix docstring typos.
(python-indent-context, python-shell-prompt-regexp, run-python):
Remove superfluous backslashes.
(python-indent-line, python-nav-beginning-of-defun)
(python-shell-get-buffer, python-shell-get-process)
(python-info-current-defun, python-info-current-line-comment-p)
(python-info-current-line-empty-p, python-util-popn): Doc fixes.
(python-indent-post-self-insert-function, python-shell-send-file)
(python-shell-completion-get-completions)
(python-shell-completion-complete-or-indent)
(python-eldoc--get-doc-at-point): Reflow docstrings.
2014-03-15 18:37:58 +01:00
|
|
|
|
"Create a Python shell comint buffer.
|
|
|
|
|
CMD is the Python command to be executed and PROC-NAME is the
|
2012-05-17 00:03:22 -03:00
|
|
|
|
process name the comint buffer will get. After the comint buffer
|
2012-08-06 00:27:43 -03:00
|
|
|
|
is created the `inferior-python-mode' is activated. When
|
2014-12-27 20:12:00 -03:00
|
|
|
|
optional argument SHOW is non-nil the buffer is shown. When
|
2012-08-06 00:27:43 -03:00
|
|
|
|
optional argument INTERNAL is non-nil this process is run on a
|
|
|
|
|
buffer with a name that starts with a space, following the Emacs
|
|
|
|
|
convention for temporary/internal buffers, and also makes sure
|
|
|
|
|
the user is not queried for confirmation when the process is
|
|
|
|
|
killed."
|
2012-05-17 00:03:22 -03:00
|
|
|
|
(save-excursion
|
2015-07-06 07:57:14 -03:00
|
|
|
|
(python-shell-with-environment
|
|
|
|
|
(let* ((proc-buffer-name
|
|
|
|
|
(format (if (not internal) "*%s*" " *%s*") proc-name)))
|
|
|
|
|
(when (not (comint-check-proc proc-buffer-name))
|
|
|
|
|
(let* ((cmdlist (split-string-and-unquote cmd))
|
|
|
|
|
(interpreter (car cmdlist))
|
|
|
|
|
(args (cdr cmdlist))
|
|
|
|
|
(buffer (apply #'make-comint-in-buffer proc-name proc-buffer-name
|
|
|
|
|
interpreter nil args))
|
|
|
|
|
(python-shell--parent-buffer (current-buffer))
|
|
|
|
|
(process (get-buffer-process buffer))
|
|
|
|
|
;; Users can override the interpreter and args
|
|
|
|
|
;; interactively when calling `run-python', let-binding
|
2016-01-24 20:30:39 +00:00
|
|
|
|
;; these allows having the new right values in all
|
2015-07-06 07:57:14 -03:00
|
|
|
|
;; setup code that is done in `inferior-python-mode',
|
|
|
|
|
;; which is important, especially for prompt detection.
|
|
|
|
|
(python-shell--interpreter interpreter)
|
|
|
|
|
(python-shell--interpreter-args
|
|
|
|
|
(mapconcat #'identity args " ")))
|
|
|
|
|
(with-current-buffer buffer
|
|
|
|
|
(inferior-python-mode))
|
|
|
|
|
(when show (display-buffer buffer))
|
|
|
|
|
(and internal (set-process-query-on-exit-flag process nil))))
|
|
|
|
|
proc-buffer-name))))
|
2012-05-17 00:03:22 -03:00
|
|
|
|
|
2012-07-27 09:38:19 -03:00
|
|
|
|
;;;###autoload
|
2014-11-16 11:20:25 -03:00
|
|
|
|
(defun run-python (&optional cmd dedicated show)
|
2012-05-17 00:02:52 -03:00
|
|
|
|
"Run an inferior Python process.
|
2012-07-27 09:38:19 -03:00
|
|
|
|
|
2014-11-16 11:20:25 -03:00
|
|
|
|
Argument CMD defaults to `python-shell-calculate-command' return
|
|
|
|
|
value. When called interactively with `prefix-arg', it allows
|
|
|
|
|
the user to edit such value and choose whether the interpreter
|
|
|
|
|
should be DEDICATED for the current buffer. When numeric prefix
|
|
|
|
|
arg is other than 0 or 4 do not SHOW.
|
2012-07-27 09:38:19 -03:00
|
|
|
|
|
2014-12-27 20:12:00 -03:00
|
|
|
|
For a given buffer and same values of DEDICATED, if a process is
|
|
|
|
|
already running for it, it will do nothing. This means that if
|
|
|
|
|
the current buffer is using a global process, the user is still
|
|
|
|
|
able to switch it to use a dedicated one.
|
|
|
|
|
|
lisp/progmodes/python.el: Fix docstring typos.
(defconst, python-syntax-count-quotes)
(python-indent-region, python-indent-shift-right)
(python-indent-dedent-line-backspace, python-nav-backward-sexp)
(python-nav-backward-sexp-safe, python-nav-backward-up-list)
(python-shell-prompt-block-regexp, python-shell-prompt-output-regexp)
(python-shell-prompt-pdb-regexp, python-shell-enable-font-lock)
(inferior-python-mode, python-shell-make-comint, run-python-internal)
(python-shell-buffer-substring, python-shell-send-buffer)
(python-pdbtrack-activate, python-pdbtrack-stacktrace-info-regexp)
(python-completion-complete-at-point, python-fill-docstring-style)
(python-eldoc-function, python-imenu-format-item-label)
(python-imenu-format-parent-item-label)
(python-imenu-format-parent-item-jump-label)
(python-imenu--build-tree, python-imenu-create-index)
(python-imenu-create-flat-index): Fix docstring typos.
(python-indent-context, python-shell-prompt-regexp, run-python):
Remove superfluous backslashes.
(python-indent-line, python-nav-beginning-of-defun)
(python-shell-get-buffer, python-shell-get-process)
(python-info-current-defun, python-info-current-line-comment-p)
(python-info-current-line-empty-p, python-util-popn): Doc fixes.
(python-indent-post-self-insert-function, python-shell-send-file)
(python-shell-completion-get-completions)
(python-shell-completion-complete-or-indent)
(python-eldoc--get-doc-at-point): Reflow docstrings.
2014-03-15 18:37:58 +01:00
|
|
|
|
Runs the hook `inferior-python-mode-hook' after
|
|
|
|
|
`comint-mode-hook' is run. (Type \\[describe-mode] in the
|
2012-07-27 09:38:19 -03:00
|
|
|
|
process buffer for a list of commands.)"
|
2012-05-17 00:02:52 -03:00
|
|
|
|
(interactive
|
|
|
|
|
(if current-prefix-arg
|
|
|
|
|
(list
|
2014-11-16 10:47:14 -03:00
|
|
|
|
(read-shell-command "Run Python: " (python-shell-calculate-command))
|
2012-05-17 00:02:52 -03:00
|
|
|
|
(y-or-n-p "Make dedicated process? ")
|
2012-07-27 09:38:19 -03:00
|
|
|
|
(= (prefix-numeric-value current-prefix-arg) 4))
|
2014-11-16 10:47:14 -03:00
|
|
|
|
(list (python-shell-calculate-command) nil t)))
|
2018-05-15 01:30:11 +09:00
|
|
|
|
(let ((buffer
|
|
|
|
|
(python-shell-make-comint
|
|
|
|
|
(or cmd (python-shell-calculate-command))
|
|
|
|
|
(python-shell-get-process-name dedicated) show)))
|
|
|
|
|
(pop-to-buffer buffer)
|
|
|
|
|
(get-buffer-process buffer)))
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
2012-05-17 00:03:21 -03:00
|
|
|
|
(defun run-python-internal ()
|
|
|
|
|
"Run an inferior Internal Python process.
|
|
|
|
|
Input and output via buffer named after
|
|
|
|
|
`python-shell-internal-buffer-name' and what
|
2012-07-31 20:43:31 -03:00
|
|
|
|
`python-shell-internal-get-process-name' returns.
|
|
|
|
|
|
|
|
|
|
This new kind of shell is intended to be used for generic
|
lisp/progmodes/python.el: Fix docstring typos.
(defconst, python-syntax-count-quotes)
(python-indent-region, python-indent-shift-right)
(python-indent-dedent-line-backspace, python-nav-backward-sexp)
(python-nav-backward-sexp-safe, python-nav-backward-up-list)
(python-shell-prompt-block-regexp, python-shell-prompt-output-regexp)
(python-shell-prompt-pdb-regexp, python-shell-enable-font-lock)
(inferior-python-mode, python-shell-make-comint, run-python-internal)
(python-shell-buffer-substring, python-shell-send-buffer)
(python-pdbtrack-activate, python-pdbtrack-stacktrace-info-regexp)
(python-completion-complete-at-point, python-fill-docstring-style)
(python-eldoc-function, python-imenu-format-item-label)
(python-imenu-format-parent-item-label)
(python-imenu-format-parent-item-jump-label)
(python-imenu--build-tree, python-imenu-create-index)
(python-imenu-create-flat-index): Fix docstring typos.
(python-indent-context, python-shell-prompt-regexp, run-python):
Remove superfluous backslashes.
(python-indent-line, python-nav-beginning-of-defun)
(python-shell-get-buffer, python-shell-get-process)
(python-info-current-defun, python-info-current-line-comment-p)
(python-info-current-line-empty-p, python-util-popn): Doc fixes.
(python-indent-post-self-insert-function, python-shell-send-file)
(python-shell-completion-get-completions)
(python-shell-completion-complete-or-indent)
(python-eldoc--get-doc-at-point): Reflow docstrings.
2014-03-15 18:37:58 +01:00
|
|
|
|
communication related to defined configurations; the main
|
2012-07-31 20:43:31 -03:00
|
|
|
|
difference with global or dedicated shells is that these ones are
|
|
|
|
|
attached to a configuration, not a buffer. This means that can
|
|
|
|
|
be used for example to retrieve the sys.path and other stuff,
|
|
|
|
|
without messing with user shells. Note that
|
2014-07-26 20:43:51 -03:00
|
|
|
|
`python-shell-font-lock-enable' and `inferior-python-mode-hook'
|
2012-07-31 20:43:31 -03:00
|
|
|
|
are set to nil for these shells, so setup codes are not sent at
|
|
|
|
|
startup."
|
2014-07-26 20:43:51 -03:00
|
|
|
|
(let ((python-shell-font-lock-enable nil)
|
2012-07-31 20:43:31 -03:00
|
|
|
|
(inferior-python-mode-hook nil))
|
2012-08-06 00:27:43 -03:00
|
|
|
|
(get-buffer-process
|
|
|
|
|
(python-shell-make-comint
|
2014-11-16 10:47:14 -03:00
|
|
|
|
(python-shell-calculate-command)
|
2012-08-06 00:27:43 -03:00
|
|
|
|
(python-shell-internal-get-process-name) nil t))))
|
2012-05-17 00:03:21 -03:00
|
|
|
|
|
2013-10-29 21:28:36 -04:00
|
|
|
|
(defun python-shell-get-buffer ()
|
2014-07-27 22:41:29 -03:00
|
|
|
|
"Return inferior Python buffer for current buffer.
|
|
|
|
|
If current buffer is in `inferior-python-mode', return it."
|
2014-11-01 12:33:02 -06:00
|
|
|
|
(if (derived-mode-p 'inferior-python-mode)
|
2014-07-27 22:41:29 -03:00
|
|
|
|
(current-buffer)
|
|
|
|
|
(let* ((dedicated-proc-name (python-shell-get-process-name t))
|
|
|
|
|
(dedicated-proc-buffer-name (format "*%s*" dedicated-proc-name))
|
|
|
|
|
(global-proc-name (python-shell-get-process-name nil))
|
|
|
|
|
(global-proc-buffer-name (format "*%s*" global-proc-name))
|
|
|
|
|
(dedicated-running (comint-check-proc dedicated-proc-buffer-name))
|
|
|
|
|
(global-running (comint-check-proc global-proc-buffer-name)))
|
|
|
|
|
;; Always prefer dedicated
|
|
|
|
|
(or (and dedicated-running dedicated-proc-buffer-name)
|
|
|
|
|
(and global-running global-proc-buffer-name)))))
|
2013-10-29 21:28:36 -04:00
|
|
|
|
|
|
|
|
|
(defun python-shell-get-process ()
|
lisp/progmodes/python.el: Fix docstring typos.
(defconst, python-syntax-count-quotes)
(python-indent-region, python-indent-shift-right)
(python-indent-dedent-line-backspace, python-nav-backward-sexp)
(python-nav-backward-sexp-safe, python-nav-backward-up-list)
(python-shell-prompt-block-regexp, python-shell-prompt-output-regexp)
(python-shell-prompt-pdb-regexp, python-shell-enable-font-lock)
(inferior-python-mode, python-shell-make-comint, run-python-internal)
(python-shell-buffer-substring, python-shell-send-buffer)
(python-pdbtrack-activate, python-pdbtrack-stacktrace-info-regexp)
(python-completion-complete-at-point, python-fill-docstring-style)
(python-eldoc-function, python-imenu-format-item-label)
(python-imenu-format-parent-item-label)
(python-imenu-format-parent-item-jump-label)
(python-imenu--build-tree, python-imenu-create-index)
(python-imenu-create-flat-index): Fix docstring typos.
(python-indent-context, python-shell-prompt-regexp, run-python):
Remove superfluous backslashes.
(python-indent-line, python-nav-beginning-of-defun)
(python-shell-get-buffer, python-shell-get-process)
(python-info-current-defun, python-info-current-line-comment-p)
(python-info-current-line-empty-p, python-util-popn): Doc fixes.
(python-indent-post-self-insert-function, python-shell-send-file)
(python-shell-completion-get-completions)
(python-shell-completion-complete-or-indent)
(python-eldoc--get-doc-at-point): Reflow docstrings.
2014-03-15 18:37:58 +01:00
|
|
|
|
"Return inferior Python process for current buffer."
|
2013-10-29 21:28:36 -04:00
|
|
|
|
(get-buffer-process (python-shell-get-buffer)))
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
2014-12-27 20:12:00 -03:00
|
|
|
|
(defun python-shell-get-process-or-error (&optional interactivep)
|
|
|
|
|
"Return inferior Python process for current buffer or signal error.
|
|
|
|
|
When argument INTERACTIVEP is non-nil, use `user-error' instead
|
|
|
|
|
of `error' with a user-friendly message."
|
|
|
|
|
(or (python-shell-get-process)
|
|
|
|
|
(if interactivep
|
|
|
|
|
(user-error
|
2017-01-09 17:28:17 +02:00
|
|
|
|
"Start a Python process first with `M-x run-python' or `%s'."
|
2014-12-27 20:12:00 -03:00
|
|
|
|
;; Get the binding.
|
|
|
|
|
(key-description
|
|
|
|
|
(where-is-internal
|
|
|
|
|
#'run-python overriding-local-map t)))
|
|
|
|
|
(error
|
|
|
|
|
"No inferior Python process running."))))
|
|
|
|
|
|
2014-07-19 10:13:07 -03:00
|
|
|
|
(defun python-shell-get-or-create-process (&optional cmd dedicated show)
|
|
|
|
|
"Get or create an inferior Python process for current buffer and return it.
|
|
|
|
|
Arguments CMD, DEDICATED and SHOW are those of `run-python' and
|
|
|
|
|
are used to start the shell. If those arguments are not
|
|
|
|
|
provided, `run-python' is called interactively and the user will
|
|
|
|
|
be asked for their values."
|
2014-07-27 22:41:29 -03:00
|
|
|
|
(let ((shell-process (python-shell-get-process)))
|
|
|
|
|
(when (not shell-process)
|
|
|
|
|
(if (not cmd)
|
|
|
|
|
;; XXX: Refactor code such that calling `run-python'
|
|
|
|
|
;; interactively is not needed anymore.
|
|
|
|
|
(call-interactively 'run-python)
|
|
|
|
|
(run-python cmd dedicated show)))
|
|
|
|
|
(or shell-process (python-shell-get-process))))
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
2014-12-27 20:12:00 -03:00
|
|
|
|
(make-obsolete
|
|
|
|
|
#'python-shell-get-or-create-process
|
|
|
|
|
"Instead call `python-shell-get-process' and create one if returns nil."
|
|
|
|
|
"25.1")
|
|
|
|
|
|
2018-04-20 18:34:39 -04:00
|
|
|
|
(define-obsolete-variable-alias
|
|
|
|
|
'python-buffer 'python-shell-internal-buffer "24.3")
|
|
|
|
|
|
2012-05-17 00:03:32 -03:00
|
|
|
|
(defvar python-shell-internal-buffer nil
|
|
|
|
|
"Current internal shell buffer for the current buffer.
|
|
|
|
|
This is really not necessary at all for the code to work but it's
|
|
|
|
|
there for compatibility with CEDET.")
|
|
|
|
|
|
2018-04-20 18:34:39 -04:00
|
|
|
|
(define-obsolete-variable-alias
|
|
|
|
|
'python-preoutput-result 'python-shell-internal-last-output "24.3")
|
|
|
|
|
|
2012-07-31 20:43:31 -03:00
|
|
|
|
(defvar python-shell-internal-last-output nil
|
|
|
|
|
"Last output captured by the internal shell.
|
|
|
|
|
This is really not necessary at all for the code to work but it's
|
|
|
|
|
there for compatibility with CEDET.")
|
|
|
|
|
|
2012-05-17 00:03:21 -03:00
|
|
|
|
(defun python-shell-internal-get-or-create-process ()
|
|
|
|
|
"Get or create an inferior Internal Python process."
|
2014-12-26 17:59:33 -03:00
|
|
|
|
(let ((proc-name (python-shell-internal-get-process-name)))
|
|
|
|
|
(if (process-live-p proc-name)
|
|
|
|
|
(get-process proc-name)
|
|
|
|
|
(run-python-internal))))
|
2012-05-17 00:03:21 -03:00
|
|
|
|
|
2012-05-17 00:03:32 -03:00
|
|
|
|
(define-obsolete-function-alias
|
2012-08-15 09:29:11 -07:00
|
|
|
|
'python-proc 'python-shell-internal-get-or-create-process "24.3")
|
2012-05-17 00:03:32 -03:00
|
|
|
|
|
2013-11-04 14:14:58 -05:00
|
|
|
|
(defun python-shell--save-temp-file (string)
|
|
|
|
|
(let* ((temporary-file-directory
|
|
|
|
|
(if (file-remote-p default-directory)
|
|
|
|
|
(concat (file-remote-p default-directory) "/tmp")
|
|
|
|
|
temporary-file-directory))
|
|
|
|
|
(temp-file-name (make-temp-file "py"))
|
2014-12-27 01:30:21 -03:00
|
|
|
|
(coding-system-for-write (python-info-encoding)))
|
2013-11-04 14:14:58 -05:00
|
|
|
|
(with-temp-file temp-file-name
|
|
|
|
|
(insert string)
|
|
|
|
|
(delete-trailing-whitespace))
|
|
|
|
|
temp-file-name))
|
|
|
|
|
|
2014-12-27 20:12:00 -03:00
|
|
|
|
(defun python-shell-send-string (string &optional process msg)
|
|
|
|
|
"Send STRING to inferior Python PROCESS.
|
|
|
|
|
When optional argument MSG is non-nil, forces display of a
|
|
|
|
|
user-friendly message if there's no process running; defaults to
|
|
|
|
|
t when called interactively."
|
|
|
|
|
(interactive
|
|
|
|
|
(list (read-string "Python command: ") nil t))
|
|
|
|
|
(let ((process (or process (python-shell-get-process-or-error msg))))
|
2013-11-04 14:14:58 -05:00
|
|
|
|
(if (string-match ".\n+." string) ;Multiline.
|
2014-12-23 00:45:22 -03:00
|
|
|
|
(let* ((temp-file-name (python-shell--save-temp-file string))
|
|
|
|
|
(file-name (or (buffer-file-name) temp-file-name)))
|
|
|
|
|
(python-shell-send-file file-name process temp-file-name t))
|
2012-05-17 00:03:06 -03:00
|
|
|
|
(comint-send-string process string)
|
2013-11-04 14:14:58 -05:00
|
|
|
|
(when (or (not (string-match "\n\\'" string))
|
|
|
|
|
(string-match "\n[ \t].*\n?\\'" string))
|
|
|
|
|
(comint-send-string process "\n")))))
|
2012-05-17 00:03:06 -03:00
|
|
|
|
|
2012-10-07 01:33:16 -03:00
|
|
|
|
(defvar python-shell-output-filter-in-progress nil)
|
|
|
|
|
(defvar python-shell-output-filter-buffer nil)
|
|
|
|
|
|
|
|
|
|
(defun python-shell-output-filter (string)
|
|
|
|
|
"Filter used in `python-shell-send-string-no-output' to grab output.
|
|
|
|
|
STRING is the output received to this point from the process.
|
|
|
|
|
This filter saves received output from the process in
|
|
|
|
|
`python-shell-output-filter-buffer' and stops receiving it after
|
|
|
|
|
detecting a prompt at the end of the buffer."
|
|
|
|
|
(setq
|
|
|
|
|
string (ansi-color-filter-apply string)
|
|
|
|
|
python-shell-output-filter-buffer
|
|
|
|
|
(concat python-shell-output-filter-buffer string))
|
2014-07-26 20:43:51 -03:00
|
|
|
|
(when (python-shell-comint-end-of-output-p
|
2012-10-07 01:33:16 -03:00
|
|
|
|
python-shell-output-filter-buffer)
|
|
|
|
|
;; Output ends when `python-shell-output-filter-buffer' contains
|
|
|
|
|
;; the prompt attached at the end of it.
|
|
|
|
|
(setq python-shell-output-filter-in-progress nil
|
|
|
|
|
python-shell-output-filter-buffer
|
|
|
|
|
(substring python-shell-output-filter-buffer
|
|
|
|
|
0 (match-beginning 0)))
|
2014-07-19 10:13:07 -03:00
|
|
|
|
(when (string-match
|
|
|
|
|
python-shell--prompt-calculated-output-regexp
|
|
|
|
|
python-shell-output-filter-buffer)
|
2014-07-20 15:12:30 -03:00
|
|
|
|
;; Some shells, like IPython might append a prompt before the
|
2012-10-07 01:33:16 -03:00
|
|
|
|
;; output, clean that.
|
|
|
|
|
(setq python-shell-output-filter-buffer
|
|
|
|
|
(substring python-shell-output-filter-buffer (match-end 0)))))
|
|
|
|
|
"")
|
2012-09-30 21:53:44 -03:00
|
|
|
|
|
2013-11-04 14:14:58 -05:00
|
|
|
|
(defun python-shell-send-string-no-output (string &optional process)
|
2012-05-17 00:03:06 -03:00
|
|
|
|
"Send STRING to PROCESS and inhibit output.
|
2014-02-04 16:35:52 -03:00
|
|
|
|
Return the output."
|
2014-12-27 20:12:00 -03:00
|
|
|
|
(let ((process (or process (python-shell-get-process-or-error)))
|
2012-09-30 21:53:44 -03:00
|
|
|
|
(comint-preoutput-filter-functions
|
2012-10-07 01:33:16 -03:00
|
|
|
|
'(python-shell-output-filter))
|
|
|
|
|
(python-shell-output-filter-in-progress t)
|
2012-09-30 21:53:44 -03:00
|
|
|
|
(inhibit-quit t))
|
2012-07-17 13:47:58 -03:00
|
|
|
|
(or
|
|
|
|
|
(with-local-quit
|
2013-11-04 14:14:58 -05:00
|
|
|
|
(python-shell-send-string string process)
|
2012-10-07 01:33:16 -03:00
|
|
|
|
(while python-shell-output-filter-in-progress
|
|
|
|
|
;; `python-shell-output-filter' takes care of setting
|
|
|
|
|
;; `python-shell-output-filter-in-progress' to NIL after it
|
|
|
|
|
;; detects end of output.
|
2012-09-30 21:53:44 -03:00
|
|
|
|
(accept-process-output process))
|
|
|
|
|
(prog1
|
2012-10-07 01:33:16 -03:00
|
|
|
|
python-shell-output-filter-buffer
|
|
|
|
|
(setq python-shell-output-filter-buffer nil)))
|
2012-07-17 13:47:58 -03:00
|
|
|
|
(with-current-buffer (process-buffer process)
|
|
|
|
|
(comint-interrupt-subjob)))))
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
2012-05-17 00:03:21 -03:00
|
|
|
|
(defun python-shell-internal-send-string (string)
|
|
|
|
|
"Send STRING to the Internal Python interpreter.
|
|
|
|
|
Returns the output. See `python-shell-send-string-no-output'."
|
2012-07-31 20:43:31 -03:00
|
|
|
|
;; XXX Remove `python-shell-internal-last-output' once CEDET is
|
|
|
|
|
;; updated to support this new mode.
|
|
|
|
|
(setq python-shell-internal-last-output
|
|
|
|
|
(python-shell-send-string-no-output
|
|
|
|
|
;; Makes this function compatible with the old
|
|
|
|
|
;; python-send-receive. (At least for CEDET).
|
|
|
|
|
(replace-regexp-in-string "_emacs_out +" "" string)
|
2013-11-04 14:14:58 -05:00
|
|
|
|
(python-shell-internal-get-or-create-process))))
|
2012-05-17 00:03:21 -03:00
|
|
|
|
|
|
|
|
|
(define-obsolete-function-alias
|
2012-08-15 09:29:11 -07:00
|
|
|
|
'python-send-receive 'python-shell-internal-send-string "24.3")
|
2012-05-17 00:03:32 -03:00
|
|
|
|
|
|
|
|
|
(define-obsolete-function-alias
|
2012-08-15 09:29:11 -07:00
|
|
|
|
'python-send-string 'python-shell-internal-send-string "24.3")
|
2012-05-17 00:03:21 -03:00
|
|
|
|
|
2013-09-02 10:56:03 -03:00
|
|
|
|
(defun python-shell-buffer-substring (start end &optional nomain)
|
|
|
|
|
"Send buffer substring from START to END formatted for shell.
|
|
|
|
|
This is a wrapper over `buffer-substring' that takes care of
|
|
|
|
|
different transformations for the code sent to be evaluated in
|
|
|
|
|
the python shell:
|
lisp/progmodes/python.el: Fix docstring typos.
(defconst, python-syntax-count-quotes)
(python-indent-region, python-indent-shift-right)
(python-indent-dedent-line-backspace, python-nav-backward-sexp)
(python-nav-backward-sexp-safe, python-nav-backward-up-list)
(python-shell-prompt-block-regexp, python-shell-prompt-output-regexp)
(python-shell-prompt-pdb-regexp, python-shell-enable-font-lock)
(inferior-python-mode, python-shell-make-comint, run-python-internal)
(python-shell-buffer-substring, python-shell-send-buffer)
(python-pdbtrack-activate, python-pdbtrack-stacktrace-info-regexp)
(python-completion-complete-at-point, python-fill-docstring-style)
(python-eldoc-function, python-imenu-format-item-label)
(python-imenu-format-parent-item-label)
(python-imenu-format-parent-item-jump-label)
(python-imenu--build-tree, python-imenu-create-index)
(python-imenu-create-flat-index): Fix docstring typos.
(python-indent-context, python-shell-prompt-regexp, run-python):
Remove superfluous backslashes.
(python-indent-line, python-nav-beginning-of-defun)
(python-shell-get-buffer, python-shell-get-process)
(python-info-current-defun, python-info-current-line-comment-p)
(python-info-current-line-empty-p, python-util-popn): Doc fixes.
(python-indent-post-self-insert-function, python-shell-send-file)
(python-shell-completion-get-completions)
(python-shell-completion-complete-or-indent)
(python-eldoc--get-doc-at-point): Reflow docstrings.
2014-03-15 18:37:58 +01:00
|
|
|
|
1. When optional argument NOMAIN is non-nil everything under an
|
2015-09-03 15:31:12 -07:00
|
|
|
|
\"if __name__ == \\='__main__\\='\" block will be removed.
|
2013-09-02 10:56:03 -03:00
|
|
|
|
2. When a subregion of the buffer is sent, it takes care of
|
2013-09-09 09:26:38 -07:00
|
|
|
|
appending extra empty lines so tracebacks are correct.
|
2014-12-27 01:30:21 -03:00
|
|
|
|
3. When the region sent is a substring of the current buffer, a
|
|
|
|
|
coding cookie is added.
|
|
|
|
|
4. Wraps indented regions under an \"if True:\" block so the
|
2013-09-02 10:56:03 -03:00
|
|
|
|
interpreter evaluates them correctly."
|
2015-08-23 19:55:54 -03:00
|
|
|
|
(let* ((start (save-excursion
|
|
|
|
|
;; Normalize start to the line beginning position.
|
|
|
|
|
(goto-char start)
|
|
|
|
|
(line-beginning-position)))
|
|
|
|
|
(substring (buffer-substring-no-properties start end))
|
2014-12-27 17:22:29 -03:00
|
|
|
|
(starts-at-point-min-p (save-restriction
|
|
|
|
|
(widen)
|
|
|
|
|
(= (point-min) start)))
|
2014-12-27 01:30:21 -03:00
|
|
|
|
(encoding (python-info-encoding))
|
2015-08-23 19:55:54 -03:00
|
|
|
|
(toplevel-p (zerop (save-excursion
|
|
|
|
|
(goto-char start)
|
|
|
|
|
(python-util-forward-comment 1)
|
|
|
|
|
(current-indentation))))
|
2014-12-27 17:22:29 -03:00
|
|
|
|
(fillstr (when (not starts-at-point-min-p)
|
|
|
|
|
(concat
|
|
|
|
|
(format "# -*- coding: %s -*-\n" encoding)
|
|
|
|
|
(make-string
|
2014-12-28 15:06:16 -08:00
|
|
|
|
;; Subtract 2 because of the coding cookie.
|
2015-08-23 19:55:54 -03:00
|
|
|
|
(- (line-number-at-pos start) 2) ?\n)))))
|
2013-09-02 10:56:03 -03:00
|
|
|
|
(with-temp-buffer
|
|
|
|
|
(python-mode)
|
2015-08-23 19:55:54 -03:00
|
|
|
|
(when fillstr
|
|
|
|
|
(insert fillstr))
|
2013-09-02 10:56:03 -03:00
|
|
|
|
(insert substring)
|
|
|
|
|
(goto-char (point-min))
|
2015-08-23 19:55:54 -03:00
|
|
|
|
(when (not toplevel-p)
|
2013-09-02 10:56:03 -03:00
|
|
|
|
(insert "if True:")
|
|
|
|
|
(delete-region (point) (line-end-position)))
|
|
|
|
|
(when nomain
|
|
|
|
|
(let* ((if-name-main-start-end
|
|
|
|
|
(and nomain
|
|
|
|
|
(save-excursion
|
|
|
|
|
(when (python-nav-if-name-main)
|
|
|
|
|
(cons (point)
|
2013-12-25 15:07:31 -03:00
|
|
|
|
(progn (python-nav-forward-sexp-safe)
|
2014-12-27 01:30:21 -03:00
|
|
|
|
;; Include ending newline
|
|
|
|
|
(forward-line 1)
|
2013-09-02 10:56:03 -03:00
|
|
|
|
(point)))))))
|
|
|
|
|
;; Oh destructuring bind, how I miss you.
|
|
|
|
|
(if-name-main-start (car if-name-main-start-end))
|
2014-12-27 01:30:21 -03:00
|
|
|
|
(if-name-main-end (cdr if-name-main-start-end))
|
|
|
|
|
(fillstr (make-string
|
|
|
|
|
(- (line-number-at-pos if-name-main-end)
|
|
|
|
|
(line-number-at-pos if-name-main-start)) ?\n)))
|
2013-09-02 10:56:03 -03:00
|
|
|
|
(when if-name-main-start-end
|
|
|
|
|
(goto-char if-name-main-start)
|
|
|
|
|
(delete-region if-name-main-start if-name-main-end)
|
2014-12-27 01:30:21 -03:00
|
|
|
|
(insert fillstr))))
|
|
|
|
|
;; Ensure there's only one coding cookie in the generated string.
|
|
|
|
|
(goto-char (point-min))
|
|
|
|
|
(when (looking-at-p (python-rx coding-cookie))
|
|
|
|
|
(forward-line 1)
|
|
|
|
|
(when (looking-at-p (python-rx coding-cookie))
|
|
|
|
|
(delete-region
|
|
|
|
|
(line-beginning-position) (line-end-position))))
|
2013-09-02 10:56:03 -03:00
|
|
|
|
(buffer-substring-no-properties (point-min) (point-max)))))
|
|
|
|
|
|
2014-12-27 20:12:00 -03:00
|
|
|
|
(defun python-shell-send-region (start end &optional send-main msg)
|
2014-12-27 04:01:32 -03:00
|
|
|
|
"Send the region delimited by START and END to inferior Python process.
|
|
|
|
|
When optional argument SEND-MAIN is non-nil, allow execution of
|
2015-11-17 15:28:50 -08:00
|
|
|
|
code inside blocks delimited by \"if __name__== \\='__main__\\=':\".
|
2014-12-27 04:01:32 -03:00
|
|
|
|
When called interactively SEND-MAIN defaults to nil, unless it's
|
2014-12-27 20:12:00 -03:00
|
|
|
|
called with prefix argument. When optional argument MSG is
|
|
|
|
|
non-nil, forces display of a user-friendly message if there's no
|
|
|
|
|
process running; defaults to t when called interactively."
|
|
|
|
|
(interactive
|
|
|
|
|
(list (region-beginning) (region-end) current-prefix-arg t))
|
2014-12-27 04:01:32 -03:00
|
|
|
|
(let* ((string (python-shell-buffer-substring start end (not send-main)))
|
2014-12-27 20:12:00 -03:00
|
|
|
|
(process (python-shell-get-process-or-error msg))
|
2014-12-27 04:01:32 -03:00
|
|
|
|
(original-string (buffer-substring-no-properties start end))
|
|
|
|
|
(_ (string-match "\\`\n*\\(.*\\)" original-string)))
|
|
|
|
|
(message "Sent: %s..." (match-string 1 original-string))
|
2014-12-23 00:45:22 -03:00
|
|
|
|
(python-shell-send-string string process)))
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
2019-11-29 03:10:12 -05:00
|
|
|
|
(defun python-shell-send-statement (&optional send-main msg)
|
|
|
|
|
"Send the statement at point to inferior Python process.
|
|
|
|
|
The statement is delimited by `python-nav-beginning-of-statement' and
|
|
|
|
|
`python-nav-end-of-statement', but if the region is active, the text
|
|
|
|
|
in the region is sent instead via `python-shell-send-region'.
|
|
|
|
|
Optional argument SEND-MAIN, if non-nil, means allow execution of code
|
|
|
|
|
inside blocks delimited by \"if __name__ == \\='__main__\\=':\".
|
|
|
|
|
Interactively, SEND-MAIN is the prefix argument.
|
|
|
|
|
Optional argument MSG, if non-nil, forces display of a user-friendly
|
|
|
|
|
message if there's no process running; it defaults to t when called
|
|
|
|
|
interactively."
|
|
|
|
|
(interactive (list current-prefix-arg t))
|
|
|
|
|
(if (region-active-p)
|
|
|
|
|
(python-shell-send-region (region-beginning) (region-end) send-main msg)
|
|
|
|
|
(python-shell-send-region
|
|
|
|
|
(save-excursion (python-nav-beginning-of-statement))
|
|
|
|
|
(save-excursion (python-nav-end-of-statement))
|
|
|
|
|
send-main msg)))
|
|
|
|
|
|
2014-12-27 20:12:00 -03:00
|
|
|
|
(defun python-shell-send-buffer (&optional send-main msg)
|
2012-05-17 00:03:39 -03:00
|
|
|
|
"Send the entire buffer to inferior Python process.
|
2014-12-27 04:01:32 -03:00
|
|
|
|
When optional argument SEND-MAIN is non-nil, allow execution of
|
2015-11-17 15:28:50 -08:00
|
|
|
|
code inside blocks delimited by \"if __name__== \\='__main__\\=':\".
|
2014-12-27 04:01:32 -03:00
|
|
|
|
When called interactively SEND-MAIN defaults to nil, unless it's
|
2014-12-27 20:12:00 -03:00
|
|
|
|
called with prefix argument. When optional argument MSG is
|
|
|
|
|
non-nil, forces display of a user-friendly message if there's no
|
|
|
|
|
process running; defaults to t when called interactively."
|
|
|
|
|
(interactive (list current-prefix-arg t))
|
2012-05-17 00:02:52 -03:00
|
|
|
|
(save-restriction
|
|
|
|
|
(widen)
|
2014-12-27 20:12:00 -03:00
|
|
|
|
(python-shell-send-region (point-min) (point-max) send-main msg)))
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
2014-12-27 20:12:00 -03:00
|
|
|
|
(defun python-shell-send-defun (&optional arg msg)
|
2012-05-17 00:03:12 -03:00
|
|
|
|
"Send the current defun to inferior Python process.
|
2014-12-27 20:12:00 -03:00
|
|
|
|
When argument ARG is non-nil do not include decorators. When
|
|
|
|
|
optional argument MSG is non-nil, forces display of a
|
|
|
|
|
user-friendly message if there's no process running; defaults to
|
|
|
|
|
t when called interactively."
|
|
|
|
|
(interactive (list current-prefix-arg t))
|
2012-05-17 00:02:52 -03:00
|
|
|
|
(save-excursion
|
2012-05-17 00:03:12 -03:00
|
|
|
|
(python-shell-send-region
|
|
|
|
|
(progn
|
2012-05-17 00:03:44 -03:00
|
|
|
|
(end-of-line 1)
|
2012-11-12 10:26:50 -03:00
|
|
|
|
(while (and (or (python-nav-beginning-of-defun)
|
2012-05-17 00:03:44 -03:00
|
|
|
|
(beginning-of-line 1))
|
|
|
|
|
(> (current-indentation) 0)))
|
|
|
|
|
(when (not arg)
|
2018-04-07 08:45:03 +05:30
|
|
|
|
(while (and
|
|
|
|
|
(eq (forward-line -1) 0)
|
|
|
|
|
(if (looking-at (python-rx decorator))
|
|
|
|
|
t
|
|
|
|
|
(forward-line 1)
|
|
|
|
|
nil))))
|
2012-05-17 00:03:40 -03:00
|
|
|
|
(point-marker))
|
2012-05-17 00:03:12 -03:00
|
|
|
|
(progn
|
2012-11-12 10:26:50 -03:00
|
|
|
|
(or (python-nav-end-of-defun)
|
2012-05-17 00:03:44 -03:00
|
|
|
|
(end-of-line 1))
|
2014-12-27 20:12:00 -03:00
|
|
|
|
(point-marker))
|
|
|
|
|
nil ;; noop
|
|
|
|
|
msg)))
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
2013-11-23 11:39:50 -08:00
|
|
|
|
(defun python-shell-send-file (file-name &optional process temp-file-name
|
2014-12-27 20:12:00 -03:00
|
|
|
|
delete msg)
|
2012-05-17 00:03:03 -03:00
|
|
|
|
"Send FILE-NAME to inferior Python PROCESS.
|
|
|
|
|
If TEMP-FILE-NAME is passed then that file is used for processing
|
2014-12-27 03:38:32 -03:00
|
|
|
|
instead, while internally the shell will continue to use
|
|
|
|
|
FILE-NAME. If TEMP-FILE-NAME and DELETE are non-nil, then
|
2014-12-27 20:12:00 -03:00
|
|
|
|
TEMP-FILE-NAME is deleted after evaluation is performed. When
|
|
|
|
|
optional argument MSG is non-nil, forces display of a
|
|
|
|
|
user-friendly message if there's no process running; defaults to
|
|
|
|
|
t when called interactively."
|
|
|
|
|
(interactive
|
|
|
|
|
(list
|
|
|
|
|
(read-file-name "File to send: ") ; file-name
|
|
|
|
|
nil ; process
|
|
|
|
|
nil ; temp-file-name
|
|
|
|
|
nil ; delete
|
|
|
|
|
t)) ; msg
|
|
|
|
|
(let* ((process (or process (python-shell-get-process-or-error msg)))
|
2014-12-27 03:32:01 -03:00
|
|
|
|
(encoding (with-temp-buffer
|
|
|
|
|
(insert-file-contents
|
|
|
|
|
(or temp-file-name file-name))
|
|
|
|
|
(python-info-encoding)))
|
2018-03-01 21:52:27 -05:00
|
|
|
|
(file-name (file-local-name (expand-file-name file-name)))
|
2012-05-17 00:03:06 -03:00
|
|
|
|
(temp-file-name (when temp-file-name
|
2018-03-01 21:52:27 -05:00
|
|
|
|
(file-local-name (expand-file-name
|
|
|
|
|
temp-file-name)))))
|
2012-05-17 00:02:56 -03:00
|
|
|
|
(python-shell-send-string
|
2012-05-17 00:02:54 -03:00
|
|
|
|
(format
|
2014-12-27 01:30:21 -03:00
|
|
|
|
(concat
|
2014-12-27 03:38:32 -03:00
|
|
|
|
"import codecs, os;"
|
|
|
|
|
"__pyfile = codecs.open('''%s''', encoding='''%s''');"
|
|
|
|
|
"__code = __pyfile.read().encode('''%s''');"
|
|
|
|
|
"__pyfile.close();"
|
|
|
|
|
(when (and delete temp-file-name)
|
|
|
|
|
(format "os.remove('''%s''');" temp-file-name))
|
|
|
|
|
"exec(compile(__code, '''%s''', 'exec'));")
|
|
|
|
|
(or temp-file-name file-name) encoding encoding file-name)
|
2012-05-17 00:02:56 -03:00
|
|
|
|
process)))
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
2014-12-27 20:12:00 -03:00
|
|
|
|
(defun python-shell-switch-to-shell (&optional msg)
|
|
|
|
|
"Switch to inferior Python process buffer.
|
|
|
|
|
When optional argument MSG is non-nil, forces display of a
|
|
|
|
|
user-friendly message if there's no process running; defaults to
|
|
|
|
|
t when called interactively."
|
|
|
|
|
(interactive "p")
|
|
|
|
|
(pop-to-buffer
|
|
|
|
|
(process-buffer (python-shell-get-process-or-error msg)) nil t))
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
2012-05-17 00:03:09 -03:00
|
|
|
|
(defun python-shell-send-setup-code ()
|
|
|
|
|
"Send all setup code for shell.
|
|
|
|
|
This function takes the list of setup code to send from the
|
|
|
|
|
`python-shell-setup-codes' list."
|
2015-08-22 20:42:04 -03:00
|
|
|
|
(when python-shell-setup-codes
|
|
|
|
|
(let ((process (python-shell-get-process))
|
|
|
|
|
(code (concat
|
|
|
|
|
(mapconcat
|
|
|
|
|
(lambda (elt)
|
|
|
|
|
(cond ((stringp elt) elt)
|
|
|
|
|
((symbolp elt) (symbol-value elt))
|
|
|
|
|
(t "")))
|
|
|
|
|
python-shell-setup-codes
|
|
|
|
|
"\n\nprint ('python.el: sent setup code')"))))
|
|
|
|
|
(python-shell-send-string code process)
|
|
|
|
|
(python-shell-accept-process-output process))))
|
2012-05-17 00:03:09 -03:00
|
|
|
|
|
2015-08-23 16:53:02 -03:00
|
|
|
|
(add-hook 'python-shell-first-prompt-hook
|
2012-05-17 00:03:09 -03:00
|
|
|
|
#'python-shell-send-setup-code)
|
|
|
|
|
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
|
|
|
|
;;; Shell completion
|
|
|
|
|
|
2012-05-17 00:03:23 -03:00
|
|
|
|
(defcustom python-shell-completion-setup-code
|
2015-08-23 14:54:56 -03:00
|
|
|
|
"
|
|
|
|
|
def __PYTHON_EL_get_completions(text):
|
|
|
|
|
completions = []
|
|
|
|
|
completer = None
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
import readline
|
|
|
|
|
|
2015-04-06 19:18:46 -03:00
|
|
|
|
try:
|
|
|
|
|
import __builtin__
|
|
|
|
|
except ImportError:
|
|
|
|
|
# Python 3
|
|
|
|
|
import builtins as __builtin__
|
2014-11-26 23:45:24 -03:00
|
|
|
|
builtins = dir(__builtin__)
|
2015-08-23 14:54:56 -03:00
|
|
|
|
|
2015-04-06 19:18:46 -03:00
|
|
|
|
is_ipython = ('__IPYTHON__' in builtins or
|
|
|
|
|
'__IPYTHON__active' in builtins)
|
|
|
|
|
splits = text.split()
|
|
|
|
|
is_module = splits and splits[0] in ('from', 'import')
|
2015-08-23 14:54:56 -03:00
|
|
|
|
|
|
|
|
|
if is_ipython and is_module:
|
|
|
|
|
from IPython.core.completerlib import module_completion
|
|
|
|
|
completions = module_completion(text.strip())
|
|
|
|
|
elif is_ipython and '__IP' in builtins:
|
|
|
|
|
completions = __IP.complete(text)
|
|
|
|
|
elif is_ipython and 'get_ipython' in builtins:
|
|
|
|
|
completions = get_ipython().Completer.all_completions(text)
|
|
|
|
|
else:
|
|
|
|
|
# Try to reuse current completer.
|
|
|
|
|
completer = readline.get_completer()
|
|
|
|
|
if not completer:
|
|
|
|
|
# importing rlcompleter sets the completer, use it as a
|
|
|
|
|
# last resort to avoid breaking customizations.
|
|
|
|
|
import rlcompleter
|
2015-04-06 19:18:46 -03:00
|
|
|
|
completer = readline.get_completer()
|
2015-08-23 14:54:56 -03:00
|
|
|
|
if getattr(completer, 'PYTHON_EL_WRAPPED', False):
|
|
|
|
|
completer.print_mode = False
|
|
|
|
|
i = 0
|
|
|
|
|
while True:
|
|
|
|
|
completion = completer(text, i)
|
|
|
|
|
if not completion:
|
|
|
|
|
break
|
|
|
|
|
i += 1
|
|
|
|
|
completions.append(completion)
|
|
|
|
|
except:
|
|
|
|
|
pass
|
|
|
|
|
finally:
|
|
|
|
|
if getattr(completer, 'PYTHON_EL_WRAPPED', False):
|
|
|
|
|
completer.print_mode = True
|
|
|
|
|
return completions"
|
2012-05-17 00:03:23 -03:00
|
|
|
|
"Code used to setup completion in inferior Python processes."
|
|
|
|
|
:type 'string
|
2012-05-17 00:03:33 -03:00
|
|
|
|
:group 'python)
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
2014-07-20 15:12:30 -03:00
|
|
|
|
(define-obsolete-variable-alias
|
|
|
|
|
'python-shell-completion-module-string-code
|
|
|
|
|
'python-shell-completion-string-code
|
|
|
|
|
"24.4"
|
|
|
|
|
"Completion string code must also autocomplete modules.")
|
2012-05-17 00:03:27 -03:00
|
|
|
|
|
2014-08-04 18:35:17 -03:00
|
|
|
|
(define-obsolete-variable-alias
|
|
|
|
|
'python-shell-completion-pdb-string-code
|
|
|
|
|
'python-shell-completion-string-code
|
2014-09-29 14:14:08 -04:00
|
|
|
|
"25.1"
|
2014-08-04 18:35:17 -03:00
|
|
|
|
"Completion string code must work for (i)pdb.")
|
2012-05-17 00:03:31 -03:00
|
|
|
|
|
2017-12-20 16:05:46 -05:00
|
|
|
|
(defcustom python-shell-completion-string-code
|
|
|
|
|
"';'.join(__PYTHON_EL_get_completions('''%s'''))"
|
|
|
|
|
"Python code used to get a string of completions separated by semicolons.
|
|
|
|
|
The string passed to the function is the current python name or
|
|
|
|
|
the full statement in the case of imports."
|
|
|
|
|
:type 'string
|
|
|
|
|
:group 'python)
|
|
|
|
|
|
2014-12-27 20:58:45 -03:00
|
|
|
|
(defcustom python-shell-completion-native-disabled-interpreters
|
2017-02-07 21:13:17 -05:00
|
|
|
|
;; PyPy's readline cannot handle some escape sequences yet. Native
|
|
|
|
|
;; completion was found to be non-functional for IPython (see
|
2017-10-12 23:25:13 -04:00
|
|
|
|
;; Bug#25067). Native completion doesn't work on w32 (Bug#28580).
|
|
|
|
|
(if (eq system-type 'windows-nt) '("")
|
|
|
|
|
'("pypy" "ipython"))
|
2014-12-27 20:58:45 -03:00
|
|
|
|
"List of disabled interpreters.
|
|
|
|
|
When a match is found, native completion is disabled."
|
2016-01-12 20:06:49 -05:00
|
|
|
|
:version "25.1"
|
2014-12-27 20:58:45 -03:00
|
|
|
|
:type '(repeat string))
|
|
|
|
|
|
|
|
|
|
(defcustom python-shell-completion-native-enable t
|
|
|
|
|
"Enable readline based native completion."
|
2016-01-12 20:06:49 -05:00
|
|
|
|
:version "25.1"
|
2014-12-27 20:58:45 -03:00
|
|
|
|
:type 'boolean)
|
|
|
|
|
|
2015-04-09 00:53:18 -03:00
|
|
|
|
(defcustom python-shell-completion-native-output-timeout 5.0
|
2014-12-27 20:58:45 -03:00
|
|
|
|
"Time in seconds to wait for completion output before giving up."
|
2016-01-12 20:06:49 -05:00
|
|
|
|
:version "25.1"
|
2014-12-27 20:58:45 -03:00
|
|
|
|
:type 'float)
|
|
|
|
|
|
2015-04-09 00:53:18 -03:00
|
|
|
|
(defcustom python-shell-completion-native-try-output-timeout 1.0
|
|
|
|
|
"Time in seconds to wait for *trying* native completion output."
|
2016-01-12 20:06:49 -05:00
|
|
|
|
:version "25.1"
|
2015-04-09 00:53:18 -03:00
|
|
|
|
:type 'float)
|
|
|
|
|
|
2014-12-27 20:58:45 -03:00
|
|
|
|
(defvar python-shell-completion-native-redirect-buffer
|
|
|
|
|
" *Python completions redirect*"
|
|
|
|
|
"Buffer to be used to redirect output of readline commands.")
|
|
|
|
|
|
|
|
|
|
(defun python-shell-completion-native-interpreter-disabled-p ()
|
|
|
|
|
"Return non-nil if interpreter has native completion disabled."
|
|
|
|
|
(when python-shell-completion-native-disabled-interpreters
|
|
|
|
|
(string-match
|
|
|
|
|
(regexp-opt python-shell-completion-native-disabled-interpreters)
|
|
|
|
|
(file-name-nondirectory python-shell-interpreter))))
|
|
|
|
|
|
|
|
|
|
(defun python-shell-completion-native-try ()
|
|
|
|
|
"Return non-nil if can trigger native completion."
|
2015-04-09 00:53:18 -03:00
|
|
|
|
(let ((python-shell-completion-native-enable t)
|
|
|
|
|
(python-shell-completion-native-output-timeout
|
|
|
|
|
python-shell-completion-native-try-output-timeout))
|
2014-12-27 20:58:45 -03:00
|
|
|
|
(python-shell-completion-native-get-completions
|
|
|
|
|
(get-buffer-process (current-buffer))
|
2016-10-26 22:46:28 -04:00
|
|
|
|
nil "_")))
|
2014-12-27 20:58:45 -03:00
|
|
|
|
|
|
|
|
|
(defun python-shell-completion-native-setup ()
|
|
|
|
|
"Try to setup native completion, return non-nil on success."
|
|
|
|
|
(let ((process (python-shell-get-process)))
|
2015-08-23 14:54:56 -03:00
|
|
|
|
(with-current-buffer (process-buffer process)
|
|
|
|
|
(python-shell-send-string "
|
2015-04-09 00:53:18 -03:00
|
|
|
|
def __PYTHON_EL_native_completion_setup():
|
|
|
|
|
try:
|
|
|
|
|
import readline
|
2015-08-22 18:07:26 -03:00
|
|
|
|
|
2015-04-09 00:53:18 -03:00
|
|
|
|
try:
|
|
|
|
|
import __builtin__
|
|
|
|
|
except ImportError:
|
|
|
|
|
# Python 3
|
|
|
|
|
import builtins as __builtin__
|
2015-08-22 18:07:26 -03:00
|
|
|
|
|
2015-04-09 00:53:18 -03:00
|
|
|
|
builtins = dir(__builtin__)
|
|
|
|
|
is_ipython = ('__IPYTHON__' in builtins or
|
|
|
|
|
'__IPYTHON__active' in builtins)
|
2015-08-22 18:07:26 -03:00
|
|
|
|
|
2015-04-09 00:53:18 -03:00
|
|
|
|
class __PYTHON_EL_Completer:
|
2015-08-22 18:07:26 -03:00
|
|
|
|
'''Completer wrapper that prints candidates to stdout.
|
|
|
|
|
|
|
|
|
|
It wraps an existing completer function and changes its behavior so
|
|
|
|
|
that the user input is unchanged and real candidates are printed to
|
|
|
|
|
stdout.
|
|
|
|
|
|
|
|
|
|
Returned candidates are '0__dummy_completion__' and
|
|
|
|
|
'1__dummy_completion__' in that order ('0__dummy_completion__' is
|
|
|
|
|
returned repeatedly until all possible candidates are consumed).
|
|
|
|
|
|
|
|
|
|
The real candidates are printed to stdout so that they can be
|
|
|
|
|
easily retrieved through comint output redirect trickery.
|
|
|
|
|
'''
|
|
|
|
|
|
2015-04-09 00:53:18 -03:00
|
|
|
|
PYTHON_EL_WRAPPED = True
|
2015-08-22 18:07:26 -03:00
|
|
|
|
|
2015-04-09 00:53:18 -03:00
|
|
|
|
def __init__(self, completer):
|
|
|
|
|
self.completer = completer
|
|
|
|
|
self.last_completion = None
|
2015-08-23 14:54:56 -03:00
|
|
|
|
self.print_mode = True
|
2015-08-22 18:07:26 -03:00
|
|
|
|
|
2015-04-09 00:53:18 -03:00
|
|
|
|
def __call__(self, text, state):
|
|
|
|
|
if state == 0:
|
2015-08-22 18:07:26 -03:00
|
|
|
|
# Set the first dummy completion.
|
2015-04-09 00:53:18 -03:00
|
|
|
|
self.last_completion = None
|
|
|
|
|
completion = '0__dummy_completion__'
|
|
|
|
|
else:
|
|
|
|
|
completion = self.completer(text, state - 1)
|
2015-08-22 18:07:26 -03:00
|
|
|
|
|
2015-04-09 00:53:18 -03:00
|
|
|
|
if not completion:
|
2015-08-22 18:07:26 -03:00
|
|
|
|
if self.last_completion != '1__dummy_completion__':
|
|
|
|
|
# When no more completions are available, returning a
|
2016-01-24 20:30:39 +00:00
|
|
|
|
# dummy with non-sharing prefix allow ensuring output
|
2015-04-09 00:53:18 -03:00
|
|
|
|
# while preventing changes to current input.
|
2015-08-22 18:07:26 -03:00
|
|
|
|
# Coincidentally it's also the end of output.
|
2015-04-09 00:53:18 -03:00
|
|
|
|
completion = '1__dummy_completion__'
|
|
|
|
|
elif completion.endswith('('):
|
|
|
|
|
# Remove parens on callables as it breaks completion on
|
|
|
|
|
# arguments (e.g. str(Ari<tab>)).
|
|
|
|
|
completion = completion[:-1]
|
|
|
|
|
self.last_completion = completion
|
2015-08-22 18:07:26 -03:00
|
|
|
|
|
|
|
|
|
if completion in (
|
|
|
|
|
'0__dummy_completion__', '1__dummy_completion__'):
|
|
|
|
|
return completion
|
|
|
|
|
elif completion:
|
|
|
|
|
# For every non-dummy completion, return a repeated dummy
|
|
|
|
|
# one and print the real candidate so it can be retrieved
|
|
|
|
|
# by comint output filters.
|
2015-08-23 14:54:56 -03:00
|
|
|
|
if self.print_mode:
|
|
|
|
|
print (completion)
|
|
|
|
|
return '0__dummy_completion__'
|
|
|
|
|
else:
|
|
|
|
|
return completion
|
2015-08-22 18:07:26 -03:00
|
|
|
|
else:
|
|
|
|
|
return completion
|
|
|
|
|
|
2015-04-09 00:53:18 -03:00
|
|
|
|
completer = readline.get_completer()
|
2015-08-22 18:07:26 -03:00
|
|
|
|
|
2015-04-09 00:53:18 -03:00
|
|
|
|
if not completer:
|
|
|
|
|
# Used as last resort to avoid breaking customizations.
|
|
|
|
|
import rlcompleter
|
|
|
|
|
completer = readline.get_completer()
|
2015-08-22 18:07:26 -03:00
|
|
|
|
|
2015-04-09 00:53:18 -03:00
|
|
|
|
if completer and not getattr(completer, 'PYTHON_EL_WRAPPED', False):
|
|
|
|
|
# Wrap the existing completer function only once.
|
|
|
|
|
new_completer = __PYTHON_EL_Completer(completer)
|
|
|
|
|
if not is_ipython:
|
|
|
|
|
readline.set_completer(new_completer)
|
|
|
|
|
else:
|
2015-07-06 01:59:02 -03:00
|
|
|
|
# Try both initializations to cope with all IPython versions.
|
|
|
|
|
# This works fine for IPython 3.x but not for earlier:
|
|
|
|
|
readline.set_completer(new_completer)
|
|
|
|
|
# IPython<3 hacks readline such that `readline.set_completer`
|
2015-04-09 00:53:18 -03:00
|
|
|
|
# won't work. This workaround injects the new completer
|
2015-07-06 01:59:02 -03:00
|
|
|
|
# function into the existing instance directly:
|
2015-04-09 00:53:18 -03:00
|
|
|
|
instance = getattr(completer, 'im_self', completer.__self__)
|
|
|
|
|
instance.rlcomplete = new_completer
|
2015-08-22 18:07:26 -03:00
|
|
|
|
|
2015-04-09 00:53:18 -03:00
|
|
|
|
if readline.__doc__ and 'libedit' in readline.__doc__:
|
2017-10-02 22:54:36 -04:00
|
|
|
|
raise Exception('''libedit based readline is known not to work,
|
|
|
|
|
see etc/PROBLEMS under \"In Inferior Python mode, input is echoed\".''')
|
2015-04-09 00:53:18 -03:00
|
|
|
|
readline.parse_and_bind('bind ^I rl_complete')
|
|
|
|
|
else:
|
|
|
|
|
readline.parse_and_bind('tab: complete')
|
|
|
|
|
# Require just one tab to send output.
|
|
|
|
|
readline.parse_and_bind('set show-all-if-ambiguous on')
|
2015-08-22 18:07:26 -03:00
|
|
|
|
|
2015-08-23 14:54:56 -03:00
|
|
|
|
print ('python.el: native completion setup loaded')
|
2015-08-22 19:05:31 -03:00
|
|
|
|
except:
|
2017-10-02 22:54:36 -04:00
|
|
|
|
import sys
|
|
|
|
|
print ('python.el: native completion setup failed, %s: %s'
|
|
|
|
|
% sys.exc_info()[:2])
|
2015-08-22 18:07:26 -03:00
|
|
|
|
|
2015-08-23 14:54:56 -03:00
|
|
|
|
__PYTHON_EL_native_completion_setup()" process)
|
|
|
|
|
(when (and
|
|
|
|
|
(python-shell-accept-process-output
|
|
|
|
|
process python-shell-completion-native-try-output-timeout)
|
|
|
|
|
(save-excursion
|
|
|
|
|
(re-search-backward
|
|
|
|
|
(regexp-quote "python.el: native completion setup loaded") nil t 1)))
|
|
|
|
|
(python-shell-completion-native-try)))))
|
2014-12-27 20:58:45 -03:00
|
|
|
|
|
|
|
|
|
(defun python-shell-completion-native-turn-off (&optional msg)
|
|
|
|
|
"Turn off shell native completions.
|
|
|
|
|
With argument MSG show deactivation message."
|
|
|
|
|
(interactive "p")
|
|
|
|
|
(python-shell-with-shell-buffer
|
|
|
|
|
(set (make-local-variable 'python-shell-completion-native-enable) nil)
|
|
|
|
|
(when msg
|
|
|
|
|
(message "Shell native completion is disabled, using fallback"))))
|
|
|
|
|
|
|
|
|
|
(defun python-shell-completion-native-turn-on (&optional msg)
|
|
|
|
|
"Turn on shell native completions.
|
|
|
|
|
With argument MSG show deactivation message."
|
|
|
|
|
(interactive "p")
|
|
|
|
|
(python-shell-with-shell-buffer
|
|
|
|
|
(set (make-local-variable 'python-shell-completion-native-enable) t)
|
|
|
|
|
(python-shell-completion-native-turn-on-maybe msg)))
|
|
|
|
|
|
|
|
|
|
(defun python-shell-completion-native-turn-on-maybe (&optional msg)
|
|
|
|
|
"Turn on native completions if enabled and available.
|
|
|
|
|
With argument MSG show activation/deactivation message."
|
|
|
|
|
(interactive "p")
|
|
|
|
|
(python-shell-with-shell-buffer
|
|
|
|
|
(when python-shell-completion-native-enable
|
|
|
|
|
(cond
|
|
|
|
|
((python-shell-completion-native-interpreter-disabled-p)
|
|
|
|
|
(python-shell-completion-native-turn-off msg))
|
|
|
|
|
((python-shell-completion-native-setup)
|
|
|
|
|
(when msg
|
|
|
|
|
(message "Shell native completion is enabled.")))
|
|
|
|
|
(t (lwarn
|
|
|
|
|
'(python python-shell-completion-native-turn-on-maybe)
|
|
|
|
|
:warning
|
|
|
|
|
(concat
|
|
|
|
|
"Your `python-shell-interpreter' doesn't seem to "
|
2017-03-05 23:15:32 -05:00
|
|
|
|
"support readline, yet `python-shell-completion-native-enable' "
|
2015-05-21 10:04:45 -07:00
|
|
|
|
(format "was t and %S is not part of the "
|
2014-12-27 20:58:45 -03:00
|
|
|
|
(file-name-nondirectory python-shell-interpreter))
|
|
|
|
|
"`python-shell-completion-native-disabled-interpreters' "
|
|
|
|
|
"list. Native completions have been disabled locally. "))
|
|
|
|
|
(python-shell-completion-native-turn-off msg))))))
|
|
|
|
|
|
|
|
|
|
(defun python-shell-completion-native-turn-on-maybe-with-msg ()
|
|
|
|
|
"Like `python-shell-completion-native-turn-on-maybe' but force messages."
|
|
|
|
|
(python-shell-completion-native-turn-on-maybe t))
|
|
|
|
|
|
2015-08-23 16:53:02 -03:00
|
|
|
|
(add-hook 'python-shell-first-prompt-hook
|
2014-12-27 20:58:45 -03:00
|
|
|
|
#'python-shell-completion-native-turn-on-maybe-with-msg)
|
|
|
|
|
|
|
|
|
|
(defun python-shell-completion-native-toggle (&optional msg)
|
|
|
|
|
"Toggle shell native completion.
|
|
|
|
|
With argument MSG show activation/deactivation message."
|
|
|
|
|
(interactive "p")
|
|
|
|
|
(python-shell-with-shell-buffer
|
|
|
|
|
(if python-shell-completion-native-enable
|
|
|
|
|
(python-shell-completion-native-turn-off msg)
|
|
|
|
|
(python-shell-completion-native-turn-on msg))
|
|
|
|
|
python-shell-completion-native-enable))
|
|
|
|
|
|
|
|
|
|
(defun python-shell-completion-native-get-completions (process import input)
|
|
|
|
|
"Get completions using native readline for PROCESS.
|
|
|
|
|
When IMPORT is non-nil takes precedence over INPUT for
|
|
|
|
|
completion."
|
2015-02-08 01:31:12 -03:00
|
|
|
|
(with-current-buffer (process-buffer process)
|
2015-08-23 14:54:56 -03:00
|
|
|
|
(let* ((input (or import input))
|
|
|
|
|
(original-filter-fn (process-filter process))
|
|
|
|
|
(redirect-buffer (get-buffer-create
|
|
|
|
|
python-shell-completion-native-redirect-buffer))
|
|
|
|
|
(trigger "\t")
|
|
|
|
|
(new-input (concat input trigger))
|
|
|
|
|
(input-length
|
|
|
|
|
(save-excursion
|
|
|
|
|
(+ (- (point-max) (comint-bol)) (length new-input))))
|
|
|
|
|
(delete-line-command (make-string input-length ?\b))
|
|
|
|
|
(input-to-send (concat new-input delete-line-command)))
|
|
|
|
|
;; Ensure restoring the process filter, even if the user quits
|
|
|
|
|
;; or there's some other error.
|
|
|
|
|
(unwind-protect
|
|
|
|
|
(with-current-buffer redirect-buffer
|
|
|
|
|
;; Cleanup the redirect buffer
|
|
|
|
|
(erase-buffer)
|
|
|
|
|
;; Mimic `comint-redirect-send-command', unfortunately it
|
|
|
|
|
;; can't be used here because it expects a newline in the
|
|
|
|
|
;; command and that's exactly what we are trying to avoid.
|
|
|
|
|
(let ((comint-redirect-echo-input nil)
|
|
|
|
|
(comint-redirect-completed nil)
|
|
|
|
|
(comint-redirect-perform-sanity-check nil)
|
|
|
|
|
(comint-redirect-insert-matching-regexp t)
|
|
|
|
|
(comint-redirect-finished-regexp
|
|
|
|
|
"1__dummy_completion__[[:space:]]*\n")
|
|
|
|
|
(comint-redirect-output-buffer redirect-buffer))
|
|
|
|
|
;; Compatibility with Emacs 24.x. Comint changed and
|
|
|
|
|
;; now `comint-redirect-filter' gets 3 args. This
|
|
|
|
|
;; checks which version of `comint-redirect-filter' is
|
|
|
|
|
;; in use based on its args and uses `apply-partially'
|
|
|
|
|
;; to make it up for the 3 args case.
|
|
|
|
|
(if (= (length
|
|
|
|
|
(help-function-arglist 'comint-redirect-filter)) 3)
|
|
|
|
|
(set-process-filter
|
|
|
|
|
process (apply-partially
|
|
|
|
|
#'comint-redirect-filter original-filter-fn))
|
|
|
|
|
(set-process-filter process #'comint-redirect-filter))
|
|
|
|
|
(process-send-string process input-to-send)
|
|
|
|
|
;; Grab output until our dummy completion used as
|
|
|
|
|
;; output end marker is found.
|
|
|
|
|
(when (python-shell-accept-process-output
|
|
|
|
|
process python-shell-completion-native-output-timeout
|
|
|
|
|
comint-redirect-finished-regexp)
|
|
|
|
|
(re-search-backward "0__dummy_completion__" nil t)
|
|
|
|
|
(cl-remove-duplicates
|
|
|
|
|
(split-string
|
|
|
|
|
(buffer-substring-no-properties
|
|
|
|
|
(line-beginning-position) (point-min))
|
|
|
|
|
"[ \f\t\n\r\v()]+" t)
|
|
|
|
|
:test #'string=))))
|
|
|
|
|
(set-process-filter process original-filter-fn)))))
|
2014-12-27 20:58:45 -03:00
|
|
|
|
|
2014-08-02 19:52:55 -03:00
|
|
|
|
(defun python-shell-completion-get-completions (process import input)
|
|
|
|
|
"Do completion at point using PROCESS for IMPORT or INPUT.
|
|
|
|
|
When IMPORT is non-nil takes precedence over INPUT for
|
|
|
|
|
completion."
|
2015-08-23 14:54:56 -03:00
|
|
|
|
(setq input (or import input))
|
2014-09-30 20:41:51 -04:00
|
|
|
|
(with-current-buffer (process-buffer process)
|
2015-08-23 14:54:56 -03:00
|
|
|
|
(let ((completions
|
|
|
|
|
(python-util-strip-string
|
|
|
|
|
(python-shell-send-string-no-output
|
|
|
|
|
(format
|
2015-08-22 20:42:04 -03:00
|
|
|
|
(concat python-shell-completion-setup-code
|
2015-08-23 14:54:56 -03:00
|
|
|
|
"\nprint (" python-shell-completion-string-code ")")
|
|
|
|
|
input) process))))
|
|
|
|
|
(when (> (length completions) 2)
|
|
|
|
|
(split-string completions
|
|
|
|
|
"^'\\|^\"\\|;\\|'$\\|\"$" t)))))
|
2012-08-14 01:18:41 -03:00
|
|
|
|
|
2014-07-28 01:32:28 -03:00
|
|
|
|
(defun python-shell-completion-at-point (&optional process)
|
|
|
|
|
"Function for `completion-at-point-functions' in `inferior-python-mode'.
|
2012-08-14 01:18:41 -03:00
|
|
|
|
Optional argument PROCESS forces completions to be retrieved
|
|
|
|
|
using that one instead of current buffer's process."
|
|
|
|
|
(setq process (or process (get-buffer-process (current-buffer))))
|
2015-02-08 01:31:12 -03:00
|
|
|
|
(let* ((line-start (if (derived-mode-p 'inferior-python-mode)
|
|
|
|
|
;; Working on a shell buffer: use prompt end.
|
|
|
|
|
(cdr (python-util-comint-last-prompt))
|
|
|
|
|
(line-beginning-position)))
|
2014-08-02 19:52:55 -03:00
|
|
|
|
(import-statement
|
|
|
|
|
(when (string-match-p
|
|
|
|
|
(rx (* space) word-start (or "from" "import") word-end space)
|
2015-02-08 01:31:12 -03:00
|
|
|
|
(buffer-substring-no-properties line-start (point)))
|
|
|
|
|
(buffer-substring-no-properties line-start (point))))
|
2014-08-02 19:52:55 -03:00
|
|
|
|
(start
|
2012-08-14 01:18:41 -03:00
|
|
|
|
(save-excursion
|
2014-07-28 01:32:28 -03:00
|
|
|
|
(if (not (re-search-backward
|
|
|
|
|
(python-rx
|
2019-10-18 16:04:32 +03:00
|
|
|
|
(or whitespace open-paren close-paren string-delimiter simple-operator))
|
2015-02-08 01:31:12 -03:00
|
|
|
|
line-start
|
2014-07-28 01:32:28 -03:00
|
|
|
|
t 1))
|
2015-02-08 01:31:12 -03:00
|
|
|
|
line-start
|
2014-07-28 01:32:28 -03:00
|
|
|
|
(forward-char (length (match-string-no-properties 0)))
|
|
|
|
|
(point))))
|
2014-12-27 20:58:45 -03:00
|
|
|
|
(end (point))
|
2015-12-30 06:24:08 +02:00
|
|
|
|
(prompt-boundaries
|
|
|
|
|
(with-current-buffer (process-buffer process)
|
|
|
|
|
(python-util-comint-last-prompt)))
|
2015-08-23 14:54:56 -03:00
|
|
|
|
(prompt
|
|
|
|
|
(with-current-buffer (process-buffer process)
|
|
|
|
|
(when prompt-boundaries
|
|
|
|
|
(buffer-substring-no-properties
|
|
|
|
|
(car prompt-boundaries) (cdr prompt-boundaries)))))
|
2014-12-27 20:58:45 -03:00
|
|
|
|
(completion-fn
|
2015-08-23 14:54:56 -03:00
|
|
|
|
(with-current-buffer (process-buffer process)
|
|
|
|
|
(cond ((or (null prompt)
|
|
|
|
|
(< (point) (cdr prompt-boundaries)))
|
|
|
|
|
#'ignore)
|
|
|
|
|
((or (not python-shell-completion-native-enable)
|
|
|
|
|
;; Even if native completion is enabled, for
|
|
|
|
|
;; pdb interaction always use the fallback
|
|
|
|
|
;; mechanism since the completer is changed.
|
|
|
|
|
;; Also, since pdb interaction is single-line
|
|
|
|
|
;; based, this is enough.
|
|
|
|
|
(string-match-p python-shell-prompt-pdb-regexp prompt))
|
2017-08-19 11:45:07 -04:00
|
|
|
|
(if (or (equal python-shell--block-prompt prompt)
|
|
|
|
|
(string-match-p
|
|
|
|
|
python-shell-prompt-block-regexp prompt))
|
|
|
|
|
;; The non-native completion mechanism sends
|
|
|
|
|
;; newlines to the interpreter, so we can't use
|
|
|
|
|
;; it during a multiline statement (Bug#28051).
|
|
|
|
|
#'ignore
|
|
|
|
|
#'python-shell-completion-get-completions))
|
2015-08-23 14:54:56 -03:00
|
|
|
|
(t #'python-shell-completion-native-get-completions)))))
|
2012-08-14 01:18:41 -03:00
|
|
|
|
(list start end
|
|
|
|
|
(completion-table-dynamic
|
|
|
|
|
(apply-partially
|
2014-12-27 20:58:45 -03:00
|
|
|
|
completion-fn
|
2014-08-02 19:52:55 -03:00
|
|
|
|
process import-statement)))))
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
2014-07-28 01:32:28 -03:00
|
|
|
|
(define-obsolete-function-alias
|
|
|
|
|
'python-shell-completion-complete-at-point
|
|
|
|
|
'python-shell-completion-at-point
|
2014-09-29 14:14:08 -04:00
|
|
|
|
"25.1")
|
2014-07-28 01:32:28 -03:00
|
|
|
|
|
2012-05-17 00:02:52 -03:00
|
|
|
|
(defun python-shell-completion-complete-or-indent ()
|
|
|
|
|
"Complete or indent depending on the context.
|
lisp/progmodes/python.el: Fix docstring typos.
(defconst, python-syntax-count-quotes)
(python-indent-region, python-indent-shift-right)
(python-indent-dedent-line-backspace, python-nav-backward-sexp)
(python-nav-backward-sexp-safe, python-nav-backward-up-list)
(python-shell-prompt-block-regexp, python-shell-prompt-output-regexp)
(python-shell-prompt-pdb-regexp, python-shell-enable-font-lock)
(inferior-python-mode, python-shell-make-comint, run-python-internal)
(python-shell-buffer-substring, python-shell-send-buffer)
(python-pdbtrack-activate, python-pdbtrack-stacktrace-info-regexp)
(python-completion-complete-at-point, python-fill-docstring-style)
(python-eldoc-function, python-imenu-format-item-label)
(python-imenu-format-parent-item-label)
(python-imenu-format-parent-item-jump-label)
(python-imenu--build-tree, python-imenu-create-index)
(python-imenu-create-flat-index): Fix docstring typos.
(python-indent-context, python-shell-prompt-regexp, run-python):
Remove superfluous backslashes.
(python-indent-line, python-nav-beginning-of-defun)
(python-shell-get-buffer, python-shell-get-process)
(python-info-current-defun, python-info-current-line-comment-p)
(python-info-current-line-empty-p, python-util-popn): Doc fixes.
(python-indent-post-self-insert-function, python-shell-send-file)
(python-shell-completion-get-completions)
(python-shell-completion-complete-or-indent)
(python-eldoc--get-doc-at-point): Reflow docstrings.
2014-03-15 18:37:58 +01:00
|
|
|
|
If content before pointer is all whitespace, indent.
|
|
|
|
|
If not try to complete."
|
2012-05-17 00:02:52 -03:00
|
|
|
|
(interactive)
|
|
|
|
|
(if (string-match "^[[:space:]]*$"
|
|
|
|
|
(buffer-substring (comint-line-beginning-position)
|
2014-10-03 22:35:28 -04:00
|
|
|
|
(point)))
|
2012-05-17 00:02:52 -03:00
|
|
|
|
(indent-for-tab-command)
|
2012-05-17 00:03:38 -03:00
|
|
|
|
(completion-at-point)))
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;;; PDB Track integration
|
|
|
|
|
|
2012-05-17 00:03:31 -03:00
|
|
|
|
(defcustom python-pdbtrack-activate t
|
2019-11-02 18:08:13 +02:00
|
|
|
|
"Non-nil makes Python shell enable pdbtracking.
|
|
|
|
|
Pdbtracking would open the file for current stack frame found in pdb output by
|
|
|
|
|
`python-pdbtrack-stacktrace-info-regexp' and add overlay arrow in currently
|
|
|
|
|
inspected line in that file.
|
|
|
|
|
|
2019-12-09 18:44:35 -08:00
|
|
|
|
After the command listed in `python-pdbtrack-continue-command' or
|
|
|
|
|
`python-pdbtrack-exit-command' is sent to pdb, the pdbtracking session is
|
|
|
|
|
considered over. The overlay arrow will be removed from the currently tracked
|
2019-11-02 18:08:13 +02:00
|
|
|
|
buffer. Additionally, if `python-pdbtrack-kill-buffers' is non-nil, all
|
|
|
|
|
files opened by pdbtracking will be killed."
|
2012-05-17 00:03:31 -03:00
|
|
|
|
:type 'boolean
|
|
|
|
|
:group 'python
|
|
|
|
|
:safe 'booleanp)
|
|
|
|
|
|
2012-05-17 00:03:23 -03:00
|
|
|
|
(defcustom python-pdbtrack-stacktrace-info-regexp
|
2019-11-02 18:08:13 +02:00
|
|
|
|
"> \\([^\"(]+\\)(\\([0-9]+\\))\\([?a-zA-Z0-9_<>]+\\)()"
|
lisp/progmodes/python.el: Fix docstring typos.
(defconst, python-syntax-count-quotes)
(python-indent-region, python-indent-shift-right)
(python-indent-dedent-line-backspace, python-nav-backward-sexp)
(python-nav-backward-sexp-safe, python-nav-backward-up-list)
(python-shell-prompt-block-regexp, python-shell-prompt-output-regexp)
(python-shell-prompt-pdb-regexp, python-shell-enable-font-lock)
(inferior-python-mode, python-shell-make-comint, run-python-internal)
(python-shell-buffer-substring, python-shell-send-buffer)
(python-pdbtrack-activate, python-pdbtrack-stacktrace-info-regexp)
(python-completion-complete-at-point, python-fill-docstring-style)
(python-eldoc-function, python-imenu-format-item-label)
(python-imenu-format-parent-item-label)
(python-imenu-format-parent-item-jump-label)
(python-imenu--build-tree, python-imenu-create-index)
(python-imenu-create-flat-index): Fix docstring typos.
(python-indent-context, python-shell-prompt-regexp, run-python):
Remove superfluous backslashes.
(python-indent-line, python-nav-beginning-of-defun)
(python-shell-get-buffer, python-shell-get-process)
(python-info-current-defun, python-info-current-line-comment-p)
(python-info-current-line-empty-p, python-util-popn): Doc fixes.
(python-indent-post-self-insert-function, python-shell-send-file)
(python-shell-completion-get-completions)
(python-shell-completion-complete-or-indent)
(python-eldoc--get-doc-at-point): Reflow docstrings.
2014-03-15 18:37:58 +01:00
|
|
|
|
"Regular expression matching stacktrace information.
|
2019-11-02 18:08:13 +02:00
|
|
|
|
Used to extract the current line and module being inspected.
|
|
|
|
|
|
|
|
|
|
Must match lines with real filename, like
|
|
|
|
|
> /path/to/file.py(42)<module>()->None
|
2019-11-11 10:30:13 -08:00
|
|
|
|
and lines in which filename starts with `<', e.g.
|
2019-11-02 18:08:13 +02:00
|
|
|
|
> <stdin>(1)<module>()->None
|
|
|
|
|
|
|
|
|
|
In the first case /path/to/file.py file will be visited and overlay icon
|
|
|
|
|
will be placed in line 42.
|
|
|
|
|
In the second case pdbtracking session will be considered over because
|
|
|
|
|
the top stack frame has been reached.
|
|
|
|
|
|
|
|
|
|
Filename is expected in the first parenthesized expression.
|
|
|
|
|
Line number is expected in the second parenthesized expression."
|
2012-05-17 00:03:23 -03:00
|
|
|
|
:type 'string
|
2019-11-02 18:08:13 +02:00
|
|
|
|
:version "27.1"
|
2012-05-17 00:03:23 -03:00
|
|
|
|
:safe 'stringp)
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
2019-11-02 18:08:13 +02:00
|
|
|
|
(defcustom python-pdbtrack-continue-command '("c" "cont" "continue")
|
2019-11-11 10:30:13 -08:00
|
|
|
|
"Pdb `continue' command aliases.
|
|
|
|
|
After one of these commands is sent to pdb, the pdbtracking session is
|
2019-11-02 18:08:13 +02:00
|
|
|
|
considered over.
|
|
|
|
|
|
2019-11-11 10:30:13 -08:00
|
|
|
|
This command is remembered by pdbtracking. If the next command sent to pdb
|
|
|
|
|
is the empty string, it is treated as `continue' if the previous command
|
|
|
|
|
was `continue'. This behavior slightly differentiates the `continue' command
|
|
|
|
|
from the `exit' command listed in `python-pdbtrack-exit-command'.
|
2019-11-02 18:08:13 +02:00
|
|
|
|
|
|
|
|
|
See `python-pdbtrack-activate' for pdbtracking session overview."
|
|
|
|
|
:type 'list
|
|
|
|
|
:version "27.1")
|
|
|
|
|
|
|
|
|
|
(defcustom python-pdbtrack-exit-command '("q" "quit" "exit")
|
2019-11-11 10:30:13 -08:00
|
|
|
|
"Pdb `exit' command aliases.
|
2019-11-02 18:08:13 +02:00
|
|
|
|
After one of this commands is sent to pdb, pdbtracking session is
|
|
|
|
|
considered over.
|
|
|
|
|
|
|
|
|
|
See `python-pdbtrack-activate' for pdbtracking session overview."
|
|
|
|
|
:type 'list
|
|
|
|
|
:version "27.1")
|
|
|
|
|
|
|
|
|
|
(defcustom python-pdbtrack-kill-buffers t
|
|
|
|
|
"If non-nil, kill buffers when pdbtracking session is over.
|
|
|
|
|
Only buffers opened by pdbtracking will be killed.
|
|
|
|
|
|
|
|
|
|
See `python-pdbtrack-activate' for pdbtracking session overview."
|
|
|
|
|
:type 'boolean
|
|
|
|
|
:version "27.1")
|
|
|
|
|
|
2012-05-17 00:03:28 -03:00
|
|
|
|
(defvar python-pdbtrack-tracked-buffer nil
|
|
|
|
|
"Variable containing the value of the current tracked buffer.
|
|
|
|
|
Never set this variable directly, use
|
|
|
|
|
`python-pdbtrack-set-tracked-buffer' instead.")
|
|
|
|
|
|
|
|
|
|
(defvar python-pdbtrack-buffers-to-kill nil
|
|
|
|
|
"List of buffers to be deleted after tracking finishes.")
|
|
|
|
|
|
2019-11-02 18:08:13 +02:00
|
|
|
|
(defvar python-pdbtrack-prev-command-continue nil
|
2019-11-11 10:30:13 -08:00
|
|
|
|
"Is t if previous pdb command was `continue'.")
|
2019-11-02 18:08:13 +02:00
|
|
|
|
|
2012-05-17 00:03:28 -03:00
|
|
|
|
(defun python-pdbtrack-set-tracked-buffer (file-name)
|
|
|
|
|
"Set the buffer for FILE-NAME as the tracked buffer.
|
|
|
|
|
Internally it uses the `python-pdbtrack-tracked-buffer' variable.
|
|
|
|
|
Returns the tracked buffer."
|
2015-09-19 21:34:36 -04:00
|
|
|
|
(let* ((file-name-prospect (concat (file-remote-p default-directory)
|
|
|
|
|
file-name))
|
|
|
|
|
(file-buffer (get-file-buffer file-name-prospect)))
|
2019-11-02 18:08:13 +02:00
|
|
|
|
(unless file-buffer
|
2015-09-19 21:34:36 -04:00
|
|
|
|
(cond
|
|
|
|
|
((file-exists-p file-name-prospect)
|
|
|
|
|
(setq file-buffer (find-file-noselect file-name-prospect)))
|
|
|
|
|
((and (not (equal file-name file-name-prospect))
|
|
|
|
|
(file-exists-p file-name))
|
|
|
|
|
;; Fallback to a locally available copy of the file.
|
|
|
|
|
(setq file-buffer (find-file-noselect file-name-prospect))))
|
2019-11-02 18:08:13 +02:00
|
|
|
|
(when (and python-pdbtrack-kill-buffers
|
|
|
|
|
(not (member file-buffer python-pdbtrack-buffers-to-kill)))
|
2012-05-17 00:03:28 -03:00
|
|
|
|
(add-to-list 'python-pdbtrack-buffers-to-kill file-buffer)))
|
2019-11-02 18:08:13 +02:00
|
|
|
|
(setq python-pdbtrack-tracked-buffer file-buffer)
|
2012-05-17 00:03:28 -03:00
|
|
|
|
file-buffer))
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
2019-11-02 18:08:13 +02:00
|
|
|
|
(defun python-pdbtrack-unset-tracked-buffer ()
|
|
|
|
|
"Untrack currently tracked buffer."
|
2019-11-28 15:54:41 +02:00
|
|
|
|
(when (buffer-live-p python-pdbtrack-tracked-buffer)
|
2019-11-02 18:08:13 +02:00
|
|
|
|
(with-current-buffer python-pdbtrack-tracked-buffer
|
2019-11-28 15:54:41 +02:00
|
|
|
|
(set-marker overlay-arrow-position nil)))
|
|
|
|
|
(setq python-pdbtrack-tracked-buffer nil))
|
2019-11-02 18:08:13 +02:00
|
|
|
|
|
|
|
|
|
(defun python-pdbtrack-tracking-finish ()
|
|
|
|
|
"Finish tracking."
|
|
|
|
|
(python-pdbtrack-unset-tracked-buffer)
|
|
|
|
|
(when python-pdbtrack-kill-buffers
|
|
|
|
|
(mapc #'(lambda (buffer)
|
|
|
|
|
(ignore-errors (kill-buffer buffer)))
|
|
|
|
|
python-pdbtrack-buffers-to-kill))
|
|
|
|
|
(setq python-pdbtrack-buffers-to-kill nil))
|
|
|
|
|
|
|
|
|
|
(defun python-pdbtrack-process-sentinel (process _event)
|
|
|
|
|
"Untrack buffers when PROCESS is killed."
|
|
|
|
|
(unless (process-live-p process)
|
|
|
|
|
(let ((buffer (process-buffer process)))
|
|
|
|
|
(when (buffer-live-p buffer)
|
|
|
|
|
(with-current-buffer buffer
|
|
|
|
|
(python-pdbtrack-tracking-finish))))))
|
|
|
|
|
|
|
|
|
|
(defun python-pdbtrack-comint-input-filter-function (input)
|
|
|
|
|
"Finish tracking session depending on command in INPUT.
|
2019-12-10 20:04:36 -08:00
|
|
|
|
Commands that must finish the tracking session are listed in
|
|
|
|
|
`python-pdbtrack-exit-command'."
|
2019-11-02 18:08:13 +02:00
|
|
|
|
(when (and python-pdbtrack-tracked-buffer
|
|
|
|
|
;; Empty input is sent by C-d or `comint-send-eof'
|
|
|
|
|
(or (string-empty-p input)
|
|
|
|
|
;; "n some text" is "n" command for pdb. Split input and get firs part
|
|
|
|
|
(let* ((command (car (split-string (string-trim input) " "))))
|
|
|
|
|
(setq python-pdbtrack-prev-command-continue
|
|
|
|
|
(or (member command python-pdbtrack-continue-command)
|
|
|
|
|
;; if command is empty and previous command was 'continue'
|
|
|
|
|
;; then current command is 'continue' too.
|
|
|
|
|
(and (string-empty-p command)
|
|
|
|
|
python-pdbtrack-prev-command-continue)))
|
|
|
|
|
(or python-pdbtrack-prev-command-continue
|
|
|
|
|
(member command python-pdbtrack-exit-command)))))
|
|
|
|
|
(python-pdbtrack-tracking-finish)))
|
|
|
|
|
|
2012-05-17 00:02:52 -03:00
|
|
|
|
(defun python-pdbtrack-comint-output-filter-function (output)
|
|
|
|
|
"Move overlay arrow to current pdb line in tracked buffer.
|
|
|
|
|
Argument OUTPUT is a string with the output from the comint process."
|
2012-05-17 00:03:31 -03:00
|
|
|
|
(when (and python-pdbtrack-activate (not (string= output "")))
|
2012-05-17 00:03:28 -03:00
|
|
|
|
(let* ((full-output (ansi-color-filter-apply
|
|
|
|
|
(buffer-substring comint-last-input-end (point-max))))
|
|
|
|
|
(line-number)
|
|
|
|
|
(file-name
|
|
|
|
|
(with-temp-buffer
|
|
|
|
|
(insert full-output)
|
2013-01-30 12:02:58 -03:00
|
|
|
|
;; When the debugger encounters a pdb.set_trace()
|
|
|
|
|
;; command, it prints a single stack frame. Sometimes
|
|
|
|
|
;; it prints a bit of extra information about the
|
|
|
|
|
;; arguments of the present function. When ipdb
|
|
|
|
|
;; encounters an exception, it prints the _entire_ stack
|
|
|
|
|
;; trace. To handle all of these cases, we want to find
|
|
|
|
|
;; the _last_ stack frame printed in the most recent
|
2013-02-01 22:04:06 -08:00
|
|
|
|
;; batch of output, then jump to the corresponding
|
2013-01-30 12:02:58 -03:00
|
|
|
|
;; file/line number.
|
2019-11-02 18:08:13 +02:00
|
|
|
|
;; Parse output only if at pdb prompt to avoid double code
|
|
|
|
|
;; run in situation when output and pdb prompt received in
|
|
|
|
|
;; different hunks
|
2013-01-30 12:02:58 -03:00
|
|
|
|
(goto-char (point-max))
|
2019-11-02 18:08:13 +02:00
|
|
|
|
(goto-char (line-beginning-position))
|
|
|
|
|
(when (and (looking-at python-shell-prompt-pdb-regexp)
|
|
|
|
|
(re-search-backward python-pdbtrack-stacktrace-info-regexp nil t))
|
2012-05-17 00:03:28 -03:00
|
|
|
|
(setq line-number (string-to-number
|
|
|
|
|
(match-string-no-properties 2)))
|
|
|
|
|
(match-string-no-properties 1)))))
|
2019-11-02 18:08:13 +02:00
|
|
|
|
(when (and file-name line-number)
|
|
|
|
|
(if (string-prefix-p "<" file-name)
|
|
|
|
|
;; Finish tracking session if stacktrace info is like
|
|
|
|
|
;; "> <stdin>(1)<module>()->None"
|
|
|
|
|
(python-pdbtrack-tracking-finish)
|
|
|
|
|
(python-pdbtrack-unset-tracked-buffer)
|
|
|
|
|
(let* ((tracked-buffer (python-pdbtrack-set-tracked-buffer file-name))
|
2012-05-17 00:03:28 -03:00
|
|
|
|
(shell-buffer (current-buffer))
|
|
|
|
|
(tracked-buffer-window (get-buffer-window tracked-buffer))
|
2012-05-17 00:02:52 -03:00
|
|
|
|
(tracked-buffer-line-pos))
|
2012-05-17 00:03:28 -03:00
|
|
|
|
(with-current-buffer tracked-buffer
|
2012-05-17 00:03:28 -03:00
|
|
|
|
(set (make-local-variable 'overlay-arrow-position) (make-marker))
|
|
|
|
|
(setq tracked-buffer-line-pos (progn
|
|
|
|
|
(goto-char (point-min))
|
|
|
|
|
(forward-line (1- line-number))
|
|
|
|
|
(point-marker)))
|
|
|
|
|
(when tracked-buffer-window
|
|
|
|
|
(set-window-point
|
|
|
|
|
tracked-buffer-window tracked-buffer-line-pos))
|
|
|
|
|
(set-marker overlay-arrow-position tracked-buffer-line-pos))
|
2012-05-17 00:03:28 -03:00
|
|
|
|
(pop-to-buffer tracked-buffer)
|
2019-11-02 18:08:13 +02:00
|
|
|
|
(switch-to-buffer-other-window shell-buffer))))))
|
2012-05-17 00:02:52 -03:00
|
|
|
|
output)
|
|
|
|
|
|
2019-11-02 18:08:13 +02:00
|
|
|
|
(defun python-pdbtrack-setup-tracking ()
|
|
|
|
|
"Setup pdb tracking in current buffer."
|
|
|
|
|
(make-local-variable 'python-pdbtrack-buffers-to-kill)
|
|
|
|
|
(make-local-variable 'python-pdbtrack-tracked-buffer)
|
|
|
|
|
(add-to-list (make-local-variable 'comint-input-filter-functions)
|
|
|
|
|
#'python-pdbtrack-comint-input-filter-function)
|
|
|
|
|
(add-to-list (make-local-variable 'comint-output-filter-functions)
|
|
|
|
|
#'python-pdbtrack-comint-output-filter-function)
|
|
|
|
|
(add-function :before (process-sentinel (get-buffer-process (current-buffer)))
|
|
|
|
|
#'python-pdbtrack-process-sentinel)
|
|
|
|
|
(add-hook 'kill-buffer-hook #'python-pdbtrack-tracking-finish nil t))
|
|
|
|
|
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
|
|
|
|
;;; Symbol completion
|
|
|
|
|
|
2014-07-28 01:32:28 -03:00
|
|
|
|
(defun python-completion-at-point ()
|
|
|
|
|
"Function for `completion-at-point-functions' in `python-mode'.
|
lisp/progmodes/python.el: Fix docstring typos.
(defconst, python-syntax-count-quotes)
(python-indent-region, python-indent-shift-right)
(python-indent-dedent-line-backspace, python-nav-backward-sexp)
(python-nav-backward-sexp-safe, python-nav-backward-up-list)
(python-shell-prompt-block-regexp, python-shell-prompt-output-regexp)
(python-shell-prompt-pdb-regexp, python-shell-enable-font-lock)
(inferior-python-mode, python-shell-make-comint, run-python-internal)
(python-shell-buffer-substring, python-shell-send-buffer)
(python-pdbtrack-activate, python-pdbtrack-stacktrace-info-regexp)
(python-completion-complete-at-point, python-fill-docstring-style)
(python-eldoc-function, python-imenu-format-item-label)
(python-imenu-format-parent-item-label)
(python-imenu-format-parent-item-jump-label)
(python-imenu--build-tree, python-imenu-create-index)
(python-imenu-create-flat-index): Fix docstring typos.
(python-indent-context, python-shell-prompt-regexp, run-python):
Remove superfluous backslashes.
(python-indent-line, python-nav-beginning-of-defun)
(python-shell-get-buffer, python-shell-get-process)
(python-info-current-defun, python-info-current-line-comment-p)
(python-info-current-line-empty-p, python-util-popn): Doc fixes.
(python-indent-post-self-insert-function, python-shell-send-file)
(python-shell-completion-get-completions)
(python-shell-completion-complete-or-indent)
(python-eldoc--get-doc-at-point): Reflow docstrings.
2014-03-15 18:37:58 +01:00
|
|
|
|
For this to work as best as possible you should call
|
2012-05-17 00:02:52 -03:00
|
|
|
|
`python-shell-send-buffer' from time to time so context in
|
lisp/progmodes/python.el: Fix docstring typos.
(defconst, python-syntax-count-quotes)
(python-indent-region, python-indent-shift-right)
(python-indent-dedent-line-backspace, python-nav-backward-sexp)
(python-nav-backward-sexp-safe, python-nav-backward-up-list)
(python-shell-prompt-block-regexp, python-shell-prompt-output-regexp)
(python-shell-prompt-pdb-regexp, python-shell-enable-font-lock)
(inferior-python-mode, python-shell-make-comint, run-python-internal)
(python-shell-buffer-substring, python-shell-send-buffer)
(python-pdbtrack-activate, python-pdbtrack-stacktrace-info-regexp)
(python-completion-complete-at-point, python-fill-docstring-style)
(python-eldoc-function, python-imenu-format-item-label)
(python-imenu-format-parent-item-label)
(python-imenu-format-parent-item-jump-label)
(python-imenu--build-tree, python-imenu-create-index)
(python-imenu-create-flat-index): Fix docstring typos.
(python-indent-context, python-shell-prompt-regexp, run-python):
Remove superfluous backslashes.
(python-indent-line, python-nav-beginning-of-defun)
(python-shell-get-buffer, python-shell-get-process)
(python-info-current-defun, python-info-current-line-comment-p)
(python-info-current-line-empty-p, python-util-popn): Doc fixes.
(python-indent-post-self-insert-function, python-shell-send-file)
(python-shell-completion-get-completions)
(python-shell-completion-complete-or-indent)
(python-eldoc--get-doc-at-point): Reflow docstrings.
2014-03-15 18:37:58 +01:00
|
|
|
|
inferior Python process is updated properly."
|
2012-05-17 00:02:52 -03:00
|
|
|
|
(let ((process (python-shell-get-process)))
|
2014-07-27 04:05:13 -03:00
|
|
|
|
(when process
|
2014-07-28 01:32:28 -03:00
|
|
|
|
(python-shell-completion-at-point process))))
|
|
|
|
|
|
|
|
|
|
(define-obsolete-function-alias
|
|
|
|
|
'python-completion-complete-at-point
|
|
|
|
|
'python-completion-at-point
|
2014-09-29 14:14:08 -04:00
|
|
|
|
"25.1")
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;;; Fill paragraph
|
|
|
|
|
|
2012-05-17 00:03:11 -03:00
|
|
|
|
(defcustom python-fill-comment-function 'python-fill-comment
|
|
|
|
|
"Function to fill comments.
|
2012-10-08 19:18:05 -03:00
|
|
|
|
This is the function used by `python-fill-paragraph' to
|
2012-05-17 00:03:11 -03:00
|
|
|
|
fill comments."
|
|
|
|
|
:type 'symbol
|
2012-10-04 13:39:37 -03:00
|
|
|
|
:group 'python)
|
2012-05-17 00:03:11 -03:00
|
|
|
|
|
|
|
|
|
(defcustom python-fill-string-function 'python-fill-string
|
|
|
|
|
"Function to fill strings.
|
2012-10-08 19:18:05 -03:00
|
|
|
|
This is the function used by `python-fill-paragraph' to
|
2012-05-17 00:03:11 -03:00
|
|
|
|
fill strings."
|
|
|
|
|
:type 'symbol
|
2012-10-04 13:39:37 -03:00
|
|
|
|
:group 'python)
|
2012-05-17 00:03:11 -03:00
|
|
|
|
|
|
|
|
|
(defcustom python-fill-decorator-function 'python-fill-decorator
|
|
|
|
|
"Function to fill decorators.
|
2012-10-08 19:18:05 -03:00
|
|
|
|
This is the function used by `python-fill-paragraph' to
|
2012-05-17 00:03:11 -03:00
|
|
|
|
fill decorators."
|
|
|
|
|
:type 'symbol
|
2012-10-04 13:39:37 -03:00
|
|
|
|
:group 'python)
|
2012-05-17 00:03:11 -03:00
|
|
|
|
|
|
|
|
|
(defcustom python-fill-paren-function 'python-fill-paren
|
|
|
|
|
"Function to fill parens.
|
2012-10-08 19:18:05 -03:00
|
|
|
|
This is the function used by `python-fill-paragraph' to
|
2012-05-17 00:03:11 -03:00
|
|
|
|
fill parens."
|
|
|
|
|
:type 'symbol
|
2012-10-04 13:39:37 -03:00
|
|
|
|
:group 'python)
|
|
|
|
|
|
2012-10-05 10:42:08 -03:00
|
|
|
|
(defcustom python-fill-docstring-style 'pep-257
|
2012-10-04 13:39:37 -03:00
|
|
|
|
"Style used to fill docstrings.
|
|
|
|
|
This affects `python-fill-string' behavior with regards to
|
|
|
|
|
triple quotes positioning.
|
|
|
|
|
|
lisp/progmodes/python.el: Fix docstring typos.
(defconst, python-syntax-count-quotes)
(python-indent-region, python-indent-shift-right)
(python-indent-dedent-line-backspace, python-nav-backward-sexp)
(python-nav-backward-sexp-safe, python-nav-backward-up-list)
(python-shell-prompt-block-regexp, python-shell-prompt-output-regexp)
(python-shell-prompt-pdb-regexp, python-shell-enable-font-lock)
(inferior-python-mode, python-shell-make-comint, run-python-internal)
(python-shell-buffer-substring, python-shell-send-buffer)
(python-pdbtrack-activate, python-pdbtrack-stacktrace-info-regexp)
(python-completion-complete-at-point, python-fill-docstring-style)
(python-eldoc-function, python-imenu-format-item-label)
(python-imenu-format-parent-item-label)
(python-imenu-format-parent-item-jump-label)
(python-imenu--build-tree, python-imenu-create-index)
(python-imenu-create-flat-index): Fix docstring typos.
(python-indent-context, python-shell-prompt-regexp, run-python):
Remove superfluous backslashes.
(python-indent-line, python-nav-beginning-of-defun)
(python-shell-get-buffer, python-shell-get-process)
(python-info-current-defun, python-info-current-line-comment-p)
(python-info-current-line-empty-p, python-util-popn): Doc fixes.
(python-indent-post-self-insert-function, python-shell-send-file)
(python-shell-completion-get-completions)
(python-shell-completion-complete-or-indent)
(python-eldoc--get-doc-at-point): Reflow docstrings.
2014-03-15 18:37:58 +01:00
|
|
|
|
Possible values are `django', `onetwo', `pep-257', `pep-257-nn',
|
|
|
|
|
`symmetric', and nil. A value of nil won't care about quotes
|
2012-10-05 10:42:08 -03:00
|
|
|
|
position and will treat docstrings a normal string, any other
|
|
|
|
|
value may result in one of the following docstring styles:
|
2012-10-04 13:39:37 -03:00
|
|
|
|
|
lisp/progmodes/python.el: Fix docstring typos.
(defconst, python-syntax-count-quotes)
(python-indent-region, python-indent-shift-right)
(python-indent-dedent-line-backspace, python-nav-backward-sexp)
(python-nav-backward-sexp-safe, python-nav-backward-up-list)
(python-shell-prompt-block-regexp, python-shell-prompt-output-regexp)
(python-shell-prompt-pdb-regexp, python-shell-enable-font-lock)
(inferior-python-mode, python-shell-make-comint, run-python-internal)
(python-shell-buffer-substring, python-shell-send-buffer)
(python-pdbtrack-activate, python-pdbtrack-stacktrace-info-regexp)
(python-completion-complete-at-point, python-fill-docstring-style)
(python-eldoc-function, python-imenu-format-item-label)
(python-imenu-format-parent-item-label)
(python-imenu-format-parent-item-jump-label)
(python-imenu--build-tree, python-imenu-create-index)
(python-imenu-create-flat-index): Fix docstring typos.
(python-indent-context, python-shell-prompt-regexp, run-python):
Remove superfluous backslashes.
(python-indent-line, python-nav-beginning-of-defun)
(python-shell-get-buffer, python-shell-get-process)
(python-info-current-defun, python-info-current-line-comment-p)
(python-info-current-line-empty-p, python-util-popn): Doc fixes.
(python-indent-post-self-insert-function, python-shell-send-file)
(python-shell-completion-get-completions)
(python-shell-completion-complete-or-indent)
(python-eldoc--get-doc-at-point): Reflow docstrings.
2014-03-15 18:37:58 +01:00
|
|
|
|
`django':
|
2012-10-04 13:39:37 -03:00
|
|
|
|
|
|
|
|
|
\"\"\"
|
|
|
|
|
Process foo, return bar.
|
|
|
|
|
\"\"\"
|
|
|
|
|
|
|
|
|
|
\"\"\"
|
|
|
|
|
Process foo, return bar.
|
|
|
|
|
|
|
|
|
|
If processing fails throw ProcessingError.
|
|
|
|
|
\"\"\"
|
|
|
|
|
|
lisp/progmodes/python.el: Fix docstring typos.
(defconst, python-syntax-count-quotes)
(python-indent-region, python-indent-shift-right)
(python-indent-dedent-line-backspace, python-nav-backward-sexp)
(python-nav-backward-sexp-safe, python-nav-backward-up-list)
(python-shell-prompt-block-regexp, python-shell-prompt-output-regexp)
(python-shell-prompt-pdb-regexp, python-shell-enable-font-lock)
(inferior-python-mode, python-shell-make-comint, run-python-internal)
(python-shell-buffer-substring, python-shell-send-buffer)
(python-pdbtrack-activate, python-pdbtrack-stacktrace-info-regexp)
(python-completion-complete-at-point, python-fill-docstring-style)
(python-eldoc-function, python-imenu-format-item-label)
(python-imenu-format-parent-item-label)
(python-imenu-format-parent-item-jump-label)
(python-imenu--build-tree, python-imenu-create-index)
(python-imenu-create-flat-index): Fix docstring typos.
(python-indent-context, python-shell-prompt-regexp, run-python):
Remove superfluous backslashes.
(python-indent-line, python-nav-beginning-of-defun)
(python-shell-get-buffer, python-shell-get-process)
(python-info-current-defun, python-info-current-line-comment-p)
(python-info-current-line-empty-p, python-util-popn): Doc fixes.
(python-indent-post-self-insert-function, python-shell-send-file)
(python-shell-completion-get-completions)
(python-shell-completion-complete-or-indent)
(python-eldoc--get-doc-at-point): Reflow docstrings.
2014-03-15 18:37:58 +01:00
|
|
|
|
`onetwo':
|
2012-10-05 10:42:08 -03:00
|
|
|
|
|
|
|
|
|
\"\"\"Process foo, return bar.\"\"\"
|
|
|
|
|
|
|
|
|
|
\"\"\"
|
|
|
|
|
Process foo, return bar.
|
|
|
|
|
|
|
|
|
|
If processing fails throw ProcessingError.
|
|
|
|
|
|
|
|
|
|
\"\"\"
|
|
|
|
|
|
lisp/progmodes/python.el: Fix docstring typos.
(defconst, python-syntax-count-quotes)
(python-indent-region, python-indent-shift-right)
(python-indent-dedent-line-backspace, python-nav-backward-sexp)
(python-nav-backward-sexp-safe, python-nav-backward-up-list)
(python-shell-prompt-block-regexp, python-shell-prompt-output-regexp)
(python-shell-prompt-pdb-regexp, python-shell-enable-font-lock)
(inferior-python-mode, python-shell-make-comint, run-python-internal)
(python-shell-buffer-substring, python-shell-send-buffer)
(python-pdbtrack-activate, python-pdbtrack-stacktrace-info-regexp)
(python-completion-complete-at-point, python-fill-docstring-style)
(python-eldoc-function, python-imenu-format-item-label)
(python-imenu-format-parent-item-label)
(python-imenu-format-parent-item-jump-label)
(python-imenu--build-tree, python-imenu-create-index)
(python-imenu-create-flat-index): Fix docstring typos.
(python-indent-context, python-shell-prompt-regexp, run-python):
Remove superfluous backslashes.
(python-indent-line, python-nav-beginning-of-defun)
(python-shell-get-buffer, python-shell-get-process)
(python-info-current-defun, python-info-current-line-comment-p)
(python-info-current-line-empty-p, python-util-popn): Doc fixes.
(python-indent-post-self-insert-function, python-shell-send-file)
(python-shell-completion-get-completions)
(python-shell-completion-complete-or-indent)
(python-eldoc--get-doc-at-point): Reflow docstrings.
2014-03-15 18:37:58 +01:00
|
|
|
|
`pep-257':
|
2012-10-04 13:39:37 -03:00
|
|
|
|
|
|
|
|
|
\"\"\"Process foo, return bar.\"\"\"
|
|
|
|
|
|
|
|
|
|
\"\"\"Process foo, return bar.
|
|
|
|
|
|
|
|
|
|
If processing fails throw ProcessingError.
|
|
|
|
|
|
|
|
|
|
\"\"\"
|
|
|
|
|
|
lisp/progmodes/python.el: Fix docstring typos.
(defconst, python-syntax-count-quotes)
(python-indent-region, python-indent-shift-right)
(python-indent-dedent-line-backspace, python-nav-backward-sexp)
(python-nav-backward-sexp-safe, python-nav-backward-up-list)
(python-shell-prompt-block-regexp, python-shell-prompt-output-regexp)
(python-shell-prompt-pdb-regexp, python-shell-enable-font-lock)
(inferior-python-mode, python-shell-make-comint, run-python-internal)
(python-shell-buffer-substring, python-shell-send-buffer)
(python-pdbtrack-activate, python-pdbtrack-stacktrace-info-regexp)
(python-completion-complete-at-point, python-fill-docstring-style)
(python-eldoc-function, python-imenu-format-item-label)
(python-imenu-format-parent-item-label)
(python-imenu-format-parent-item-jump-label)
(python-imenu--build-tree, python-imenu-create-index)
(python-imenu-create-flat-index): Fix docstring typos.
(python-indent-context, python-shell-prompt-regexp, run-python):
Remove superfluous backslashes.
(python-indent-line, python-nav-beginning-of-defun)
(python-shell-get-buffer, python-shell-get-process)
(python-info-current-defun, python-info-current-line-comment-p)
(python-info-current-line-empty-p, python-util-popn): Doc fixes.
(python-indent-post-self-insert-function, python-shell-send-file)
(python-shell-completion-get-completions)
(python-shell-completion-complete-or-indent)
(python-eldoc--get-doc-at-point): Reflow docstrings.
2014-03-15 18:37:58 +01:00
|
|
|
|
`pep-257-nn':
|
2012-10-04 13:39:37 -03:00
|
|
|
|
|
|
|
|
|
\"\"\"Process foo, return bar.\"\"\"
|
|
|
|
|
|
|
|
|
|
\"\"\"Process foo, return bar.
|
|
|
|
|
|
|
|
|
|
If processing fails throw ProcessingError.
|
|
|
|
|
\"\"\"
|
|
|
|
|
|
lisp/progmodes/python.el: Fix docstring typos.
(defconst, python-syntax-count-quotes)
(python-indent-region, python-indent-shift-right)
(python-indent-dedent-line-backspace, python-nav-backward-sexp)
(python-nav-backward-sexp-safe, python-nav-backward-up-list)
(python-shell-prompt-block-regexp, python-shell-prompt-output-regexp)
(python-shell-prompt-pdb-regexp, python-shell-enable-font-lock)
(inferior-python-mode, python-shell-make-comint, run-python-internal)
(python-shell-buffer-substring, python-shell-send-buffer)
(python-pdbtrack-activate, python-pdbtrack-stacktrace-info-regexp)
(python-completion-complete-at-point, python-fill-docstring-style)
(python-eldoc-function, python-imenu-format-item-label)
(python-imenu-format-parent-item-label)
(python-imenu-format-parent-item-jump-label)
(python-imenu--build-tree, python-imenu-create-index)
(python-imenu-create-flat-index): Fix docstring typos.
(python-indent-context, python-shell-prompt-regexp, run-python):
Remove superfluous backslashes.
(python-indent-line, python-nav-beginning-of-defun)
(python-shell-get-buffer, python-shell-get-process)
(python-info-current-defun, python-info-current-line-comment-p)
(python-info-current-line-empty-p, python-util-popn): Doc fixes.
(python-indent-post-self-insert-function, python-shell-send-file)
(python-shell-completion-get-completions)
(python-shell-completion-complete-or-indent)
(python-eldoc--get-doc-at-point): Reflow docstrings.
2014-03-15 18:37:58 +01:00
|
|
|
|
`symmetric':
|
2012-10-04 13:39:37 -03:00
|
|
|
|
|
|
|
|
|
\"\"\"Process foo, return bar.\"\"\"
|
|
|
|
|
|
|
|
|
|
\"\"\"
|
|
|
|
|
Process foo, return bar.
|
|
|
|
|
|
|
|
|
|
If processing fails throw ProcessingError.
|
|
|
|
|
\"\"\""
|
2012-10-05 10:42:08 -03:00
|
|
|
|
:type '(choice
|
|
|
|
|
(const :tag "Don't format docstrings" nil)
|
|
|
|
|
(const :tag "Django's coding standards style." django)
|
|
|
|
|
(const :tag "One newline and start and Two at end style." onetwo)
|
|
|
|
|
(const :tag "PEP-257 with 2 newlines at end of string." pep-257)
|
|
|
|
|
(const :tag "PEP-257 with 1 newline at end of string." pep-257-nn)
|
|
|
|
|
(const :tag "Symmetric style." symmetric))
|
2012-05-17 00:03:11 -03:00
|
|
|
|
:group 'python
|
2012-10-05 10:42:08 -03:00
|
|
|
|
:safe (lambda (val)
|
|
|
|
|
(memq val '(django onetwo pep-257 pep-257-nn symmetric nil))))
|
2012-05-17 00:03:11 -03:00
|
|
|
|
|
2012-10-08 19:18:05 -03:00
|
|
|
|
(defun python-fill-paragraph (&optional justify)
|
2012-05-17 00:02:52 -03:00
|
|
|
|
"`fill-paragraph-function' handling multi-line strings and possibly comments.
|
|
|
|
|
If any of the current line is in or at the end of a multi-line string,
|
|
|
|
|
fill the string or the paragraph of it that point is in, preserving
|
2012-05-17 00:02:56 -03:00
|
|
|
|
the string's indentation.
|
|
|
|
|
Optional argument JUSTIFY defines if the paragraph should be justified."
|
2012-05-17 00:02:52 -03:00
|
|
|
|
(interactive "P")
|
|
|
|
|
(save-excursion
|
|
|
|
|
(cond
|
|
|
|
|
;; Comments
|
2012-10-04 13:39:37 -03:00
|
|
|
|
((python-syntax-context 'comment)
|
|
|
|
|
(funcall python-fill-comment-function justify))
|
2012-05-17 00:03:11 -03:00
|
|
|
|
;; Strings/Docstrings
|
2012-10-04 13:39:37 -03:00
|
|
|
|
((save-excursion (or (python-syntax-context 'string)
|
|
|
|
|
(equal (string-to-syntax "|")
|
|
|
|
|
(syntax-after (point)))))
|
2012-05-17 00:03:11 -03:00
|
|
|
|
(funcall python-fill-string-function justify))
|
2012-05-17 00:02:52 -03:00
|
|
|
|
;; Decorators
|
|
|
|
|
((equal (char-after (save-excursion
|
2012-10-08 19:18:05 -03:00
|
|
|
|
(python-nav-beginning-of-statement))) ?@)
|
2012-05-17 00:03:11 -03:00
|
|
|
|
(funcall python-fill-decorator-function justify))
|
2012-05-17 00:02:52 -03:00
|
|
|
|
;; Parens
|
2012-08-07 23:30:08 -03:00
|
|
|
|
((or (python-syntax-context 'paren)
|
2012-05-17 00:02:52 -03:00
|
|
|
|
(looking-at (python-rx open-paren))
|
|
|
|
|
(save-excursion
|
|
|
|
|
(skip-syntax-forward "^(" (line-end-position))
|
|
|
|
|
(looking-at (python-rx open-paren))))
|
2012-05-17 00:03:11 -03:00
|
|
|
|
(funcall python-fill-paren-function justify))
|
2012-05-17 00:02:52 -03:00
|
|
|
|
(t t))))
|
|
|
|
|
|
2012-05-17 00:03:11 -03:00
|
|
|
|
(defun python-fill-comment (&optional justify)
|
2012-10-08 19:18:05 -03:00
|
|
|
|
"Comment fill function for `python-fill-paragraph'.
|
2012-05-17 00:03:13 -03:00
|
|
|
|
JUSTIFY should be used (if applicable) as in `fill-paragraph'."
|
2012-05-17 00:03:11 -03:00
|
|
|
|
(fill-comment-paragraph justify))
|
|
|
|
|
|
|
|
|
|
(defun python-fill-string (&optional justify)
|
2012-10-08 19:18:05 -03:00
|
|
|
|
"String fill function for `python-fill-paragraph'.
|
2012-05-17 00:03:13 -03:00
|
|
|
|
JUSTIFY should be used (if applicable) as in `fill-paragraph'."
|
2013-09-04 23:46:34 -04:00
|
|
|
|
(let* ((str-start-pos
|
2012-12-29 08:04:55 -03:00
|
|
|
|
(set-marker
|
|
|
|
|
(make-marker)
|
|
|
|
|
(or (python-syntax-context 'string)
|
|
|
|
|
(and (equal (string-to-syntax "|")
|
|
|
|
|
(syntax-after (point)))
|
|
|
|
|
(point)))))
|
2012-10-04 13:39:37 -03:00
|
|
|
|
(num-quotes (python-syntax-count-quotes
|
|
|
|
|
(char-after str-start-pos) str-start-pos))
|
|
|
|
|
(str-end-pos
|
|
|
|
|
(save-excursion
|
|
|
|
|
(goto-char (+ str-start-pos num-quotes))
|
|
|
|
|
(or (re-search-forward (rx (syntax string-delimiter)) nil t)
|
|
|
|
|
(goto-char (point-max)))
|
|
|
|
|
(point-marker)))
|
|
|
|
|
(multi-line-p
|
|
|
|
|
;; Docstring styles may vary for oneliners and multi-liners.
|
|
|
|
|
(> (count-matches "\n" str-start-pos str-end-pos) 0))
|
|
|
|
|
(delimiters-style
|
2012-11-19 16:30:55 -05:00
|
|
|
|
(pcase python-fill-docstring-style
|
2012-10-04 13:39:37 -03:00
|
|
|
|
;; delimiters-style is a cons cell with the form
|
|
|
|
|
;; (START-NEWLINES . END-NEWLINES). When any of the sexps
|
|
|
|
|
;; is NIL means to not add any newlines for start or end
|
2012-10-05 10:42:08 -03:00
|
|
|
|
;; of docstring. See `python-fill-docstring-style' for a
|
2012-10-04 13:39:37 -03:00
|
|
|
|
;; graphic idea of each style.
|
2018-11-05 01:22:15 +01:00
|
|
|
|
('django (cons 1 1))
|
|
|
|
|
('onetwo (and multi-line-p (cons 1 2)))
|
|
|
|
|
('pep-257 (and multi-line-p (cons nil 2)))
|
|
|
|
|
('pep-257-nn (and multi-line-p (cons nil 1)))
|
|
|
|
|
('symmetric (and multi-line-p (cons 1 1)))))
|
2012-10-04 13:39:37 -03:00
|
|
|
|
(fill-paragraph-function))
|
2012-05-17 00:03:11 -03:00
|
|
|
|
(save-restriction
|
2012-10-04 13:39:37 -03:00
|
|
|
|
(narrow-to-region str-start-pos str-end-pos)
|
|
|
|
|
(fill-paragraph justify))
|
|
|
|
|
(save-excursion
|
2015-04-05 23:58:13 -03:00
|
|
|
|
(when (and (python-info-docstring-p) python-fill-docstring-style)
|
2012-10-04 13:39:37 -03:00
|
|
|
|
;; Add the number of newlines indicated by the selected style
|
|
|
|
|
;; at the start of the docstring.
|
|
|
|
|
(goto-char (+ str-start-pos num-quotes))
|
|
|
|
|
(delete-region (point) (progn
|
|
|
|
|
(skip-syntax-forward "> ")
|
|
|
|
|
(point)))
|
|
|
|
|
(and (car delimiters-style)
|
|
|
|
|
(or (newline (car delimiters-style)) t)
|
|
|
|
|
;; Indent only if a newline is added.
|
|
|
|
|
(indent-according-to-mode))
|
|
|
|
|
;; Add the number of newlines indicated by the selected style
|
|
|
|
|
;; at the end of the docstring.
|
|
|
|
|
(goto-char (if (not (= str-end-pos (point-max)))
|
|
|
|
|
(- str-end-pos num-quotes)
|
|
|
|
|
str-end-pos))
|
|
|
|
|
(delete-region (point) (progn
|
|
|
|
|
(skip-syntax-backward "> ")
|
|
|
|
|
(point)))
|
|
|
|
|
(and (cdr delimiters-style)
|
|
|
|
|
;; Add newlines only if string ends.
|
|
|
|
|
(not (= str-end-pos (point-max)))
|
|
|
|
|
(or (newline (cdr delimiters-style)) t)
|
|
|
|
|
;; Again indent only if a newline is added.
|
|
|
|
|
(indent-according-to-mode))))) t)
|
2012-05-17 00:03:11 -03:00
|
|
|
|
|
2013-09-04 23:46:34 -04:00
|
|
|
|
(defun python-fill-decorator (&optional _justify)
|
2012-10-08 19:18:05 -03:00
|
|
|
|
"Decorator fill function for `python-fill-paragraph'.
|
2012-05-17 00:03:13 -03:00
|
|
|
|
JUSTIFY should be used (if applicable) as in `fill-paragraph'."
|
2012-05-17 00:03:11 -03:00
|
|
|
|
t)
|
|
|
|
|
|
|
|
|
|
(defun python-fill-paren (&optional justify)
|
2012-10-08 19:18:05 -03:00
|
|
|
|
"Paren fill function for `python-fill-paragraph'.
|
2012-05-17 00:03:13 -03:00
|
|
|
|
JUSTIFY should be used (if applicable) as in `fill-paragraph'."
|
2012-05-17 00:03:11 -03:00
|
|
|
|
(save-restriction
|
|
|
|
|
(narrow-to-region (progn
|
2012-08-07 23:30:08 -03:00
|
|
|
|
(while (python-syntax-context 'paren)
|
2014-10-03 22:35:28 -04:00
|
|
|
|
(goto-char (1- (point))))
|
2012-05-17 00:03:11 -03:00
|
|
|
|
(line-beginning-position))
|
|
|
|
|
(progn
|
2012-08-07 23:30:08 -03:00
|
|
|
|
(when (not (python-syntax-context 'paren))
|
2012-05-17 00:03:11 -03:00
|
|
|
|
(end-of-line)
|
2012-08-07 23:30:08 -03:00
|
|
|
|
(when (not (python-syntax-context 'paren))
|
2012-05-17 00:03:11 -03:00
|
|
|
|
(skip-syntax-backward "^)")))
|
2014-09-30 19:00:57 -04:00
|
|
|
|
(while (and (python-syntax-context 'paren)
|
|
|
|
|
(not (eobp)))
|
2014-10-03 22:35:28 -04:00
|
|
|
|
(goto-char (1+ (point))))
|
|
|
|
|
(point)))
|
2012-05-17 00:03:11 -03:00
|
|
|
|
(let ((paragraph-start "\f\\|[ \t]*$")
|
|
|
|
|
(paragraph-separate ",")
|
|
|
|
|
(fill-paragraph-function))
|
|
|
|
|
(goto-char (point-min))
|
|
|
|
|
(fill-paragraph justify))
|
|
|
|
|
(while (not (eobp))
|
|
|
|
|
(forward-line 1)
|
|
|
|
|
(python-indent-line)
|
2014-09-30 19:00:57 -04:00
|
|
|
|
(goto-char (line-end-position))))
|
|
|
|
|
t)
|
2012-05-17 00:03:11 -03:00
|
|
|
|
|
2019-09-08 10:42:19 -04:00
|
|
|
|
(defun python-do-auto-fill ()
|
|
|
|
|
"Like `do-auto-fill', but bind `fill-indent-according-to-mode'."
|
|
|
|
|
;; See Bug#36056.
|
|
|
|
|
(let ((fill-indent-according-to-mode t))
|
|
|
|
|
(do-auto-fill)))
|
|
|
|
|
|
2012-05-17 00:02:59 -03:00
|
|
|
|
|
2012-05-17 00:03:05 -03:00
|
|
|
|
;;; Skeletons
|
|
|
|
|
|
2017-12-20 16:05:46 -05:00
|
|
|
|
(define-obsolete-variable-alias
|
|
|
|
|
'python-use-skeletons 'python-skeleton-autoinsert "24.3")
|
|
|
|
|
|
2012-05-17 00:03:05 -03:00
|
|
|
|
(defcustom python-skeleton-autoinsert nil
|
|
|
|
|
"Non-nil means template skeletons will be automagically inserted.
|
|
|
|
|
This happens when pressing \"if<SPACE>\", for example, to prompt for
|
|
|
|
|
the if condition."
|
|
|
|
|
:type 'boolean
|
2012-05-17 00:03:23 -03:00
|
|
|
|
:group 'python
|
|
|
|
|
:safe 'booleanp)
|
2012-05-17 00:03:05 -03:00
|
|
|
|
|
|
|
|
|
(defvar python-skeleton-available '()
|
|
|
|
|
"Internal list of available skeletons.")
|
|
|
|
|
|
2013-04-16 13:28:11 -04:00
|
|
|
|
(define-abbrev-table 'python-mode-skeleton-abbrev-table ()
|
|
|
|
|
"Abbrev table for Python mode skeletons."
|
2012-05-17 00:03:05 -03:00
|
|
|
|
:case-fixed t
|
|
|
|
|
;; Allow / inside abbrevs.
|
|
|
|
|
:regexp "\\(?:^\\|[^/]\\)\\<\\([[:word:]/]+\\)\\W*"
|
|
|
|
|
;; Only expand in code.
|
|
|
|
|
:enable-function (lambda ()
|
|
|
|
|
(and
|
2012-08-07 23:30:08 -03:00
|
|
|
|
(not (python-syntax-comment-or-string-p))
|
2012-05-17 00:03:05 -03:00
|
|
|
|
python-skeleton-autoinsert)))
|
|
|
|
|
|
|
|
|
|
(defmacro python-skeleton-define (name doc &rest skel)
|
|
|
|
|
"Define a `python-mode' skeleton using NAME DOC and SKEL.
|
|
|
|
|
The skeleton will be bound to python-skeleton-NAME and will
|
2013-04-16 13:28:11 -04:00
|
|
|
|
be added to `python-mode-skeleton-abbrev-table'."
|
2012-06-18 16:41:23 -04:00
|
|
|
|
(declare (indent 2))
|
2012-05-17 00:03:05 -03:00
|
|
|
|
(let* ((name (symbol-name name))
|
2012-05-17 00:03:35 -03:00
|
|
|
|
(function-name (intern (concat "python-skeleton-" name))))
|
2012-05-17 00:03:05 -03:00
|
|
|
|
`(progn
|
2013-04-16 13:28:11 -04:00
|
|
|
|
(define-abbrev python-mode-skeleton-abbrev-table
|
|
|
|
|
,name "" ',function-name :system t)
|
2012-05-17 00:03:05 -03:00
|
|
|
|
(setq python-skeleton-available
|
|
|
|
|
(cons ',function-name python-skeleton-available))
|
|
|
|
|
(define-skeleton ,function-name
|
|
|
|
|
,(or doc
|
|
|
|
|
(format "Insert %s statement." name))
|
|
|
|
|
,@skel))))
|
2012-05-17 00:03:05 -03:00
|
|
|
|
|
2013-04-16 13:28:11 -04:00
|
|
|
|
(define-abbrev-table 'python-mode-abbrev-table ()
|
|
|
|
|
"Abbrev table for Python mode."
|
|
|
|
|
:parents (list python-mode-skeleton-abbrev-table))
|
|
|
|
|
|
2016-11-17 17:58:20 -05:00
|
|
|
|
(defmacro python-define-auxiliary-skeleton (name &optional doc &rest skel)
|
2012-05-17 00:03:05 -03:00
|
|
|
|
"Define a `python-mode' auxiliary skeleton using NAME DOC and SKEL.
|
|
|
|
|
The skeleton will be bound to python-skeleton-NAME."
|
2012-06-18 16:41:23 -04:00
|
|
|
|
(declare (indent 2))
|
2012-05-17 00:03:05 -03:00
|
|
|
|
(let* ((name (symbol-name name))
|
2012-05-17 00:03:35 -03:00
|
|
|
|
(function-name (intern (concat "python-skeleton--" name)))
|
2016-06-04 13:32:50 -04:00
|
|
|
|
(msg (funcall (if (fboundp 'format-message) #'format-message #'format)
|
|
|
|
|
"Add `%s' clause? " name)))
|
2012-05-17 00:03:05 -03:00
|
|
|
|
(when (not skel)
|
|
|
|
|
(setq skel
|
|
|
|
|
`(< ,(format "%s:" name) \n \n
|
|
|
|
|
> _ \n)))
|
|
|
|
|
`(define-skeleton ,function-name
|
|
|
|
|
,(or doc
|
|
|
|
|
(format "Auxiliary skeleton for %s statement." name))
|
|
|
|
|
nil
|
|
|
|
|
(unless (y-or-n-p ,msg)
|
|
|
|
|
(signal 'quit t))
|
|
|
|
|
,@skel)))
|
|
|
|
|
|
2016-11-17 17:58:20 -05:00
|
|
|
|
(python-define-auxiliary-skeleton else)
|
2012-05-17 00:03:05 -03:00
|
|
|
|
|
2016-11-17 17:58:20 -05:00
|
|
|
|
(python-define-auxiliary-skeleton except)
|
2012-05-17 00:03:05 -03:00
|
|
|
|
|
2016-11-17 17:58:20 -05:00
|
|
|
|
(python-define-auxiliary-skeleton finally)
|
2012-05-17 00:03:05 -03:00
|
|
|
|
|
|
|
|
|
(python-skeleton-define if nil
|
|
|
|
|
"Condition: "
|
|
|
|
|
"if " str ":" \n
|
|
|
|
|
_ \n
|
|
|
|
|
("other condition, %s: "
|
|
|
|
|
<
|
|
|
|
|
"elif " str ":" \n
|
|
|
|
|
> _ \n nil)
|
|
|
|
|
'(python-skeleton--else) | ^)
|
|
|
|
|
|
|
|
|
|
(python-skeleton-define while nil
|
|
|
|
|
"Condition: "
|
|
|
|
|
"while " str ":" \n
|
|
|
|
|
> _ \n
|
|
|
|
|
'(python-skeleton--else) | ^)
|
|
|
|
|
|
|
|
|
|
(python-skeleton-define for nil
|
|
|
|
|
"Iteration spec: "
|
|
|
|
|
"for " str ":" \n
|
|
|
|
|
> _ \n
|
|
|
|
|
'(python-skeleton--else) | ^)
|
|
|
|
|
|
2014-06-11 22:35:26 -04:00
|
|
|
|
(python-skeleton-define import nil
|
|
|
|
|
"Import from module: "
|
|
|
|
|
"from " str & " " | -5
|
|
|
|
|
"import "
|
|
|
|
|
("Identifier: " str ", ") -2 \n _)
|
|
|
|
|
|
2012-05-17 00:03:05 -03:00
|
|
|
|
(python-skeleton-define try nil
|
|
|
|
|
nil
|
|
|
|
|
"try:" \n
|
|
|
|
|
> _ \n
|
|
|
|
|
("Exception, %s: "
|
|
|
|
|
<
|
|
|
|
|
"except " str ":" \n
|
|
|
|
|
> _ \n nil)
|
|
|
|
|
resume:
|
|
|
|
|
'(python-skeleton--except)
|
|
|
|
|
'(python-skeleton--else)
|
|
|
|
|
'(python-skeleton--finally) | ^)
|
|
|
|
|
|
|
|
|
|
(python-skeleton-define def nil
|
|
|
|
|
"Function name: "
|
2012-12-11 04:22:55 -03:00
|
|
|
|
"def " str "(" ("Parameter, %s: "
|
|
|
|
|
(unless (equal ?\( (char-before)) ", ")
|
|
|
|
|
str) "):" \n
|
|
|
|
|
"\"\"\"" - "\"\"\"" \n
|
|
|
|
|
> _ \n)
|
2012-05-17 00:03:05 -03:00
|
|
|
|
|
|
|
|
|
(python-skeleton-define class nil
|
|
|
|
|
"Class name: "
|
2012-12-11 04:22:55 -03:00
|
|
|
|
"class " str "(" ("Inheritance, %s: "
|
|
|
|
|
(unless (equal ?\( (char-before)) ", ")
|
|
|
|
|
str)
|
2014-06-11 22:24:24 -04:00
|
|
|
|
& ")" | -1
|
2012-05-17 00:03:05 -03:00
|
|
|
|
":" \n
|
|
|
|
|
"\"\"\"" - "\"\"\"" \n
|
|
|
|
|
> _ \n)
|
|
|
|
|
|
|
|
|
|
(defun python-skeleton-add-menu-items ()
|
|
|
|
|
"Add menu items to Python->Skeletons menu."
|
2013-09-04 23:46:34 -04:00
|
|
|
|
(let ((skeletons (sort python-skeleton-available 'string<)))
|
2012-05-17 00:03:05 -03:00
|
|
|
|
(dolist (skeleton skeletons)
|
|
|
|
|
(easy-menu-add-item
|
|
|
|
|
nil '("Python" "Skeletons")
|
|
|
|
|
`[,(format
|
2012-11-19 16:30:55 -05:00
|
|
|
|
"Insert %s" (nth 2 (split-string (symbol-name skeleton) "-")))
|
2012-05-17 00:03:05 -03:00
|
|
|
|
,skeleton t]))))
|
|
|
|
|
|
2012-05-17 00:02:59 -03:00
|
|
|
|
;;; FFAP
|
|
|
|
|
|
2012-05-17 00:03:23 -03:00
|
|
|
|
(defcustom python-ffap-setup-code
|
2015-08-22 20:42:04 -03:00
|
|
|
|
"
|
|
|
|
|
def __FFAP_get_module_path(objstr):
|
2012-05-17 00:02:59 -03:00
|
|
|
|
try:
|
2015-08-22 20:42:04 -03:00
|
|
|
|
import inspect
|
|
|
|
|
import os.path
|
|
|
|
|
# NameError exceptions are delayed until this point.
|
|
|
|
|
obj = eval(objstr)
|
|
|
|
|
module = inspect.getmodule(obj)
|
|
|
|
|
filename = module.__file__
|
|
|
|
|
ext = os.path.splitext(filename)[1]
|
|
|
|
|
if ext in ('.pyc', '.pyo'):
|
|
|
|
|
# Point to the source file.
|
|
|
|
|
filename = filename[:-1]
|
|
|
|
|
if os.path.exists(filename):
|
|
|
|
|
return filename
|
|
|
|
|
return ''
|
2012-05-17 00:02:59 -03:00
|
|
|
|
except:
|
|
|
|
|
return ''"
|
2012-05-17 00:03:23 -03:00
|
|
|
|
"Python code to get a module path."
|
|
|
|
|
:type 'string
|
2012-05-17 00:03:33 -03:00
|
|
|
|
:group 'python)
|
2012-05-17 00:02:59 -03:00
|
|
|
|
|
2012-05-17 00:03:23 -03:00
|
|
|
|
(defcustom python-ffap-string-code
|
2015-08-22 20:42:04 -03:00
|
|
|
|
"__FFAP_get_module_path('''%s''')"
|
2012-05-17 00:03:23 -03:00
|
|
|
|
"Python code used to get a string with the path of a module."
|
|
|
|
|
:type 'string
|
2012-05-17 00:03:33 -03:00
|
|
|
|
:group 'python)
|
2012-05-17 00:02:59 -03:00
|
|
|
|
|
|
|
|
|
(defun python-ffap-module-path (module)
|
|
|
|
|
"Function for `ffap-alist' to return path for MODULE."
|
|
|
|
|
(let ((process (or
|
2014-11-01 12:33:02 -06:00
|
|
|
|
(and (derived-mode-p 'inferior-python-mode)
|
2012-05-17 00:02:59 -03:00
|
|
|
|
(get-buffer-process (current-buffer)))
|
|
|
|
|
(python-shell-get-process))))
|
|
|
|
|
(if (not process)
|
|
|
|
|
nil
|
|
|
|
|
(let ((module-file
|
2012-05-17 00:03:06 -03:00
|
|
|
|
(python-shell-send-string-no-output
|
2015-08-22 20:42:04 -03:00
|
|
|
|
(concat
|
|
|
|
|
python-ffap-setup-code
|
|
|
|
|
"\nprint (" (format python-ffap-string-code module) ")")
|
|
|
|
|
process)))
|
|
|
|
|
(unless (zerop (length module-file))
|
|
|
|
|
(python-util-strip-string module-file))))))
|
2012-05-17 00:02:59 -03:00
|
|
|
|
|
2013-06-18 00:17:58 -07:00
|
|
|
|
(defvar ffap-alist)
|
|
|
|
|
|
2012-05-17 00:02:59 -03:00
|
|
|
|
(eval-after-load "ffap"
|
|
|
|
|
'(progn
|
|
|
|
|
(push '(python-mode . python-ffap-module-path) ffap-alist)
|
|
|
|
|
(push '(inferior-python-mode . python-ffap-module-path) ffap-alist)))
|
|
|
|
|
|
2012-05-17 00:03:00 -03:00
|
|
|
|
|
|
|
|
|
;;; Code check
|
|
|
|
|
|
2012-05-17 00:03:23 -03:00
|
|
|
|
(defcustom python-check-command
|
2015-01-27 13:20:57 -05:00
|
|
|
|
(or (executable-find "pyflakes")
|
|
|
|
|
(executable-find "epylint")
|
|
|
|
|
"install pyflakes, pylint or something else")
|
2012-05-17 00:03:23 -03:00
|
|
|
|
"Command used to check a Python file."
|
|
|
|
|
:type 'string
|
2012-05-17 00:03:33 -03:00
|
|
|
|
:group 'python)
|
2012-05-17 00:03:00 -03:00
|
|
|
|
|
2012-05-17 00:03:34 -03:00
|
|
|
|
(defcustom python-check-buffer-name
|
|
|
|
|
"*Python check: %s*"
|
|
|
|
|
"Buffer name used for check commands."
|
|
|
|
|
:type 'string
|
|
|
|
|
:group 'python)
|
|
|
|
|
|
2015-02-07 14:25:47 -03:00
|
|
|
|
(defvar python-check-custom-command nil
|
2012-05-17 00:03:00 -03:00
|
|
|
|
"Internal use.")
|
2015-02-07 14:25:47 -03:00
|
|
|
|
;; XXX: Avoid `defvar-local' for compat with Emacs<24.3
|
|
|
|
|
(make-variable-buffer-local 'python-check-custom-command)
|
2012-05-17 00:03:00 -03:00
|
|
|
|
|
|
|
|
|
(defun python-check (command)
|
|
|
|
|
"Check a Python file (default current buffer's file).
|
lisp/progmodes/python.el: Fix docstring typos.
(defconst, python-syntax-count-quotes)
(python-indent-region, python-indent-shift-right)
(python-indent-dedent-line-backspace, python-nav-backward-sexp)
(python-nav-backward-sexp-safe, python-nav-backward-up-list)
(python-shell-prompt-block-regexp, python-shell-prompt-output-regexp)
(python-shell-prompt-pdb-regexp, python-shell-enable-font-lock)
(inferior-python-mode, python-shell-make-comint, run-python-internal)
(python-shell-buffer-substring, python-shell-send-buffer)
(python-pdbtrack-activate, python-pdbtrack-stacktrace-info-regexp)
(python-completion-complete-at-point, python-fill-docstring-style)
(python-eldoc-function, python-imenu-format-item-label)
(python-imenu-format-parent-item-label)
(python-imenu-format-parent-item-jump-label)
(python-imenu--build-tree, python-imenu-create-index)
(python-imenu-create-flat-index): Fix docstring typos.
(python-indent-context, python-shell-prompt-regexp, run-python):
Remove superfluous backslashes.
(python-indent-line, python-nav-beginning-of-defun)
(python-shell-get-buffer, python-shell-get-process)
(python-info-current-defun, python-info-current-line-comment-p)
(python-info-current-line-empty-p, python-util-popn): Doc fixes.
(python-indent-post-self-insert-function, python-shell-send-file)
(python-shell-completion-get-completions)
(python-shell-completion-complete-or-indent)
(python-eldoc--get-doc-at-point): Reflow docstrings.
2014-03-15 18:37:58 +01:00
|
|
|
|
Runs COMMAND, a shell command, as if by `compile'.
|
|
|
|
|
See `python-check-command' for the default."
|
2012-05-17 00:03:00 -03:00
|
|
|
|
(interactive
|
|
|
|
|
(list (read-string "Check command: "
|
2012-05-17 00:03:35 -03:00
|
|
|
|
(or python-check-custom-command
|
|
|
|
|
(concat python-check-command " "
|
2012-05-17 00:03:00 -03:00
|
|
|
|
(shell-quote-argument
|
|
|
|
|
(or
|
|
|
|
|
(let ((name (buffer-file-name)))
|
|
|
|
|
(and name
|
|
|
|
|
(file-name-nondirectory name)))
|
|
|
|
|
"")))))))
|
|
|
|
|
(setq python-check-custom-command command)
|
|
|
|
|
(save-some-buffers (not compilation-ask-about-save) nil)
|
2015-07-06 07:57:14 -03:00
|
|
|
|
(python-shell-with-environment
|
2012-05-17 00:03:34 -03:00
|
|
|
|
(compilation-start command nil
|
2013-09-04 23:46:34 -04:00
|
|
|
|
(lambda (_modename)
|
2012-05-17 00:03:34 -03:00
|
|
|
|
(format python-check-buffer-name command)))))
|
2012-05-17 00:03:00 -03:00
|
|
|
|
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
|
|
|
|
;;; Eldoc
|
|
|
|
|
|
2012-05-17 00:03:23 -03:00
|
|
|
|
(defcustom python-eldoc-setup-code
|
2012-05-17 00:02:52 -03:00
|
|
|
|
"def __PYDOC_get_help(obj):
|
|
|
|
|
try:
|
2012-05-17 00:03:18 -03:00
|
|
|
|
import inspect
|
2014-11-15 15:50:30 -03:00
|
|
|
|
try:
|
|
|
|
|
str_type = basestring
|
2017-09-18 16:59:49 +02:00
|
|
|
|
argspec_function = inspect.getargspec
|
2014-11-15 15:50:30 -03:00
|
|
|
|
except NameError:
|
|
|
|
|
str_type = str
|
2017-09-18 16:59:49 +02:00
|
|
|
|
argspec_function = inspect.getfullargspec
|
2014-11-15 15:50:30 -03:00
|
|
|
|
if isinstance(obj, str_type):
|
2012-05-17 00:02:58 -03:00
|
|
|
|
obj = eval(obj, globals())
|
2012-05-17 00:03:18 -03:00
|
|
|
|
doc = inspect.getdoc(obj)
|
|
|
|
|
if not doc and callable(obj):
|
|
|
|
|
target = None
|
|
|
|
|
if inspect.isclass(obj) and hasattr(obj, '__init__'):
|
|
|
|
|
target = obj.__init__
|
|
|
|
|
objtype = 'class'
|
|
|
|
|
else:
|
|
|
|
|
target = obj
|
|
|
|
|
objtype = 'def'
|
|
|
|
|
if target:
|
2017-09-18 16:59:49 +02:00
|
|
|
|
args = inspect.formatargspec(*argspec_function(target))
|
2012-05-17 00:03:18 -03:00
|
|
|
|
name = obj.__name__
|
|
|
|
|
doc = '{objtype} {name}{args}'.format(
|
|
|
|
|
objtype=objtype, name=name, args=args
|
|
|
|
|
)
|
|
|
|
|
else:
|
|
|
|
|
doc = doc.splitlines()[0]
|
2012-05-17 00:02:52 -03:00
|
|
|
|
except:
|
2012-05-17 00:02:58 -03:00
|
|
|
|
doc = ''
|
2015-08-22 20:42:04 -03:00
|
|
|
|
return doc"
|
2012-05-17 00:03:23 -03:00
|
|
|
|
"Python code to setup documentation retrieval."
|
|
|
|
|
:type 'string
|
2012-05-17 00:03:33 -03:00
|
|
|
|
:group 'python)
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
2012-05-17 00:03:23 -03:00
|
|
|
|
(defcustom python-eldoc-string-code
|
2015-08-22 20:42:04 -03:00
|
|
|
|
"__PYDOC_get_help('''%s''')"
|
2012-05-17 00:03:23 -03:00
|
|
|
|
"Python code used to get a string with the documentation of an object."
|
|
|
|
|
:type 'string
|
2012-05-17 00:03:33 -03:00
|
|
|
|
:group 'python)
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
2015-02-07 18:39:07 -03:00
|
|
|
|
(defun python-eldoc--get-symbol-at-point ()
|
|
|
|
|
"Get the current symbol for eldoc.
|
|
|
|
|
Returns the current symbol handling point within arguments."
|
|
|
|
|
(save-excursion
|
|
|
|
|
(let ((start (python-syntax-context 'paren)))
|
|
|
|
|
(when start
|
|
|
|
|
(goto-char start))
|
|
|
|
|
(when (or start
|
|
|
|
|
(eobp)
|
|
|
|
|
(memq (char-syntax (char-after)) '(?\ ?-)))
|
|
|
|
|
;; Try to adjust to closest symbol if not in one.
|
|
|
|
|
(python-util-forward-comment -1)))
|
|
|
|
|
(python-info-current-symbol t)))
|
|
|
|
|
|
2012-05-17 00:03:00 -03:00
|
|
|
|
(defun python-eldoc--get-doc-at-point (&optional force-input force-process)
|
2012-05-17 00:03:03 -03:00
|
|
|
|
"Internal implementation to get documentation at point.
|
2015-02-07 18:39:07 -03:00
|
|
|
|
If not FORCE-INPUT is passed then what `python-eldoc--get-symbol-at-point'
|
lisp/progmodes/python.el: Fix docstring typos.
(defconst, python-syntax-count-quotes)
(python-indent-region, python-indent-shift-right)
(python-indent-dedent-line-backspace, python-nav-backward-sexp)
(python-nav-backward-sexp-safe, python-nav-backward-up-list)
(python-shell-prompt-block-regexp, python-shell-prompt-output-regexp)
(python-shell-prompt-pdb-regexp, python-shell-enable-font-lock)
(inferior-python-mode, python-shell-make-comint, run-python-internal)
(python-shell-buffer-substring, python-shell-send-buffer)
(python-pdbtrack-activate, python-pdbtrack-stacktrace-info-regexp)
(python-completion-complete-at-point, python-fill-docstring-style)
(python-eldoc-function, python-imenu-format-item-label)
(python-imenu-format-parent-item-label)
(python-imenu-format-parent-item-jump-label)
(python-imenu--build-tree, python-imenu-create-index)
(python-imenu-create-flat-index): Fix docstring typos.
(python-indent-context, python-shell-prompt-regexp, run-python):
Remove superfluous backslashes.
(python-indent-line, python-nav-beginning-of-defun)
(python-shell-get-buffer, python-shell-get-process)
(python-info-current-defun, python-info-current-line-comment-p)
(python-info-current-line-empty-p, python-util-popn): Doc fixes.
(python-indent-post-self-insert-function, python-shell-send-file)
(python-shell-completion-get-completions)
(python-shell-completion-complete-or-indent)
(python-eldoc--get-doc-at-point): Reflow docstrings.
2014-03-15 18:37:58 +01:00
|
|
|
|
returns will be used. If not FORCE-PROCESS is passed what
|
|
|
|
|
`python-shell-get-process' returns is used."
|
2012-05-17 00:03:00 -03:00
|
|
|
|
(let ((process (or force-process (python-shell-get-process))))
|
2014-07-27 04:05:13 -03:00
|
|
|
|
(when process
|
2015-08-22 20:42:04 -03:00
|
|
|
|
(let* ((input (or force-input
|
|
|
|
|
(python-eldoc--get-symbol-at-point)))
|
|
|
|
|
(docstring
|
|
|
|
|
(when input
|
|
|
|
|
;; Prevent resizing the echo area when iPython is
|
|
|
|
|
;; enabled. Bug#18794.
|
|
|
|
|
(python-util-strip-string
|
|
|
|
|
(python-shell-send-string-no-output
|
|
|
|
|
(concat
|
|
|
|
|
python-eldoc-setup-code
|
|
|
|
|
"\nprint(" (format python-eldoc-string-code input) ")")
|
|
|
|
|
process)))))
|
|
|
|
|
(unless (zerop (length docstring))
|
|
|
|
|
docstring)))))
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
2016-06-10 12:08:29 +03:00
|
|
|
|
(defvar-local python-eldoc-get-doc t
|
|
|
|
|
"Non-nil means eldoc should fetch the documentation
|
lisp/*.el: Fix typos and other trivial doc fixes
* lisp/allout-widgets.el (allout-widgets-auto-activation)
(allout-current-decorated-p):
* lisp/auth-source.el (auth-source-protocols):
* lisp/autorevert.el (auto-revert-set-timer):
* lisp/battery.el (battery-mode-line-limit):
* lisp/calc/calcalg3.el (math-map-binop):
* lisp/calendar/cal-dst.el (calendar-dst-find-startend):
* lisp/calendar/cal-mayan.el (calendar-mayan-long-count-to-absolute):
* lisp/calendar/calendar.el (calendar-date-echo-text)
(calendar-generate-month, calendar-string-spread)
(calendar-cursor-to-date, calendar-read, calendar-read-date)
(calendar-mark-visible-date, calendar-dayname-on-or-before):
* lisp/calendar/diary-lib.el (diary-ordinal-suffix):
* lisp/cedet/ede/autoconf-edit.el (autoconf-new-program)
(autoconf-find-last-macro, autoconf-parameter-strip):
* lisp/cedet/ede/config.el (ede-target-with-config-build):
* lisp/cedet/ede/linux.el (ede-linux--detect-architecture)
(ede-linux--get-architecture):
* lisp/cedet/semantic/complete.el (semantic-collector-calculate-cache)
(semantic-displayer-abstract, semantic-displayer-point-position):
* lisp/cedet/semantic/format.el (semantic-format-face-alist)
(semantic-format-tag-short-doc):
* lisp/cedet/semantic/fw.el (semantic-find-file-noselect):
* lisp/cedet/semantic/idle.el (semantic-idle-scheduler-work-idle-time)
(semantic-idle-breadcrumbs-display-function)
(semantic-idle-breadcrumbs-format-tag-list-function):
* lisp/cedet/semantic/lex.el (semantic-lex-map-types)
(define-lex, define-lex-block-type-analyzer):
* lisp/cedet/semantic/senator.el (senator-search-default-tag-filter):
* lisp/cedet/semantic/symref.el (semantic-symref-result)
(semantic-symref-hit-to-tag-via-db):
* lisp/cedet/semantic/symref.el (semantic-symref-tool-baseclass):
* lisp/cedet/semantic/tag.el (semantic-tag-new-variable)
(semantic-tag-new-include, semantic-tag-new-package)
(semantic-tag-set-faux, semantic-create-tag-proxy)
(semantic-tag-function-parent)
(semantic-tag-components-with-overlays):
* lisp/cedet/srecode/cpp.el (srecode-cpp-namespaces)
(srecode-semantic-handle-:c, srecode-semantic-apply-tag-to-dict):
* lisp/cedet/srecode/dictionary.el (srecode-create-dictionary)
(srecode-dictionary-add-entries, srecode-dictionary-lookup-name)
(srecode-create-dictionaries-from-tags):
* lisp/cmuscheme.el (scheme-compile-region):
* lisp/color.el (color-lab-to-lch):
* lisp/doc-view.el (doc-view-image-width)
(doc-view-set-up-single-converter):
* lisp/dynamic-setting.el (font-setting-change-default-font)
(dynamic-setting-handle-config-changed-event):
* lisp/elec-pair.el (electric-pair-text-pairs)
(electric-pair-skip-whitespace-function)
(electric-pair-string-bound-function):
* lisp/emacs-lisp/avl-tree.el (avl-tree--del-balance)
(avl-tree-member, avl-tree-mapcar, avl-tree-iter):
* lisp/emacs-lisp/bytecomp.el (byte-compile-generate-call-tree):
* lisp/emacs-lisp/checkdoc.el (checkdoc-autofix-flag)
(checkdoc-spellcheck-documentation-flag, checkdoc-ispell)
(checkdoc-ispell-current-buffer, checkdoc-ispell-interactive)
(checkdoc-ispell-message-interactive)
(checkdoc-ispell-message-text, checkdoc-ispell-start)
(checkdoc-ispell-continue, checkdoc-ispell-comments)
(checkdoc-ispell-defun):
* lisp/emacs-lisp/cl-generic.el (cl--generic-search-method):
* lisp/emacs-lisp/eieio-custom.el (eieio-read-customization-group):
* lisp/emacs-lisp/lisp.el (forward-sexp, up-list):
* lisp/emacs-lisp/package-x.el (package--archive-contents-from-file):
* lisp/emacs-lisp/package.el (package-desc)
(package--make-autoloads-and-stuff, package-hidden-regexps):
* lisp/emacs-lisp/tcover-ses.el (ses-exercise-startup):
* lisp/emacs-lisp/testcover.el (testcover-nohits)
(testcover-1value):
* lisp/epg.el (epg-receive-keys, epg-start-edit-key):
* lisp/erc/erc-backend.el (erc-server-processing-p)
(erc-split-line-length, erc-server-coding-system)
(erc-server-send, erc-message):
* lisp/erc/erc-button.el (erc-button-face, erc-button-alist)
(erc-browse-emacswiki):
* lisp/erc/erc-ezbounce.el (erc-ezbounce, erc-ezb-get-login):
* lisp/erc/erc-fill.el (erc-fill-variable-maximum-indentation):
* lisp/erc/erc-log.el (erc-current-logfile):
* lisp/erc/erc-match.el (erc-log-match-format)
(erc-text-matched-hook):
* lisp/erc/erc-netsplit.el (erc-netsplit, erc-netsplit-debug):
* lisp/erc/erc-networks.el (erc-server-alist)
(erc-networks-alist, erc-current-network):
* lisp/erc/erc-ring.el (erc-input-ring-index):
* lisp/erc/erc-speedbar.el (erc-speedbar)
(erc-speedbar-update-channel):
* lisp/erc/erc-stamp.el (erc-timestamp-only-if-changed-flag):
* lisp/erc/erc-track.el (erc-track-position-in-mode-line)
(erc-track-remove-from-mode-line, erc-modified-channels-update)
(erc-track-last-non-erc-buffer, erc-track-sort-by-importance)
(erc-track-get-active-buffer):
* lisp/erc/erc.el (erc-get-channel-user-list)
(erc-echo-notice-hook, erc-echo-notice-always-hook)
(erc-wash-quit-reason, erc-format-@nick):
* lisp/ffap.el (ffap-latex-mode):
* lisp/files.el (abort-if-file-too-large)
(dir-locals--get-sort-score, buffer-stale--default-function):
* lisp/filesets.el (filesets-tree-max-level, filesets-data)
(filesets-update-pre010505):
* lisp/gnus/gnus-agent.el (gnus-agent-flush-cache):
* lisp/gnus/gnus-art.el (gnus-article-encrypt-protocol)
(gnus-button-prefer-mid-or-mail):
* lisp/gnus/gnus-cus.el (gnus-group-parameters):
* lisp/gnus/gnus-demon.el (gnus-demon-handlers)
(gnus-demon-run-callback):
* lisp/gnus/gnus-dired.el (gnus-dired-print):
* lisp/gnus/gnus-icalendar.el (gnus-icalendar-event-from-buffer):
* lisp/gnus/gnus-range.el (gnus-range-normalize):
* lisp/gnus/gnus-spec.el (gnus-pad-form):
* lisp/gnus/gnus-srvr.el (gnus-server-agent, gnus-server-cloud)
(gnus-server-opened, gnus-server-closed, gnus-server-denied)
(gnus-server-offline):
* lisp/gnus/gnus-sum.el (gnus-refer-thread-use-nnir)
(gnus-refer-thread-limit-to-thread)
(gnus-summary-limit-include-thread, gnus-summary-refer-thread)
(gnus-summary-find-matching):
* lisp/gnus/gnus-util.el (gnus-rescale-image):
* lisp/gnus/gnus.el (gnus-summary-line-format, gnus-no-server):
* lisp/gnus/mail-source.el (mail-source-incoming-file-prefix):
* lisp/gnus/message.el (message-cite-reply-position)
(message-cite-style-outlook, message-cite-style-thunderbird)
(message-cite-style-gmail, message--send-mail-maybe-partially):
* lisp/gnus/mm-extern.el (mm-inline-external-body):
* lisp/gnus/mm-partial.el (mm-inline-partial):
* lisp/gnus/mml-sec.el (mml-secure-message-sign)
(mml-secure-message-sign-encrypt, mml-secure-message-encrypt):
* lisp/gnus/mml2015.el (mml2015-epg-key-image)
(mml2015-epg-key-image-to-string):
* lisp/gnus/nndiary.el (nndiary-reminders, nndiary-get-new-mail):
* lisp/gnus/nnheader.el (nnheader-directory-files-is-safe):
* lisp/gnus/nnir.el (nnir-search-history)
(nnir-imap-search-other, nnir-artlist-length)
(nnir-artlist-article, nnir-artitem-group, nnir-artitem-number)
(nnir-artitem-rsv, nnir-article-group, nnir-article-number)
(nnir-article-rsv, nnir-article-ids, nnir-categorize)
(nnir-retrieve-headers-override-function)
(nnir-imap-default-search-key, nnir-hyrex-additional-switches)
(gnus-group-make-nnir-group, nnir-run-namazu, nnir-read-parms)
(nnir-read-parm, nnir-read-server-parm, nnir-search-thread):
* lisp/gnus/nnmairix.el (nnmairix-default-group)
(nnmairix-propagate-marks):
* lisp/gnus/smime.el (smime-keys, smime-crl-check)
(smime-verify-buffer, smime-noverify-buffer):
* lisp/gnus/spam-report.el (spam-report-url-ping-mm-url):
* lisp/gnus/spam.el (spam-spamassassin-positive-spam-flag-header)
(spam-spamassassin-spam-status-header, spam-sa-learn-rebuild)
(spam-classifications, spam-check-stat, spam-spamassassin-score):
* lisp/help.el (describe-minor-mode-from-symbol):
* lisp/hippie-exp.el (hippie-expand-ignore-buffers):
* lisp/htmlfontify.el (hfy-optimizations, hfy-face-resolve-face)
(hfy-begin-span):
* lisp/ibuf-ext.el (ibuffer-update-saved-filters-format)
(ibuffer-saved-filters, ibuffer-old-saved-filters-warning)
(ibuffer-filtering-qualifiers, ibuffer-repair-saved-filters)
(eval, ibuffer-unary-operand, file-extension, directory):
* lisp/image-dired.el (image-dired-cmd-pngcrush-options):
* lisp/image-mode.el (image-toggle-display):
* lisp/international/ccl.el (ccl-compile-read-multibyte-character)
(ccl-compile-write-multibyte-character):
* lisp/international/kkc.el (kkc-save-init-file):
* lisp/international/latin1-disp.el (latin1-display):
* lisp/international/ogonek.el (ogonek-name-encoding-alist)
(ogonek-information, ogonek-lookup-encoding)
(ogonek-deprefixify-region):
* lisp/isearch.el (isearch-filter-predicate)
(isearch--momentary-message):
* lisp/jsonrpc.el (jsonrpc-connection-send)
(jsonrpc-process-connection, jsonrpc-shutdown)
(jsonrpc--async-request-1):
* lisp/language/tibet-util.el (tibetan-char-p):
* lisp/mail/feedmail.el (feedmail-queue-use-send-time-for-date)
(feedmail-last-chance-hook, feedmail-before-fcc-hook)
(feedmail-send-it-immediately-wrapper, feedmail-find-eoh):
* lisp/mail/hashcash.el (hashcash-generate-payment)
(hashcash-generate-payment-async, hashcash-insert-payment)
(hashcash-verify-payment):
* lisp/mail/rmail.el (rmail-movemail-variant-in-use)
(rmail-get-attr-value):
* lisp/mail/rmailmm.el (rmail-mime-prefer-html, rmail-mime):
* lisp/mail/rmailsum.el (rmail-summary-show-message):
* lisp/mail/supercite.el (sc-raw-mode-toggle):
* lisp/man.el (Man-start-calling):
* lisp/mh-e/mh-acros.el (mh-do-at-event-location)
(mh-iterate-on-messages-in-region, mh-iterate-on-range):
* lisp/mh-e/mh-alias.el (mh-alias-system-aliases)
(mh-alias-reload, mh-alias-ali)
(mh-alias-canonicalize-suggestion, mh-alias-add-alias-to-file)
(mh-alias-add-alias):
* lisp/mouse.el (mouse-save-then-kill):
* lisp/net/browse-url.el (browse-url-default-macosx-browser):
* lisp/net/eudc.el (eudc-set, eudc-variable-protocol-value)
(eudc-variable-server-value, eudc-update-variable)
(eudc-expand-inline):
* lisp/net/eudcb-bbdb.el (eudc-bbdb-format-record-as-result):
* lisp/net/eudcb-ldap.el (eudc-ldap-get-field-list):
* lisp/net/pop3.el (pop3-list):
* lisp/net/soap-client.el (soap-namespace-put)
(soap-xs-parse-sequence, soap-parse-envelope):
* lisp/net/soap-inspect.el (soap-inspect-xs-complex-type):
* lisp/nxml/rng-xsd.el (rng-xsd-date-to-days):
* lisp/org/ob-C.el (org-babel-prep-session:C)
(org-babel-load-session:C):
* lisp/org/ob-J.el (org-babel-execute:J):
* lisp/org/ob-asymptote.el (org-babel-prep-session:asymptote):
* lisp/org/ob-awk.el (org-babel-execute:awk):
* lisp/org/ob-core.el (org-babel-process-file-name):
* lisp/org/ob-ebnf.el (org-babel-execute:ebnf):
* lisp/org/ob-forth.el (org-babel-execute:forth):
* lisp/org/ob-fortran.el (org-babel-execute:fortran)
(org-babel-prep-session:fortran, org-babel-load-session:fortran):
* lisp/org/ob-groovy.el (org-babel-execute:groovy):
* lisp/org/ob-io.el (org-babel-execute:io):
* lisp/org/ob-js.el (org-babel-execute:js):
* lisp/org/ob-lilypond.el (org-babel-default-header-args:lilypond)
(org-babel-lilypond-compile-post-tangle)
(org-babel-lilypond-display-pdf-post-tangle)
(org-babel-lilypond-tangle)
(org-babel-lilypond-execute-tangled-ly)
(org-babel-lilypond-compile-lilyfile)
(org-babel-lilypond-check-for-compile-error)
(org-babel-lilypond-process-compile-error)
(org-babel-lilypond-mark-error-line)
(org-babel-lilypond-parse-error-line)
(org-babel-lilypond-attempt-to-open-pdf)
(org-babel-lilypond-attempt-to-play-midi)
(org-babel-lilypond-switch-extension)
(org-babel-lilypond-set-header-args):
* lisp/org/ob-lua.el (org-babel-prep-session:lua):
* lisp/org/ob-picolisp.el (org-babel-execute:picolisp):
* lisp/org/ob-processing.el (org-babel-prep-session:processing):
* lisp/org/ob-python.el (org-babel-prep-session:python):
* lisp/org/ob-scheme.el (org-babel-scheme-capture-current-message)
(org-babel-scheme-execute-with-geiser, org-babel-execute:scheme):
* lisp/org/ob-shen.el (org-babel-execute:shen):
* lisp/org/org-agenda.el (org-agenda-entry-types)
(org-agenda-move-date-from-past-immediately-to-today)
(org-agenda-time-grid, org-agenda-sorting-strategy)
(org-agenda-filter-by-category, org-agenda-forward-block):
* lisp/org/org-colview.el (org-columns--overlay-text):
* lisp/org/org-faces.el (org-verbatim, org-cycle-level-faces):
* lisp/org/org-indent.el (org-indent-set-line-properties):
* lisp/org/org-macs.el (org-get-limited-outline-regexp):
* lisp/org/org-mobile.el (org-mobile-files):
* lisp/org/org.el (org-use-fast-todo-selection)
(org-extend-today-until, org-use-property-inheritance)
(org-refresh-effort-properties, org-open-at-point-global)
(org-track-ordered-property-with-tag, org-shiftright):
* lisp/org/ox-html.el (org-html-checkbox-type):
* lisp/org/ox-man.el (org-man-source-highlight)
(org-man-verse-block):
* lisp/org/ox-publish.el (org-publish-sitemap-default):
* lisp/outline.el (outline-head-from-level):
* lisp/progmodes/dcl-mode.el (dcl-back-to-indentation-1)
(dcl-calc-command-indent, dcl-indent-to):
* lisp/progmodes/flymake.el (flymake-make-diagnostic)
(flymake--overlays, flymake-diagnostic-functions)
(flymake-diagnostic-types-alist, flymake--backend-state)
(flymake-is-running, flymake--collect, flymake-mode):
* lisp/progmodes/gdb-mi.el (gdb-threads-list, gdb, gdb-non-stop)
(gdb-buffers, gdb-gud-context-call, gdb-jsonify-buffer):
* lisp/progmodes/grep.el (grep-error-screen-columns):
* lisp/progmodes/gud.el (gud-prev-expr):
* lisp/progmodes/ps-mode.el (ps-mode, ps-mode-target-column)
(ps-run-goto-error):
* lisp/progmodes/python.el (python-eldoc-get-doc)
(python-eldoc-function-timeout-permanent, python-eldoc-function):
* lisp/shadowfile.el (shadow-make-group):
* lisp/speedbar.el (speedbar-obj-do-check):
* lisp/textmodes/flyspell.el (flyspell-auto-correct-previous-hook):
* lisp/textmodes/reftex-cite.el (reftex-bib-or-thebib):
* lisp/textmodes/reftex-index.el (reftex-index-goto-entry)
(reftex-index-kill, reftex-index-undo):
* lisp/textmodes/reftex-parse.el (reftex-context-substring):
* lisp/textmodes/reftex.el (reftex-TeX-master-file):
* lisp/textmodes/rst.el (rst-next-hdr, rst-toc)
(rst-uncomment-region, rst-font-lock-extend-region-internal):
* lisp/thumbs.el (thumbs-mode):
* lisp/vc/ediff-util.el (ediff-restore-diff):
* lisp/vc/pcvs-defs.el (cvs-cvsroot, cvs-force-dir-tag):
* lisp/vc/vc-hg.el (vc-hg--ignore-patterns-valid-p):
* lisp/wid-edit.el (widget-field-value-set, string):
* lisp/x-dnd.el (x-dnd-version-from-flags)
(x-dnd-more-than-3-from-flags): Assorted docfixes.
2019-09-21 00:27:53 +02:00
|
|
|
|
automatically. Set to nil by `python-eldoc-function' if
|
2016-06-10 12:08:29 +03:00
|
|
|
|
`python-eldoc-function-timeout-permanent' is non-nil and
|
|
|
|
|
`python-eldoc-function' times out.")
|
|
|
|
|
|
|
|
|
|
(defcustom python-eldoc-function-timeout 1
|
|
|
|
|
"Timeout for `python-eldoc-function' in seconds."
|
|
|
|
|
:group 'python
|
|
|
|
|
:type 'integer
|
|
|
|
|
:version "25.1")
|
|
|
|
|
|
|
|
|
|
(defcustom python-eldoc-function-timeout-permanent t
|
|
|
|
|
"Non-nil means that when `python-eldoc-function' times out
|
lisp/*.el: Fix typos and other trivial doc fixes
* lisp/allout-widgets.el (allout-widgets-auto-activation)
(allout-current-decorated-p):
* lisp/auth-source.el (auth-source-protocols):
* lisp/autorevert.el (auto-revert-set-timer):
* lisp/battery.el (battery-mode-line-limit):
* lisp/calc/calcalg3.el (math-map-binop):
* lisp/calendar/cal-dst.el (calendar-dst-find-startend):
* lisp/calendar/cal-mayan.el (calendar-mayan-long-count-to-absolute):
* lisp/calendar/calendar.el (calendar-date-echo-text)
(calendar-generate-month, calendar-string-spread)
(calendar-cursor-to-date, calendar-read, calendar-read-date)
(calendar-mark-visible-date, calendar-dayname-on-or-before):
* lisp/calendar/diary-lib.el (diary-ordinal-suffix):
* lisp/cedet/ede/autoconf-edit.el (autoconf-new-program)
(autoconf-find-last-macro, autoconf-parameter-strip):
* lisp/cedet/ede/config.el (ede-target-with-config-build):
* lisp/cedet/ede/linux.el (ede-linux--detect-architecture)
(ede-linux--get-architecture):
* lisp/cedet/semantic/complete.el (semantic-collector-calculate-cache)
(semantic-displayer-abstract, semantic-displayer-point-position):
* lisp/cedet/semantic/format.el (semantic-format-face-alist)
(semantic-format-tag-short-doc):
* lisp/cedet/semantic/fw.el (semantic-find-file-noselect):
* lisp/cedet/semantic/idle.el (semantic-idle-scheduler-work-idle-time)
(semantic-idle-breadcrumbs-display-function)
(semantic-idle-breadcrumbs-format-tag-list-function):
* lisp/cedet/semantic/lex.el (semantic-lex-map-types)
(define-lex, define-lex-block-type-analyzer):
* lisp/cedet/semantic/senator.el (senator-search-default-tag-filter):
* lisp/cedet/semantic/symref.el (semantic-symref-result)
(semantic-symref-hit-to-tag-via-db):
* lisp/cedet/semantic/symref.el (semantic-symref-tool-baseclass):
* lisp/cedet/semantic/tag.el (semantic-tag-new-variable)
(semantic-tag-new-include, semantic-tag-new-package)
(semantic-tag-set-faux, semantic-create-tag-proxy)
(semantic-tag-function-parent)
(semantic-tag-components-with-overlays):
* lisp/cedet/srecode/cpp.el (srecode-cpp-namespaces)
(srecode-semantic-handle-:c, srecode-semantic-apply-tag-to-dict):
* lisp/cedet/srecode/dictionary.el (srecode-create-dictionary)
(srecode-dictionary-add-entries, srecode-dictionary-lookup-name)
(srecode-create-dictionaries-from-tags):
* lisp/cmuscheme.el (scheme-compile-region):
* lisp/color.el (color-lab-to-lch):
* lisp/doc-view.el (doc-view-image-width)
(doc-view-set-up-single-converter):
* lisp/dynamic-setting.el (font-setting-change-default-font)
(dynamic-setting-handle-config-changed-event):
* lisp/elec-pair.el (electric-pair-text-pairs)
(electric-pair-skip-whitespace-function)
(electric-pair-string-bound-function):
* lisp/emacs-lisp/avl-tree.el (avl-tree--del-balance)
(avl-tree-member, avl-tree-mapcar, avl-tree-iter):
* lisp/emacs-lisp/bytecomp.el (byte-compile-generate-call-tree):
* lisp/emacs-lisp/checkdoc.el (checkdoc-autofix-flag)
(checkdoc-spellcheck-documentation-flag, checkdoc-ispell)
(checkdoc-ispell-current-buffer, checkdoc-ispell-interactive)
(checkdoc-ispell-message-interactive)
(checkdoc-ispell-message-text, checkdoc-ispell-start)
(checkdoc-ispell-continue, checkdoc-ispell-comments)
(checkdoc-ispell-defun):
* lisp/emacs-lisp/cl-generic.el (cl--generic-search-method):
* lisp/emacs-lisp/eieio-custom.el (eieio-read-customization-group):
* lisp/emacs-lisp/lisp.el (forward-sexp, up-list):
* lisp/emacs-lisp/package-x.el (package--archive-contents-from-file):
* lisp/emacs-lisp/package.el (package-desc)
(package--make-autoloads-and-stuff, package-hidden-regexps):
* lisp/emacs-lisp/tcover-ses.el (ses-exercise-startup):
* lisp/emacs-lisp/testcover.el (testcover-nohits)
(testcover-1value):
* lisp/epg.el (epg-receive-keys, epg-start-edit-key):
* lisp/erc/erc-backend.el (erc-server-processing-p)
(erc-split-line-length, erc-server-coding-system)
(erc-server-send, erc-message):
* lisp/erc/erc-button.el (erc-button-face, erc-button-alist)
(erc-browse-emacswiki):
* lisp/erc/erc-ezbounce.el (erc-ezbounce, erc-ezb-get-login):
* lisp/erc/erc-fill.el (erc-fill-variable-maximum-indentation):
* lisp/erc/erc-log.el (erc-current-logfile):
* lisp/erc/erc-match.el (erc-log-match-format)
(erc-text-matched-hook):
* lisp/erc/erc-netsplit.el (erc-netsplit, erc-netsplit-debug):
* lisp/erc/erc-networks.el (erc-server-alist)
(erc-networks-alist, erc-current-network):
* lisp/erc/erc-ring.el (erc-input-ring-index):
* lisp/erc/erc-speedbar.el (erc-speedbar)
(erc-speedbar-update-channel):
* lisp/erc/erc-stamp.el (erc-timestamp-only-if-changed-flag):
* lisp/erc/erc-track.el (erc-track-position-in-mode-line)
(erc-track-remove-from-mode-line, erc-modified-channels-update)
(erc-track-last-non-erc-buffer, erc-track-sort-by-importance)
(erc-track-get-active-buffer):
* lisp/erc/erc.el (erc-get-channel-user-list)
(erc-echo-notice-hook, erc-echo-notice-always-hook)
(erc-wash-quit-reason, erc-format-@nick):
* lisp/ffap.el (ffap-latex-mode):
* lisp/files.el (abort-if-file-too-large)
(dir-locals--get-sort-score, buffer-stale--default-function):
* lisp/filesets.el (filesets-tree-max-level, filesets-data)
(filesets-update-pre010505):
* lisp/gnus/gnus-agent.el (gnus-agent-flush-cache):
* lisp/gnus/gnus-art.el (gnus-article-encrypt-protocol)
(gnus-button-prefer-mid-or-mail):
* lisp/gnus/gnus-cus.el (gnus-group-parameters):
* lisp/gnus/gnus-demon.el (gnus-demon-handlers)
(gnus-demon-run-callback):
* lisp/gnus/gnus-dired.el (gnus-dired-print):
* lisp/gnus/gnus-icalendar.el (gnus-icalendar-event-from-buffer):
* lisp/gnus/gnus-range.el (gnus-range-normalize):
* lisp/gnus/gnus-spec.el (gnus-pad-form):
* lisp/gnus/gnus-srvr.el (gnus-server-agent, gnus-server-cloud)
(gnus-server-opened, gnus-server-closed, gnus-server-denied)
(gnus-server-offline):
* lisp/gnus/gnus-sum.el (gnus-refer-thread-use-nnir)
(gnus-refer-thread-limit-to-thread)
(gnus-summary-limit-include-thread, gnus-summary-refer-thread)
(gnus-summary-find-matching):
* lisp/gnus/gnus-util.el (gnus-rescale-image):
* lisp/gnus/gnus.el (gnus-summary-line-format, gnus-no-server):
* lisp/gnus/mail-source.el (mail-source-incoming-file-prefix):
* lisp/gnus/message.el (message-cite-reply-position)
(message-cite-style-outlook, message-cite-style-thunderbird)
(message-cite-style-gmail, message--send-mail-maybe-partially):
* lisp/gnus/mm-extern.el (mm-inline-external-body):
* lisp/gnus/mm-partial.el (mm-inline-partial):
* lisp/gnus/mml-sec.el (mml-secure-message-sign)
(mml-secure-message-sign-encrypt, mml-secure-message-encrypt):
* lisp/gnus/mml2015.el (mml2015-epg-key-image)
(mml2015-epg-key-image-to-string):
* lisp/gnus/nndiary.el (nndiary-reminders, nndiary-get-new-mail):
* lisp/gnus/nnheader.el (nnheader-directory-files-is-safe):
* lisp/gnus/nnir.el (nnir-search-history)
(nnir-imap-search-other, nnir-artlist-length)
(nnir-artlist-article, nnir-artitem-group, nnir-artitem-number)
(nnir-artitem-rsv, nnir-article-group, nnir-article-number)
(nnir-article-rsv, nnir-article-ids, nnir-categorize)
(nnir-retrieve-headers-override-function)
(nnir-imap-default-search-key, nnir-hyrex-additional-switches)
(gnus-group-make-nnir-group, nnir-run-namazu, nnir-read-parms)
(nnir-read-parm, nnir-read-server-parm, nnir-search-thread):
* lisp/gnus/nnmairix.el (nnmairix-default-group)
(nnmairix-propagate-marks):
* lisp/gnus/smime.el (smime-keys, smime-crl-check)
(smime-verify-buffer, smime-noverify-buffer):
* lisp/gnus/spam-report.el (spam-report-url-ping-mm-url):
* lisp/gnus/spam.el (spam-spamassassin-positive-spam-flag-header)
(spam-spamassassin-spam-status-header, spam-sa-learn-rebuild)
(spam-classifications, spam-check-stat, spam-spamassassin-score):
* lisp/help.el (describe-minor-mode-from-symbol):
* lisp/hippie-exp.el (hippie-expand-ignore-buffers):
* lisp/htmlfontify.el (hfy-optimizations, hfy-face-resolve-face)
(hfy-begin-span):
* lisp/ibuf-ext.el (ibuffer-update-saved-filters-format)
(ibuffer-saved-filters, ibuffer-old-saved-filters-warning)
(ibuffer-filtering-qualifiers, ibuffer-repair-saved-filters)
(eval, ibuffer-unary-operand, file-extension, directory):
* lisp/image-dired.el (image-dired-cmd-pngcrush-options):
* lisp/image-mode.el (image-toggle-display):
* lisp/international/ccl.el (ccl-compile-read-multibyte-character)
(ccl-compile-write-multibyte-character):
* lisp/international/kkc.el (kkc-save-init-file):
* lisp/international/latin1-disp.el (latin1-display):
* lisp/international/ogonek.el (ogonek-name-encoding-alist)
(ogonek-information, ogonek-lookup-encoding)
(ogonek-deprefixify-region):
* lisp/isearch.el (isearch-filter-predicate)
(isearch--momentary-message):
* lisp/jsonrpc.el (jsonrpc-connection-send)
(jsonrpc-process-connection, jsonrpc-shutdown)
(jsonrpc--async-request-1):
* lisp/language/tibet-util.el (tibetan-char-p):
* lisp/mail/feedmail.el (feedmail-queue-use-send-time-for-date)
(feedmail-last-chance-hook, feedmail-before-fcc-hook)
(feedmail-send-it-immediately-wrapper, feedmail-find-eoh):
* lisp/mail/hashcash.el (hashcash-generate-payment)
(hashcash-generate-payment-async, hashcash-insert-payment)
(hashcash-verify-payment):
* lisp/mail/rmail.el (rmail-movemail-variant-in-use)
(rmail-get-attr-value):
* lisp/mail/rmailmm.el (rmail-mime-prefer-html, rmail-mime):
* lisp/mail/rmailsum.el (rmail-summary-show-message):
* lisp/mail/supercite.el (sc-raw-mode-toggle):
* lisp/man.el (Man-start-calling):
* lisp/mh-e/mh-acros.el (mh-do-at-event-location)
(mh-iterate-on-messages-in-region, mh-iterate-on-range):
* lisp/mh-e/mh-alias.el (mh-alias-system-aliases)
(mh-alias-reload, mh-alias-ali)
(mh-alias-canonicalize-suggestion, mh-alias-add-alias-to-file)
(mh-alias-add-alias):
* lisp/mouse.el (mouse-save-then-kill):
* lisp/net/browse-url.el (browse-url-default-macosx-browser):
* lisp/net/eudc.el (eudc-set, eudc-variable-protocol-value)
(eudc-variable-server-value, eudc-update-variable)
(eudc-expand-inline):
* lisp/net/eudcb-bbdb.el (eudc-bbdb-format-record-as-result):
* lisp/net/eudcb-ldap.el (eudc-ldap-get-field-list):
* lisp/net/pop3.el (pop3-list):
* lisp/net/soap-client.el (soap-namespace-put)
(soap-xs-parse-sequence, soap-parse-envelope):
* lisp/net/soap-inspect.el (soap-inspect-xs-complex-type):
* lisp/nxml/rng-xsd.el (rng-xsd-date-to-days):
* lisp/org/ob-C.el (org-babel-prep-session:C)
(org-babel-load-session:C):
* lisp/org/ob-J.el (org-babel-execute:J):
* lisp/org/ob-asymptote.el (org-babel-prep-session:asymptote):
* lisp/org/ob-awk.el (org-babel-execute:awk):
* lisp/org/ob-core.el (org-babel-process-file-name):
* lisp/org/ob-ebnf.el (org-babel-execute:ebnf):
* lisp/org/ob-forth.el (org-babel-execute:forth):
* lisp/org/ob-fortran.el (org-babel-execute:fortran)
(org-babel-prep-session:fortran, org-babel-load-session:fortran):
* lisp/org/ob-groovy.el (org-babel-execute:groovy):
* lisp/org/ob-io.el (org-babel-execute:io):
* lisp/org/ob-js.el (org-babel-execute:js):
* lisp/org/ob-lilypond.el (org-babel-default-header-args:lilypond)
(org-babel-lilypond-compile-post-tangle)
(org-babel-lilypond-display-pdf-post-tangle)
(org-babel-lilypond-tangle)
(org-babel-lilypond-execute-tangled-ly)
(org-babel-lilypond-compile-lilyfile)
(org-babel-lilypond-check-for-compile-error)
(org-babel-lilypond-process-compile-error)
(org-babel-lilypond-mark-error-line)
(org-babel-lilypond-parse-error-line)
(org-babel-lilypond-attempt-to-open-pdf)
(org-babel-lilypond-attempt-to-play-midi)
(org-babel-lilypond-switch-extension)
(org-babel-lilypond-set-header-args):
* lisp/org/ob-lua.el (org-babel-prep-session:lua):
* lisp/org/ob-picolisp.el (org-babel-execute:picolisp):
* lisp/org/ob-processing.el (org-babel-prep-session:processing):
* lisp/org/ob-python.el (org-babel-prep-session:python):
* lisp/org/ob-scheme.el (org-babel-scheme-capture-current-message)
(org-babel-scheme-execute-with-geiser, org-babel-execute:scheme):
* lisp/org/ob-shen.el (org-babel-execute:shen):
* lisp/org/org-agenda.el (org-agenda-entry-types)
(org-agenda-move-date-from-past-immediately-to-today)
(org-agenda-time-grid, org-agenda-sorting-strategy)
(org-agenda-filter-by-category, org-agenda-forward-block):
* lisp/org/org-colview.el (org-columns--overlay-text):
* lisp/org/org-faces.el (org-verbatim, org-cycle-level-faces):
* lisp/org/org-indent.el (org-indent-set-line-properties):
* lisp/org/org-macs.el (org-get-limited-outline-regexp):
* lisp/org/org-mobile.el (org-mobile-files):
* lisp/org/org.el (org-use-fast-todo-selection)
(org-extend-today-until, org-use-property-inheritance)
(org-refresh-effort-properties, org-open-at-point-global)
(org-track-ordered-property-with-tag, org-shiftright):
* lisp/org/ox-html.el (org-html-checkbox-type):
* lisp/org/ox-man.el (org-man-source-highlight)
(org-man-verse-block):
* lisp/org/ox-publish.el (org-publish-sitemap-default):
* lisp/outline.el (outline-head-from-level):
* lisp/progmodes/dcl-mode.el (dcl-back-to-indentation-1)
(dcl-calc-command-indent, dcl-indent-to):
* lisp/progmodes/flymake.el (flymake-make-diagnostic)
(flymake--overlays, flymake-diagnostic-functions)
(flymake-diagnostic-types-alist, flymake--backend-state)
(flymake-is-running, flymake--collect, flymake-mode):
* lisp/progmodes/gdb-mi.el (gdb-threads-list, gdb, gdb-non-stop)
(gdb-buffers, gdb-gud-context-call, gdb-jsonify-buffer):
* lisp/progmodes/grep.el (grep-error-screen-columns):
* lisp/progmodes/gud.el (gud-prev-expr):
* lisp/progmodes/ps-mode.el (ps-mode, ps-mode-target-column)
(ps-run-goto-error):
* lisp/progmodes/python.el (python-eldoc-get-doc)
(python-eldoc-function-timeout-permanent, python-eldoc-function):
* lisp/shadowfile.el (shadow-make-group):
* lisp/speedbar.el (speedbar-obj-do-check):
* lisp/textmodes/flyspell.el (flyspell-auto-correct-previous-hook):
* lisp/textmodes/reftex-cite.el (reftex-bib-or-thebib):
* lisp/textmodes/reftex-index.el (reftex-index-goto-entry)
(reftex-index-kill, reftex-index-undo):
* lisp/textmodes/reftex-parse.el (reftex-context-substring):
* lisp/textmodes/reftex.el (reftex-TeX-master-file):
* lisp/textmodes/rst.el (rst-next-hdr, rst-toc)
(rst-uncomment-region, rst-font-lock-extend-region-internal):
* lisp/thumbs.el (thumbs-mode):
* lisp/vc/ediff-util.el (ediff-restore-diff):
* lisp/vc/pcvs-defs.el (cvs-cvsroot, cvs-force-dir-tag):
* lisp/vc/vc-hg.el (vc-hg--ignore-patterns-valid-p):
* lisp/wid-edit.el (widget-field-value-set, string):
* lisp/x-dnd.el (x-dnd-version-from-flags)
(x-dnd-more-than-3-from-flags): Assorted docfixes.
2019-09-21 00:27:53 +02:00
|
|
|
|
`python-eldoc-get-doc' will be set to nil."
|
2016-06-10 12:08:29 +03:00
|
|
|
|
:group 'python
|
|
|
|
|
:type 'boolean
|
|
|
|
|
:version "25.1")
|
|
|
|
|
|
2012-05-17 00:03:00 -03:00
|
|
|
|
(defun python-eldoc-function ()
|
|
|
|
|
"`eldoc-documentation-function' for Python.
|
lisp/progmodes/python.el: Fix docstring typos.
(defconst, python-syntax-count-quotes)
(python-indent-region, python-indent-shift-right)
(python-indent-dedent-line-backspace, python-nav-backward-sexp)
(python-nav-backward-sexp-safe, python-nav-backward-up-list)
(python-shell-prompt-block-regexp, python-shell-prompt-output-regexp)
(python-shell-prompt-pdb-regexp, python-shell-enable-font-lock)
(inferior-python-mode, python-shell-make-comint, run-python-internal)
(python-shell-buffer-substring, python-shell-send-buffer)
(python-pdbtrack-activate, python-pdbtrack-stacktrace-info-regexp)
(python-completion-complete-at-point, python-fill-docstring-style)
(python-eldoc-function, python-imenu-format-item-label)
(python-imenu-format-parent-item-label)
(python-imenu-format-parent-item-jump-label)
(python-imenu--build-tree, python-imenu-create-index)
(python-imenu-create-flat-index): Fix docstring typos.
(python-indent-context, python-shell-prompt-regexp, run-python):
Remove superfluous backslashes.
(python-indent-line, python-nav-beginning-of-defun)
(python-shell-get-buffer, python-shell-get-process)
(python-info-current-defun, python-info-current-line-comment-p)
(python-info-current-line-empty-p, python-util-popn): Doc fixes.
(python-indent-post-self-insert-function, python-shell-send-file)
(python-shell-completion-get-completions)
(python-shell-completion-complete-or-indent)
(python-eldoc--get-doc-at-point): Reflow docstrings.
2014-03-15 18:37:58 +01:00
|
|
|
|
For this to work as best as possible you should call
|
2012-05-17 00:03:00 -03:00
|
|
|
|
`python-shell-send-buffer' from time to time so context in
|
2016-06-10 12:08:29 +03:00
|
|
|
|
inferior Python process is updated properly.
|
|
|
|
|
|
|
|
|
|
If `python-eldoc-function-timeout' seconds elapse before this
|
|
|
|
|
function returns then if
|
|
|
|
|
`python-eldoc-function-timeout-permanent' is non-nil
|
|
|
|
|
`python-eldoc-get-doc' will be set to nil and eldoc will no
|
|
|
|
|
longer return the documentation at the point automatically.
|
|
|
|
|
|
|
|
|
|
Set `python-eldoc-get-doc' to t to reenable eldoc documentation
|
lisp/*.el: Fix typos and other trivial doc fixes
* lisp/allout-widgets.el (allout-widgets-auto-activation)
(allout-current-decorated-p):
* lisp/auth-source.el (auth-source-protocols):
* lisp/autorevert.el (auto-revert-set-timer):
* lisp/battery.el (battery-mode-line-limit):
* lisp/calc/calcalg3.el (math-map-binop):
* lisp/calendar/cal-dst.el (calendar-dst-find-startend):
* lisp/calendar/cal-mayan.el (calendar-mayan-long-count-to-absolute):
* lisp/calendar/calendar.el (calendar-date-echo-text)
(calendar-generate-month, calendar-string-spread)
(calendar-cursor-to-date, calendar-read, calendar-read-date)
(calendar-mark-visible-date, calendar-dayname-on-or-before):
* lisp/calendar/diary-lib.el (diary-ordinal-suffix):
* lisp/cedet/ede/autoconf-edit.el (autoconf-new-program)
(autoconf-find-last-macro, autoconf-parameter-strip):
* lisp/cedet/ede/config.el (ede-target-with-config-build):
* lisp/cedet/ede/linux.el (ede-linux--detect-architecture)
(ede-linux--get-architecture):
* lisp/cedet/semantic/complete.el (semantic-collector-calculate-cache)
(semantic-displayer-abstract, semantic-displayer-point-position):
* lisp/cedet/semantic/format.el (semantic-format-face-alist)
(semantic-format-tag-short-doc):
* lisp/cedet/semantic/fw.el (semantic-find-file-noselect):
* lisp/cedet/semantic/idle.el (semantic-idle-scheduler-work-idle-time)
(semantic-idle-breadcrumbs-display-function)
(semantic-idle-breadcrumbs-format-tag-list-function):
* lisp/cedet/semantic/lex.el (semantic-lex-map-types)
(define-lex, define-lex-block-type-analyzer):
* lisp/cedet/semantic/senator.el (senator-search-default-tag-filter):
* lisp/cedet/semantic/symref.el (semantic-symref-result)
(semantic-symref-hit-to-tag-via-db):
* lisp/cedet/semantic/symref.el (semantic-symref-tool-baseclass):
* lisp/cedet/semantic/tag.el (semantic-tag-new-variable)
(semantic-tag-new-include, semantic-tag-new-package)
(semantic-tag-set-faux, semantic-create-tag-proxy)
(semantic-tag-function-parent)
(semantic-tag-components-with-overlays):
* lisp/cedet/srecode/cpp.el (srecode-cpp-namespaces)
(srecode-semantic-handle-:c, srecode-semantic-apply-tag-to-dict):
* lisp/cedet/srecode/dictionary.el (srecode-create-dictionary)
(srecode-dictionary-add-entries, srecode-dictionary-lookup-name)
(srecode-create-dictionaries-from-tags):
* lisp/cmuscheme.el (scheme-compile-region):
* lisp/color.el (color-lab-to-lch):
* lisp/doc-view.el (doc-view-image-width)
(doc-view-set-up-single-converter):
* lisp/dynamic-setting.el (font-setting-change-default-font)
(dynamic-setting-handle-config-changed-event):
* lisp/elec-pair.el (electric-pair-text-pairs)
(electric-pair-skip-whitespace-function)
(electric-pair-string-bound-function):
* lisp/emacs-lisp/avl-tree.el (avl-tree--del-balance)
(avl-tree-member, avl-tree-mapcar, avl-tree-iter):
* lisp/emacs-lisp/bytecomp.el (byte-compile-generate-call-tree):
* lisp/emacs-lisp/checkdoc.el (checkdoc-autofix-flag)
(checkdoc-spellcheck-documentation-flag, checkdoc-ispell)
(checkdoc-ispell-current-buffer, checkdoc-ispell-interactive)
(checkdoc-ispell-message-interactive)
(checkdoc-ispell-message-text, checkdoc-ispell-start)
(checkdoc-ispell-continue, checkdoc-ispell-comments)
(checkdoc-ispell-defun):
* lisp/emacs-lisp/cl-generic.el (cl--generic-search-method):
* lisp/emacs-lisp/eieio-custom.el (eieio-read-customization-group):
* lisp/emacs-lisp/lisp.el (forward-sexp, up-list):
* lisp/emacs-lisp/package-x.el (package--archive-contents-from-file):
* lisp/emacs-lisp/package.el (package-desc)
(package--make-autoloads-and-stuff, package-hidden-regexps):
* lisp/emacs-lisp/tcover-ses.el (ses-exercise-startup):
* lisp/emacs-lisp/testcover.el (testcover-nohits)
(testcover-1value):
* lisp/epg.el (epg-receive-keys, epg-start-edit-key):
* lisp/erc/erc-backend.el (erc-server-processing-p)
(erc-split-line-length, erc-server-coding-system)
(erc-server-send, erc-message):
* lisp/erc/erc-button.el (erc-button-face, erc-button-alist)
(erc-browse-emacswiki):
* lisp/erc/erc-ezbounce.el (erc-ezbounce, erc-ezb-get-login):
* lisp/erc/erc-fill.el (erc-fill-variable-maximum-indentation):
* lisp/erc/erc-log.el (erc-current-logfile):
* lisp/erc/erc-match.el (erc-log-match-format)
(erc-text-matched-hook):
* lisp/erc/erc-netsplit.el (erc-netsplit, erc-netsplit-debug):
* lisp/erc/erc-networks.el (erc-server-alist)
(erc-networks-alist, erc-current-network):
* lisp/erc/erc-ring.el (erc-input-ring-index):
* lisp/erc/erc-speedbar.el (erc-speedbar)
(erc-speedbar-update-channel):
* lisp/erc/erc-stamp.el (erc-timestamp-only-if-changed-flag):
* lisp/erc/erc-track.el (erc-track-position-in-mode-line)
(erc-track-remove-from-mode-line, erc-modified-channels-update)
(erc-track-last-non-erc-buffer, erc-track-sort-by-importance)
(erc-track-get-active-buffer):
* lisp/erc/erc.el (erc-get-channel-user-list)
(erc-echo-notice-hook, erc-echo-notice-always-hook)
(erc-wash-quit-reason, erc-format-@nick):
* lisp/ffap.el (ffap-latex-mode):
* lisp/files.el (abort-if-file-too-large)
(dir-locals--get-sort-score, buffer-stale--default-function):
* lisp/filesets.el (filesets-tree-max-level, filesets-data)
(filesets-update-pre010505):
* lisp/gnus/gnus-agent.el (gnus-agent-flush-cache):
* lisp/gnus/gnus-art.el (gnus-article-encrypt-protocol)
(gnus-button-prefer-mid-or-mail):
* lisp/gnus/gnus-cus.el (gnus-group-parameters):
* lisp/gnus/gnus-demon.el (gnus-demon-handlers)
(gnus-demon-run-callback):
* lisp/gnus/gnus-dired.el (gnus-dired-print):
* lisp/gnus/gnus-icalendar.el (gnus-icalendar-event-from-buffer):
* lisp/gnus/gnus-range.el (gnus-range-normalize):
* lisp/gnus/gnus-spec.el (gnus-pad-form):
* lisp/gnus/gnus-srvr.el (gnus-server-agent, gnus-server-cloud)
(gnus-server-opened, gnus-server-closed, gnus-server-denied)
(gnus-server-offline):
* lisp/gnus/gnus-sum.el (gnus-refer-thread-use-nnir)
(gnus-refer-thread-limit-to-thread)
(gnus-summary-limit-include-thread, gnus-summary-refer-thread)
(gnus-summary-find-matching):
* lisp/gnus/gnus-util.el (gnus-rescale-image):
* lisp/gnus/gnus.el (gnus-summary-line-format, gnus-no-server):
* lisp/gnus/mail-source.el (mail-source-incoming-file-prefix):
* lisp/gnus/message.el (message-cite-reply-position)
(message-cite-style-outlook, message-cite-style-thunderbird)
(message-cite-style-gmail, message--send-mail-maybe-partially):
* lisp/gnus/mm-extern.el (mm-inline-external-body):
* lisp/gnus/mm-partial.el (mm-inline-partial):
* lisp/gnus/mml-sec.el (mml-secure-message-sign)
(mml-secure-message-sign-encrypt, mml-secure-message-encrypt):
* lisp/gnus/mml2015.el (mml2015-epg-key-image)
(mml2015-epg-key-image-to-string):
* lisp/gnus/nndiary.el (nndiary-reminders, nndiary-get-new-mail):
* lisp/gnus/nnheader.el (nnheader-directory-files-is-safe):
* lisp/gnus/nnir.el (nnir-search-history)
(nnir-imap-search-other, nnir-artlist-length)
(nnir-artlist-article, nnir-artitem-group, nnir-artitem-number)
(nnir-artitem-rsv, nnir-article-group, nnir-article-number)
(nnir-article-rsv, nnir-article-ids, nnir-categorize)
(nnir-retrieve-headers-override-function)
(nnir-imap-default-search-key, nnir-hyrex-additional-switches)
(gnus-group-make-nnir-group, nnir-run-namazu, nnir-read-parms)
(nnir-read-parm, nnir-read-server-parm, nnir-search-thread):
* lisp/gnus/nnmairix.el (nnmairix-default-group)
(nnmairix-propagate-marks):
* lisp/gnus/smime.el (smime-keys, smime-crl-check)
(smime-verify-buffer, smime-noverify-buffer):
* lisp/gnus/spam-report.el (spam-report-url-ping-mm-url):
* lisp/gnus/spam.el (spam-spamassassin-positive-spam-flag-header)
(spam-spamassassin-spam-status-header, spam-sa-learn-rebuild)
(spam-classifications, spam-check-stat, spam-spamassassin-score):
* lisp/help.el (describe-minor-mode-from-symbol):
* lisp/hippie-exp.el (hippie-expand-ignore-buffers):
* lisp/htmlfontify.el (hfy-optimizations, hfy-face-resolve-face)
(hfy-begin-span):
* lisp/ibuf-ext.el (ibuffer-update-saved-filters-format)
(ibuffer-saved-filters, ibuffer-old-saved-filters-warning)
(ibuffer-filtering-qualifiers, ibuffer-repair-saved-filters)
(eval, ibuffer-unary-operand, file-extension, directory):
* lisp/image-dired.el (image-dired-cmd-pngcrush-options):
* lisp/image-mode.el (image-toggle-display):
* lisp/international/ccl.el (ccl-compile-read-multibyte-character)
(ccl-compile-write-multibyte-character):
* lisp/international/kkc.el (kkc-save-init-file):
* lisp/international/latin1-disp.el (latin1-display):
* lisp/international/ogonek.el (ogonek-name-encoding-alist)
(ogonek-information, ogonek-lookup-encoding)
(ogonek-deprefixify-region):
* lisp/isearch.el (isearch-filter-predicate)
(isearch--momentary-message):
* lisp/jsonrpc.el (jsonrpc-connection-send)
(jsonrpc-process-connection, jsonrpc-shutdown)
(jsonrpc--async-request-1):
* lisp/language/tibet-util.el (tibetan-char-p):
* lisp/mail/feedmail.el (feedmail-queue-use-send-time-for-date)
(feedmail-last-chance-hook, feedmail-before-fcc-hook)
(feedmail-send-it-immediately-wrapper, feedmail-find-eoh):
* lisp/mail/hashcash.el (hashcash-generate-payment)
(hashcash-generate-payment-async, hashcash-insert-payment)
(hashcash-verify-payment):
* lisp/mail/rmail.el (rmail-movemail-variant-in-use)
(rmail-get-attr-value):
* lisp/mail/rmailmm.el (rmail-mime-prefer-html, rmail-mime):
* lisp/mail/rmailsum.el (rmail-summary-show-message):
* lisp/mail/supercite.el (sc-raw-mode-toggle):
* lisp/man.el (Man-start-calling):
* lisp/mh-e/mh-acros.el (mh-do-at-event-location)
(mh-iterate-on-messages-in-region, mh-iterate-on-range):
* lisp/mh-e/mh-alias.el (mh-alias-system-aliases)
(mh-alias-reload, mh-alias-ali)
(mh-alias-canonicalize-suggestion, mh-alias-add-alias-to-file)
(mh-alias-add-alias):
* lisp/mouse.el (mouse-save-then-kill):
* lisp/net/browse-url.el (browse-url-default-macosx-browser):
* lisp/net/eudc.el (eudc-set, eudc-variable-protocol-value)
(eudc-variable-server-value, eudc-update-variable)
(eudc-expand-inline):
* lisp/net/eudcb-bbdb.el (eudc-bbdb-format-record-as-result):
* lisp/net/eudcb-ldap.el (eudc-ldap-get-field-list):
* lisp/net/pop3.el (pop3-list):
* lisp/net/soap-client.el (soap-namespace-put)
(soap-xs-parse-sequence, soap-parse-envelope):
* lisp/net/soap-inspect.el (soap-inspect-xs-complex-type):
* lisp/nxml/rng-xsd.el (rng-xsd-date-to-days):
* lisp/org/ob-C.el (org-babel-prep-session:C)
(org-babel-load-session:C):
* lisp/org/ob-J.el (org-babel-execute:J):
* lisp/org/ob-asymptote.el (org-babel-prep-session:asymptote):
* lisp/org/ob-awk.el (org-babel-execute:awk):
* lisp/org/ob-core.el (org-babel-process-file-name):
* lisp/org/ob-ebnf.el (org-babel-execute:ebnf):
* lisp/org/ob-forth.el (org-babel-execute:forth):
* lisp/org/ob-fortran.el (org-babel-execute:fortran)
(org-babel-prep-session:fortran, org-babel-load-session:fortran):
* lisp/org/ob-groovy.el (org-babel-execute:groovy):
* lisp/org/ob-io.el (org-babel-execute:io):
* lisp/org/ob-js.el (org-babel-execute:js):
* lisp/org/ob-lilypond.el (org-babel-default-header-args:lilypond)
(org-babel-lilypond-compile-post-tangle)
(org-babel-lilypond-display-pdf-post-tangle)
(org-babel-lilypond-tangle)
(org-babel-lilypond-execute-tangled-ly)
(org-babel-lilypond-compile-lilyfile)
(org-babel-lilypond-check-for-compile-error)
(org-babel-lilypond-process-compile-error)
(org-babel-lilypond-mark-error-line)
(org-babel-lilypond-parse-error-line)
(org-babel-lilypond-attempt-to-open-pdf)
(org-babel-lilypond-attempt-to-play-midi)
(org-babel-lilypond-switch-extension)
(org-babel-lilypond-set-header-args):
* lisp/org/ob-lua.el (org-babel-prep-session:lua):
* lisp/org/ob-picolisp.el (org-babel-execute:picolisp):
* lisp/org/ob-processing.el (org-babel-prep-session:processing):
* lisp/org/ob-python.el (org-babel-prep-session:python):
* lisp/org/ob-scheme.el (org-babel-scheme-capture-current-message)
(org-babel-scheme-execute-with-geiser, org-babel-execute:scheme):
* lisp/org/ob-shen.el (org-babel-execute:shen):
* lisp/org/org-agenda.el (org-agenda-entry-types)
(org-agenda-move-date-from-past-immediately-to-today)
(org-agenda-time-grid, org-agenda-sorting-strategy)
(org-agenda-filter-by-category, org-agenda-forward-block):
* lisp/org/org-colview.el (org-columns--overlay-text):
* lisp/org/org-faces.el (org-verbatim, org-cycle-level-faces):
* lisp/org/org-indent.el (org-indent-set-line-properties):
* lisp/org/org-macs.el (org-get-limited-outline-regexp):
* lisp/org/org-mobile.el (org-mobile-files):
* lisp/org/org.el (org-use-fast-todo-selection)
(org-extend-today-until, org-use-property-inheritance)
(org-refresh-effort-properties, org-open-at-point-global)
(org-track-ordered-property-with-tag, org-shiftright):
* lisp/org/ox-html.el (org-html-checkbox-type):
* lisp/org/ox-man.el (org-man-source-highlight)
(org-man-verse-block):
* lisp/org/ox-publish.el (org-publish-sitemap-default):
* lisp/outline.el (outline-head-from-level):
* lisp/progmodes/dcl-mode.el (dcl-back-to-indentation-1)
(dcl-calc-command-indent, dcl-indent-to):
* lisp/progmodes/flymake.el (flymake-make-diagnostic)
(flymake--overlays, flymake-diagnostic-functions)
(flymake-diagnostic-types-alist, flymake--backend-state)
(flymake-is-running, flymake--collect, flymake-mode):
* lisp/progmodes/gdb-mi.el (gdb-threads-list, gdb, gdb-non-stop)
(gdb-buffers, gdb-gud-context-call, gdb-jsonify-buffer):
* lisp/progmodes/grep.el (grep-error-screen-columns):
* lisp/progmodes/gud.el (gud-prev-expr):
* lisp/progmodes/ps-mode.el (ps-mode, ps-mode-target-column)
(ps-run-goto-error):
* lisp/progmodes/python.el (python-eldoc-get-doc)
(python-eldoc-function-timeout-permanent, python-eldoc-function):
* lisp/shadowfile.el (shadow-make-group):
* lisp/speedbar.el (speedbar-obj-do-check):
* lisp/textmodes/flyspell.el (flyspell-auto-correct-previous-hook):
* lisp/textmodes/reftex-cite.el (reftex-bib-or-thebib):
* lisp/textmodes/reftex-index.el (reftex-index-goto-entry)
(reftex-index-kill, reftex-index-undo):
* lisp/textmodes/reftex-parse.el (reftex-context-substring):
* lisp/textmodes/reftex.el (reftex-TeX-master-file):
* lisp/textmodes/rst.el (rst-next-hdr, rst-toc)
(rst-uncomment-region, rst-font-lock-extend-region-internal):
* lisp/thumbs.el (thumbs-mode):
* lisp/vc/ediff-util.el (ediff-restore-diff):
* lisp/vc/pcvs-defs.el (cvs-cvsroot, cvs-force-dir-tag):
* lisp/vc/vc-hg.el (vc-hg--ignore-patterns-valid-p):
* lisp/wid-edit.el (widget-field-value-set, string):
* lisp/x-dnd.el (x-dnd-version-from-flags)
(x-dnd-more-than-3-from-flags): Assorted docfixes.
2019-09-21 00:27:53 +02:00
|
|
|
|
fetching."
|
2016-06-10 12:08:29 +03:00
|
|
|
|
(when python-eldoc-get-doc
|
|
|
|
|
(with-timeout (python-eldoc-function-timeout
|
|
|
|
|
(if python-eldoc-function-timeout-permanent
|
|
|
|
|
(progn
|
|
|
|
|
(message "Eldoc echo-area display muted in this buffer, see `python-eldoc-function'")
|
|
|
|
|
(setq python-eldoc-get-doc nil))
|
|
|
|
|
(message "`python-eldoc-function' timed out, see `python-eldoc-function-timeout'")))
|
|
|
|
|
(python-eldoc--get-doc-at-point))))
|
2012-05-17 00:03:00 -03:00
|
|
|
|
|
|
|
|
|
(defun python-eldoc-at-point (symbol)
|
|
|
|
|
"Get help on SYMBOL using `help'.
|
|
|
|
|
Interactively, prompt for symbol."
|
2012-05-17 00:03:35 -03:00
|
|
|
|
(interactive
|
2015-02-07 18:39:07 -03:00
|
|
|
|
(let ((symbol (python-eldoc--get-symbol-at-point))
|
2012-05-17 00:03:35 -03:00
|
|
|
|
(enable-recursive-minibuffers t))
|
|
|
|
|
(list (read-string (if symbol
|
|
|
|
|
(format "Describe symbol (default %s): " symbol)
|
|
|
|
|
"Describe symbol: ")
|
|
|
|
|
nil nil symbol))))
|
2012-07-18 15:40:03 -03:00
|
|
|
|
(message (python-eldoc--get-doc-at-point symbol)))
|
|
|
|
|
|
2016-05-18 09:56:17 -04:00
|
|
|
|
(defun python-describe-at-point (symbol process)
|
|
|
|
|
(interactive (list (python-info-current-symbol)
|
|
|
|
|
(python-shell-get-process)))
|
|
|
|
|
(comint-send-string process (concat "help('" symbol "')\n")))
|
|
|
|
|
|
2015-02-07 16:43:47 -03:00
|
|
|
|
|
|
|
|
|
;;; Hideshow
|
|
|
|
|
|
|
|
|
|
(defun python-hideshow-forward-sexp-function (arg)
|
|
|
|
|
"Python specific `forward-sexp' function for `hs-minor-mode'.
|
|
|
|
|
Argument ARG is ignored."
|
|
|
|
|
arg ; Shut up, byte compiler.
|
|
|
|
|
(python-nav-end-of-defun)
|
|
|
|
|
(unless (python-info-current-line-empty-p)
|
|
|
|
|
(backward-char)))
|
|
|
|
|
|
2012-11-26 18:45:58 -03:00
|
|
|
|
|
|
|
|
|
;;; Imenu
|
|
|
|
|
|
2013-04-18 23:31:09 -03:00
|
|
|
|
(defvar python-imenu-format-item-label-function
|
|
|
|
|
'python-imenu-format-item-label
|
|
|
|
|
"Imenu function used to format an item label.
|
|
|
|
|
It must be a function with two arguments: TYPE and NAME.")
|
|
|
|
|
|
|
|
|
|
(defvar python-imenu-format-parent-item-label-function
|
|
|
|
|
'python-imenu-format-parent-item-label
|
|
|
|
|
"Imenu function used to format a parent item label.
|
|
|
|
|
It must be a function with two arguments: TYPE and NAME.")
|
|
|
|
|
|
|
|
|
|
(defvar python-imenu-format-parent-item-jump-label-function
|
|
|
|
|
'python-imenu-format-parent-item-jump-label
|
|
|
|
|
"Imenu function used to format a parent jump item label.
|
|
|
|
|
It must be a function with two arguments: TYPE and NAME.")
|
|
|
|
|
|
|
|
|
|
(defun python-imenu-format-item-label (type name)
|
lisp/progmodes/python.el: Fix docstring typos.
(defconst, python-syntax-count-quotes)
(python-indent-region, python-indent-shift-right)
(python-indent-dedent-line-backspace, python-nav-backward-sexp)
(python-nav-backward-sexp-safe, python-nav-backward-up-list)
(python-shell-prompt-block-regexp, python-shell-prompt-output-regexp)
(python-shell-prompt-pdb-regexp, python-shell-enable-font-lock)
(inferior-python-mode, python-shell-make-comint, run-python-internal)
(python-shell-buffer-substring, python-shell-send-buffer)
(python-pdbtrack-activate, python-pdbtrack-stacktrace-info-regexp)
(python-completion-complete-at-point, python-fill-docstring-style)
(python-eldoc-function, python-imenu-format-item-label)
(python-imenu-format-parent-item-label)
(python-imenu-format-parent-item-jump-label)
(python-imenu--build-tree, python-imenu-create-index)
(python-imenu-create-flat-index): Fix docstring typos.
(python-indent-context, python-shell-prompt-regexp, run-python):
Remove superfluous backslashes.
(python-indent-line, python-nav-beginning-of-defun)
(python-shell-get-buffer, python-shell-get-process)
(python-info-current-defun, python-info-current-line-comment-p)
(python-info-current-line-empty-p, python-util-popn): Doc fixes.
(python-indent-post-self-insert-function, python-shell-send-file)
(python-shell-completion-get-completions)
(python-shell-completion-complete-or-indent)
(python-eldoc--get-doc-at-point): Reflow docstrings.
2014-03-15 18:37:58 +01:00
|
|
|
|
"Return Imenu label for single node using TYPE and NAME."
|
2013-04-18 23:31:09 -03:00
|
|
|
|
(format "%s (%s)" name type))
|
|
|
|
|
|
|
|
|
|
(defun python-imenu-format-parent-item-label (type name)
|
lisp/progmodes/python.el: Fix docstring typos.
(defconst, python-syntax-count-quotes)
(python-indent-region, python-indent-shift-right)
(python-indent-dedent-line-backspace, python-nav-backward-sexp)
(python-nav-backward-sexp-safe, python-nav-backward-up-list)
(python-shell-prompt-block-regexp, python-shell-prompt-output-regexp)
(python-shell-prompt-pdb-regexp, python-shell-enable-font-lock)
(inferior-python-mode, python-shell-make-comint, run-python-internal)
(python-shell-buffer-substring, python-shell-send-buffer)
(python-pdbtrack-activate, python-pdbtrack-stacktrace-info-regexp)
(python-completion-complete-at-point, python-fill-docstring-style)
(python-eldoc-function, python-imenu-format-item-label)
(python-imenu-format-parent-item-label)
(python-imenu-format-parent-item-jump-label)
(python-imenu--build-tree, python-imenu-create-index)
(python-imenu-create-flat-index): Fix docstring typos.
(python-indent-context, python-shell-prompt-regexp, run-python):
Remove superfluous backslashes.
(python-indent-line, python-nav-beginning-of-defun)
(python-shell-get-buffer, python-shell-get-process)
(python-info-current-defun, python-info-current-line-comment-p)
(python-info-current-line-empty-p, python-util-popn): Doc fixes.
(python-indent-post-self-insert-function, python-shell-send-file)
(python-shell-completion-get-completions)
(python-shell-completion-complete-or-indent)
(python-eldoc--get-doc-at-point): Reflow docstrings.
2014-03-15 18:37:58 +01:00
|
|
|
|
"Return Imenu label for parent node using TYPE and NAME."
|
2013-04-18 23:31:09 -03:00
|
|
|
|
(format "%s..." (python-imenu-format-item-label type name)))
|
|
|
|
|
|
2013-09-04 23:46:34 -04:00
|
|
|
|
(defun python-imenu-format-parent-item-jump-label (type _name)
|
lisp/progmodes/python.el: Fix docstring typos.
(defconst, python-syntax-count-quotes)
(python-indent-region, python-indent-shift-right)
(python-indent-dedent-line-backspace, python-nav-backward-sexp)
(python-nav-backward-sexp-safe, python-nav-backward-up-list)
(python-shell-prompt-block-regexp, python-shell-prompt-output-regexp)
(python-shell-prompt-pdb-regexp, python-shell-enable-font-lock)
(inferior-python-mode, python-shell-make-comint, run-python-internal)
(python-shell-buffer-substring, python-shell-send-buffer)
(python-pdbtrack-activate, python-pdbtrack-stacktrace-info-regexp)
(python-completion-complete-at-point, python-fill-docstring-style)
(python-eldoc-function, python-imenu-format-item-label)
(python-imenu-format-parent-item-label)
(python-imenu-format-parent-item-jump-label)
(python-imenu--build-tree, python-imenu-create-index)
(python-imenu-create-flat-index): Fix docstring typos.
(python-indent-context, python-shell-prompt-regexp, run-python):
Remove superfluous backslashes.
(python-indent-line, python-nav-beginning-of-defun)
(python-shell-get-buffer, python-shell-get-process)
(python-info-current-defun, python-info-current-line-comment-p)
(python-info-current-line-empty-p, python-util-popn): Doc fixes.
(python-indent-post-self-insert-function, python-shell-send-file)
(python-shell-completion-get-completions)
(python-shell-completion-complete-or-indent)
(python-eldoc--get-doc-at-point): Reflow docstrings.
2014-03-15 18:37:58 +01:00
|
|
|
|
"Return Imenu label for parent node jump using TYPE and NAME."
|
2013-04-18 23:31:09 -03:00
|
|
|
|
(if (string= type "class")
|
|
|
|
|
"*class definition*"
|
|
|
|
|
"*function definition*"))
|
|
|
|
|
|
2017-01-04 21:46:21 +03:00
|
|
|
|
(defun python-imenu--get-defun-type-name ()
|
|
|
|
|
"Return defun type and name at current position."
|
|
|
|
|
(when (looking-at python-nav-beginning-of-defun-regexp)
|
|
|
|
|
(let ((split (split-string (match-string-no-properties 0))))
|
|
|
|
|
(if (= (length split) 2)
|
|
|
|
|
split
|
|
|
|
|
(list (concat (car split) " " (cadr split))
|
|
|
|
|
(car (last split)))))))
|
|
|
|
|
|
2013-08-13 13:36:32 -03:00
|
|
|
|
(defun python-imenu--put-parent (type name pos tree)
|
|
|
|
|
"Add the parent with TYPE, NAME and POS to TREE."
|
2013-04-18 23:31:09 -03:00
|
|
|
|
(let ((label
|
|
|
|
|
(funcall python-imenu-format-item-label-function type name))
|
|
|
|
|
(jump-label
|
|
|
|
|
(funcall python-imenu-format-parent-item-jump-label-function type name)))
|
2013-08-13 13:36:32 -03:00
|
|
|
|
(if (not tree)
|
|
|
|
|
(cons label pos)
|
|
|
|
|
(cons label (cons (cons jump-label pos) tree)))))
|
2013-04-18 23:31:09 -03:00
|
|
|
|
|
2013-08-13 13:36:32 -03:00
|
|
|
|
(defun python-imenu--build-tree (&optional min-indent prev-indent tree)
|
2013-04-18 23:31:09 -03:00
|
|
|
|
"Recursively build the tree of nested definitions of a node.
|
lisp/progmodes/python.el: Fix docstring typos.
(defconst, python-syntax-count-quotes)
(python-indent-region, python-indent-shift-right)
(python-indent-dedent-line-backspace, python-nav-backward-sexp)
(python-nav-backward-sexp-safe, python-nav-backward-up-list)
(python-shell-prompt-block-regexp, python-shell-prompt-output-regexp)
(python-shell-prompt-pdb-regexp, python-shell-enable-font-lock)
(inferior-python-mode, python-shell-make-comint, run-python-internal)
(python-shell-buffer-substring, python-shell-send-buffer)
(python-pdbtrack-activate, python-pdbtrack-stacktrace-info-regexp)
(python-completion-complete-at-point, python-fill-docstring-style)
(python-eldoc-function, python-imenu-format-item-label)
(python-imenu-format-parent-item-label)
(python-imenu-format-parent-item-jump-label)
(python-imenu--build-tree, python-imenu-create-index)
(python-imenu-create-flat-index): Fix docstring typos.
(python-indent-context, python-shell-prompt-regexp, run-python):
Remove superfluous backslashes.
(python-indent-line, python-nav-beginning-of-defun)
(python-shell-get-buffer, python-shell-get-process)
(python-info-current-defun, python-info-current-line-comment-p)
(python-info-current-line-empty-p, python-util-popn): Doc fixes.
(python-indent-post-self-insert-function, python-shell-send-file)
(python-shell-completion-get-completions)
(python-shell-completion-complete-or-indent)
(python-eldoc--get-doc-at-point): Reflow docstrings.
2014-03-15 18:37:58 +01:00
|
|
|
|
Arguments MIN-INDENT, PREV-INDENT and TREE are internal and should
|
2013-08-13 13:36:32 -03:00
|
|
|
|
not be passed explicitly unless you know what you are doing."
|
|
|
|
|
(setq min-indent (or min-indent 0)
|
|
|
|
|
prev-indent (or prev-indent python-indent-offset))
|
2013-04-18 23:31:09 -03:00
|
|
|
|
(let* ((pos (python-nav-backward-defun))
|
2017-01-04 21:46:21 +03:00
|
|
|
|
(defun-type-name (and pos (python-imenu--get-defun-type-name)))
|
|
|
|
|
(type (car defun-type-name))
|
|
|
|
|
(name (cadr defun-type-name))
|
2013-04-18 23:31:09 -03:00
|
|
|
|
(label (when name
|
|
|
|
|
(funcall python-imenu-format-item-label-function type name)))
|
2013-08-13 13:36:32 -03:00
|
|
|
|
(indent (current-indentation))
|
|
|
|
|
(children-indent-limit (+ python-indent-offset min-indent)))
|
2013-04-18 23:31:09 -03:00
|
|
|
|
(cond ((not pos)
|
2013-08-13 13:36:32 -03:00
|
|
|
|
;; Nothing found, probably near to bobp.
|
|
|
|
|
nil)
|
|
|
|
|
((<= indent min-indent)
|
|
|
|
|
;; The current indentation points that this is a parent
|
|
|
|
|
;; node, add it to the tree and stop recursing.
|
|
|
|
|
(python-imenu--put-parent type name pos tree))
|
2013-04-18 23:31:09 -03:00
|
|
|
|
(t
|
|
|
|
|
(python-imenu--build-tree
|
|
|
|
|
min-indent
|
|
|
|
|
indent
|
2013-08-13 13:36:32 -03:00
|
|
|
|
(if (<= indent children-indent-limit)
|
2013-08-15 22:15:51 -07:00
|
|
|
|
;; This lies within the children indent offset range,
|
|
|
|
|
;; so it's a normal child of its parent (i.e., not
|
|
|
|
|
;; a child of a child).
|
2013-08-13 13:36:32 -03:00
|
|
|
|
(cons (cons label pos) tree)
|
2013-08-15 22:15:51 -07:00
|
|
|
|
;; Oh no, a child of a child?! Fear not, we
|
|
|
|
|
;; know how to roll. We recursively parse these by
|
2013-08-13 13:36:32 -03:00
|
|
|
|
;; swapping prev-indent and min-indent plus adding this
|
2013-08-15 22:15:51 -07:00
|
|
|
|
;; newly found item to a fresh subtree. This works, I
|
2013-08-13 13:36:32 -03:00
|
|
|
|
;; promise.
|
|
|
|
|
(cons
|
|
|
|
|
(python-imenu--build-tree
|
|
|
|
|
prev-indent indent (list (cons label pos)))
|
|
|
|
|
tree)))))))
|
2013-04-18 23:31:09 -03:00
|
|
|
|
|
|
|
|
|
(defun python-imenu-create-index ()
|
lisp/progmodes/python.el: Fix docstring typos.
(defconst, python-syntax-count-quotes)
(python-indent-region, python-indent-shift-right)
(python-indent-dedent-line-backspace, python-nav-backward-sexp)
(python-nav-backward-sexp-safe, python-nav-backward-up-list)
(python-shell-prompt-block-regexp, python-shell-prompt-output-regexp)
(python-shell-prompt-pdb-regexp, python-shell-enable-font-lock)
(inferior-python-mode, python-shell-make-comint, run-python-internal)
(python-shell-buffer-substring, python-shell-send-buffer)
(python-pdbtrack-activate, python-pdbtrack-stacktrace-info-regexp)
(python-completion-complete-at-point, python-fill-docstring-style)
(python-eldoc-function, python-imenu-format-item-label)
(python-imenu-format-parent-item-label)
(python-imenu-format-parent-item-jump-label)
(python-imenu--build-tree, python-imenu-create-index)
(python-imenu-create-flat-index): Fix docstring typos.
(python-indent-context, python-shell-prompt-regexp, run-python):
Remove superfluous backslashes.
(python-indent-line, python-nav-beginning-of-defun)
(python-shell-get-buffer, python-shell-get-process)
(python-info-current-defun, python-info-current-line-comment-p)
(python-info-current-line-empty-p, python-util-popn): Doc fixes.
(python-indent-post-self-insert-function, python-shell-send-file)
(python-shell-completion-get-completions)
(python-shell-completion-complete-or-indent)
(python-eldoc--get-doc-at-point): Reflow docstrings.
2014-03-15 18:37:58 +01:00
|
|
|
|
"Return tree Imenu alist for the current Python buffer.
|
2013-04-18 23:31:09 -03:00
|
|
|
|
Change `python-imenu-format-item-label-function',
|
|
|
|
|
`python-imenu-format-parent-item-label-function',
|
|
|
|
|
`python-imenu-format-parent-item-jump-label-function' to
|
|
|
|
|
customize how labels are formatted."
|
|
|
|
|
(goto-char (point-max))
|
|
|
|
|
(let ((index)
|
|
|
|
|
(tree))
|
|
|
|
|
(while (setq tree (python-imenu--build-tree))
|
|
|
|
|
(setq index (cons tree index)))
|
|
|
|
|
index))
|
|
|
|
|
|
|
|
|
|
(defun python-imenu-create-flat-index (&optional alist prefix)
|
lisp/progmodes/python.el: Fix docstring typos.
(defconst, python-syntax-count-quotes)
(python-indent-region, python-indent-shift-right)
(python-indent-dedent-line-backspace, python-nav-backward-sexp)
(python-nav-backward-sexp-safe, python-nav-backward-up-list)
(python-shell-prompt-block-regexp, python-shell-prompt-output-regexp)
(python-shell-prompt-pdb-regexp, python-shell-enable-font-lock)
(inferior-python-mode, python-shell-make-comint, run-python-internal)
(python-shell-buffer-substring, python-shell-send-buffer)
(python-pdbtrack-activate, python-pdbtrack-stacktrace-info-regexp)
(python-completion-complete-at-point, python-fill-docstring-style)
(python-eldoc-function, python-imenu-format-item-label)
(python-imenu-format-parent-item-label)
(python-imenu-format-parent-item-jump-label)
(python-imenu--build-tree, python-imenu-create-index)
(python-imenu-create-flat-index): Fix docstring typos.
(python-indent-context, python-shell-prompt-regexp, run-python):
Remove superfluous backslashes.
(python-indent-line, python-nav-beginning-of-defun)
(python-shell-get-buffer, python-shell-get-process)
(python-info-current-defun, python-info-current-line-comment-p)
(python-info-current-line-empty-p, python-util-popn): Doc fixes.
(python-indent-post-self-insert-function, python-shell-send-file)
(python-shell-completion-get-completions)
(python-shell-completion-complete-or-indent)
(python-eldoc--get-doc-at-point): Reflow docstrings.
2014-03-15 18:37:58 +01:00
|
|
|
|
"Return flat outline of the current Python buffer for Imenu.
|
|
|
|
|
Optional argument ALIST is the tree to be flattened; when nil
|
2013-04-18 23:31:09 -03:00
|
|
|
|
`python-imenu-build-index' is used with
|
|
|
|
|
`python-imenu-format-parent-item-jump-label-function'
|
|
|
|
|
`python-imenu-format-parent-item-label-function'
|
lisp/progmodes/python.el: Fix docstring typos.
(defconst, python-syntax-count-quotes)
(python-indent-region, python-indent-shift-right)
(python-indent-dedent-line-backspace, python-nav-backward-sexp)
(python-nav-backward-sexp-safe, python-nav-backward-up-list)
(python-shell-prompt-block-regexp, python-shell-prompt-output-regexp)
(python-shell-prompt-pdb-regexp, python-shell-enable-font-lock)
(inferior-python-mode, python-shell-make-comint, run-python-internal)
(python-shell-buffer-substring, python-shell-send-buffer)
(python-pdbtrack-activate, python-pdbtrack-stacktrace-info-regexp)
(python-completion-complete-at-point, python-fill-docstring-style)
(python-eldoc-function, python-imenu-format-item-label)
(python-imenu-format-parent-item-label)
(python-imenu-format-parent-item-jump-label)
(python-imenu--build-tree, python-imenu-create-index)
(python-imenu-create-flat-index): Fix docstring typos.
(python-indent-context, python-shell-prompt-regexp, run-python):
Remove superfluous backslashes.
(python-indent-line, python-nav-beginning-of-defun)
(python-shell-get-buffer, python-shell-get-process)
(python-info-current-defun, python-info-current-line-comment-p)
(python-info-current-line-empty-p, python-util-popn): Doc fixes.
(python-indent-post-self-insert-function, python-shell-send-file)
(python-shell-completion-get-completions)
(python-shell-completion-complete-or-indent)
(python-eldoc--get-doc-at-point): Reflow docstrings.
2014-03-15 18:37:58 +01:00
|
|
|
|
`python-imenu-format-item-label-function' set to
|
|
|
|
|
(lambda (type name) name)
|
|
|
|
|
Optional argument PREFIX is used in recursive calls and should
|
|
|
|
|
not be passed explicitly.
|
2013-04-18 23:31:09 -03:00
|
|
|
|
|
|
|
|
|
Converts this:
|
|
|
|
|
|
lisp/progmodes/python.el: Fix docstring typos.
(defconst, python-syntax-count-quotes)
(python-indent-region, python-indent-shift-right)
(python-indent-dedent-line-backspace, python-nav-backward-sexp)
(python-nav-backward-sexp-safe, python-nav-backward-up-list)
(python-shell-prompt-block-regexp, python-shell-prompt-output-regexp)
(python-shell-prompt-pdb-regexp, python-shell-enable-font-lock)
(inferior-python-mode, python-shell-make-comint, run-python-internal)
(python-shell-buffer-substring, python-shell-send-buffer)
(python-pdbtrack-activate, python-pdbtrack-stacktrace-info-regexp)
(python-completion-complete-at-point, python-fill-docstring-style)
(python-eldoc-function, python-imenu-format-item-label)
(python-imenu-format-parent-item-label)
(python-imenu-format-parent-item-jump-label)
(python-imenu--build-tree, python-imenu-create-index)
(python-imenu-create-flat-index): Fix docstring typos.
(python-indent-context, python-shell-prompt-regexp, run-python):
Remove superfluous backslashes.
(python-indent-line, python-nav-beginning-of-defun)
(python-shell-get-buffer, python-shell-get-process)
(python-info-current-defun, python-info-current-line-comment-p)
(python-info-current-line-empty-p, python-util-popn): Doc fixes.
(python-indent-post-self-insert-function, python-shell-send-file)
(python-shell-completion-get-completions)
(python-shell-completion-complete-or-indent)
(python-eldoc--get-doc-at-point): Reflow docstrings.
2014-03-15 18:37:58 +01:00
|
|
|
|
((\"Foo\" . 103)
|
2013-04-18 23:31:09 -03:00
|
|
|
|
(\"Bar\" . 138)
|
|
|
|
|
(\"decorator\"
|
|
|
|
|
(\"decorator\" . 173)
|
|
|
|
|
(\"wrap\"
|
|
|
|
|
(\"wrap\" . 353)
|
|
|
|
|
(\"wrapped_f\" . 393))))
|
|
|
|
|
|
|
|
|
|
To this:
|
|
|
|
|
|
lisp/progmodes/python.el: Fix docstring typos.
(defconst, python-syntax-count-quotes)
(python-indent-region, python-indent-shift-right)
(python-indent-dedent-line-backspace, python-nav-backward-sexp)
(python-nav-backward-sexp-safe, python-nav-backward-up-list)
(python-shell-prompt-block-regexp, python-shell-prompt-output-regexp)
(python-shell-prompt-pdb-regexp, python-shell-enable-font-lock)
(inferior-python-mode, python-shell-make-comint, run-python-internal)
(python-shell-buffer-substring, python-shell-send-buffer)
(python-pdbtrack-activate, python-pdbtrack-stacktrace-info-regexp)
(python-completion-complete-at-point, python-fill-docstring-style)
(python-eldoc-function, python-imenu-format-item-label)
(python-imenu-format-parent-item-label)
(python-imenu-format-parent-item-jump-label)
(python-imenu--build-tree, python-imenu-create-index)
(python-imenu-create-flat-index): Fix docstring typos.
(python-indent-context, python-shell-prompt-regexp, run-python):
Remove superfluous backslashes.
(python-indent-line, python-nav-beginning-of-defun)
(python-shell-get-buffer, python-shell-get-process)
(python-info-current-defun, python-info-current-line-comment-p)
(python-info-current-line-empty-p, python-util-popn): Doc fixes.
(python-indent-post-self-insert-function, python-shell-send-file)
(python-shell-completion-get-completions)
(python-shell-completion-complete-or-indent)
(python-eldoc--get-doc-at-point): Reflow docstrings.
2014-03-15 18:37:58 +01:00
|
|
|
|
((\"Foo\" . 103)
|
2013-04-18 23:31:09 -03:00
|
|
|
|
(\"Bar\" . 138)
|
|
|
|
|
(\"decorator\" . 173)
|
|
|
|
|
(\"decorator.wrap\" . 353)
|
|
|
|
|
(\"decorator.wrapped_f\" . 393))"
|
2013-04-19 10:29:41 -03:00
|
|
|
|
;; Inspired by imenu--flatten-index-alist removed in revno 21853.
|
2013-04-18 23:31:09 -03:00
|
|
|
|
(apply
|
|
|
|
|
'nconc
|
|
|
|
|
(mapcar
|
|
|
|
|
(lambda (item)
|
|
|
|
|
(let ((name (if prefix
|
|
|
|
|
(concat prefix "." (car item))
|
|
|
|
|
(car item)))
|
|
|
|
|
(pos (cdr item)))
|
|
|
|
|
(cond ((or (numberp pos) (markerp pos))
|
|
|
|
|
(list (cons name pos)))
|
|
|
|
|
((listp pos)
|
|
|
|
|
(cons
|
|
|
|
|
(cons name (cdar pos))
|
|
|
|
|
(python-imenu-create-flat-index (cddr item) name))))))
|
|
|
|
|
(or alist
|
2013-09-04 23:46:34 -04:00
|
|
|
|
(let* ((fn (lambda (_type name) name))
|
2013-04-19 10:29:41 -03:00
|
|
|
|
(python-imenu-format-item-label-function fn)
|
|
|
|
|
(python-imenu-format-parent-item-label-function fn)
|
|
|
|
|
(python-imenu-format-parent-item-jump-label-function fn))
|
2013-04-18 23:31:09 -03:00
|
|
|
|
(python-imenu-create-index))))))
|
2012-11-26 18:45:58 -03:00
|
|
|
|
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
|
|
|
|
;;; Misc helpers
|
|
|
|
|
|
2012-05-17 00:03:14 -03:00
|
|
|
|
(defun python-info-current-defun (&optional include-type)
|
2012-05-17 00:02:52 -03:00
|
|
|
|
"Return name of surrounding function with Python compatible dotty syntax.
|
2012-05-17 00:03:14 -03:00
|
|
|
|
Optional argument INCLUDE-TYPE indicates to include the type of the defun.
|
lisp/progmodes/python.el: Fix docstring typos.
(defconst, python-syntax-count-quotes)
(python-indent-region, python-indent-shift-right)
(python-indent-dedent-line-backspace, python-nav-backward-sexp)
(python-nav-backward-sexp-safe, python-nav-backward-up-list)
(python-shell-prompt-block-regexp, python-shell-prompt-output-regexp)
(python-shell-prompt-pdb-regexp, python-shell-enable-font-lock)
(inferior-python-mode, python-shell-make-comint, run-python-internal)
(python-shell-buffer-substring, python-shell-send-buffer)
(python-pdbtrack-activate, python-pdbtrack-stacktrace-info-regexp)
(python-completion-complete-at-point, python-fill-docstring-style)
(python-eldoc-function, python-imenu-format-item-label)
(python-imenu-format-parent-item-label)
(python-imenu-format-parent-item-jump-label)
(python-imenu--build-tree, python-imenu-create-index)
(python-imenu-create-flat-index): Fix docstring typos.
(python-indent-context, python-shell-prompt-regexp, run-python):
Remove superfluous backslashes.
(python-indent-line, python-nav-beginning-of-defun)
(python-shell-get-buffer, python-shell-get-process)
(python-info-current-defun, python-info-current-line-comment-p)
(python-info-current-line-empty-p, python-util-popn): Doc fixes.
(python-indent-post-self-insert-function, python-shell-send-file)
(python-shell-completion-get-completions)
(python-shell-completion-complete-or-indent)
(python-eldoc--get-doc-at-point): Reflow docstrings.
2014-03-15 18:37:58 +01:00
|
|
|
|
This function can be used as the value of `add-log-current-defun-function'
|
|
|
|
|
since it returns nil if point is not inside a defun."
|
2013-02-13 20:07:59 -03:00
|
|
|
|
(save-restriction
|
2017-12-14 11:18:51 +02:00
|
|
|
|
(widen)
|
2013-02-13 20:07:59 -03:00
|
|
|
|
(save-excursion
|
|
|
|
|
(end-of-line 1)
|
|
|
|
|
(let ((names)
|
|
|
|
|
(starting-indentation (current-indentation))
|
|
|
|
|
(starting-pos (point))
|
|
|
|
|
(first-run t)
|
|
|
|
|
(last-indent)
|
|
|
|
|
(type))
|
|
|
|
|
(catch 'exit
|
|
|
|
|
(while (python-nav-beginning-of-defun 1)
|
2013-02-20 17:41:46 -03:00
|
|
|
|
(when (save-match-data
|
|
|
|
|
(and
|
|
|
|
|
(or (not last-indent)
|
|
|
|
|
(< (current-indentation) last-indent))
|
|
|
|
|
(or
|
|
|
|
|
(and first-run
|
|
|
|
|
(save-excursion
|
|
|
|
|
;; If this is the first run, we may add
|
|
|
|
|
;; the current defun at point.
|
|
|
|
|
(setq first-run nil)
|
|
|
|
|
(goto-char starting-pos)
|
|
|
|
|
(python-nav-beginning-of-statement)
|
|
|
|
|
(beginning-of-line 1)
|
|
|
|
|
(looking-at-p
|
|
|
|
|
python-nav-beginning-of-defun-regexp)))
|
|
|
|
|
(< starting-pos
|
2012-11-12 10:26:50 -03:00
|
|
|
|
(save-excursion
|
2013-02-20 17:41:46 -03:00
|
|
|
|
(let ((min-indent
|
|
|
|
|
(+ (current-indentation)
|
|
|
|
|
python-indent-offset)))
|
|
|
|
|
(if (< starting-indentation min-indent)
|
|
|
|
|
;; If the starting indentation is not
|
|
|
|
|
;; within the min defun indent make the
|
|
|
|
|
;; check fail.
|
|
|
|
|
starting-pos
|
|
|
|
|
;; Else go to the end of defun and add
|
|
|
|
|
;; up the current indentation to the
|
|
|
|
|
;; ending position.
|
|
|
|
|
(python-nav-end-of-defun)
|
|
|
|
|
(+ (point)
|
|
|
|
|
(if (>= (current-indentation) min-indent)
|
|
|
|
|
(1+ (current-indentation))
|
|
|
|
|
0)))))))))
|
|
|
|
|
(save-match-data (setq last-indent (current-indentation)))
|
2013-02-13 20:07:59 -03:00
|
|
|
|
(if (or (not include-type) type)
|
|
|
|
|
(setq names (cons (match-string-no-properties 1) names))
|
|
|
|
|
(let ((match (split-string (match-string-no-properties 0))))
|
|
|
|
|
(setq type (car match))
|
|
|
|
|
(setq names (cons (cadr match) names)))))
|
|
|
|
|
;; Stop searching ASAP.
|
|
|
|
|
(and (= (current-indentation) 0) (throw 'exit t))))
|
|
|
|
|
(and names
|
|
|
|
|
(concat (and type (format "%s " type))
|
|
|
|
|
(mapconcat 'identity names ".")))))))
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
2012-07-18 15:40:03 -03:00
|
|
|
|
(defun python-info-current-symbol (&optional replace-self)
|
|
|
|
|
"Return current symbol using dotty syntax.
|
|
|
|
|
With optional argument REPLACE-SELF convert \"self\" to current
|
|
|
|
|
parent defun name."
|
|
|
|
|
(let ((name
|
2012-08-07 23:30:08 -03:00
|
|
|
|
(and (not (python-syntax-comment-or-string-p))
|
2012-07-18 15:40:03 -03:00
|
|
|
|
(with-syntax-table python-dotty-syntax-table
|
|
|
|
|
(let ((sym (symbol-at-point)))
|
|
|
|
|
(and sym
|
|
|
|
|
(substring-no-properties (symbol-name sym))))))))
|
|
|
|
|
(when name
|
|
|
|
|
(if (not replace-self)
|
|
|
|
|
name
|
|
|
|
|
(let ((current-defun (python-info-current-defun)))
|
|
|
|
|
(if (not current-defun)
|
|
|
|
|
name
|
|
|
|
|
(replace-regexp-in-string
|
|
|
|
|
(python-rx line-start word-start "self" word-end ?.)
|
|
|
|
|
(concat
|
|
|
|
|
(mapconcat 'identity
|
|
|
|
|
(butlast (split-string current-defun "\\."))
|
|
|
|
|
".") ".")
|
|
|
|
|
name)))))))
|
|
|
|
|
|
2012-10-08 02:19:15 -03:00
|
|
|
|
(defun python-info-statement-starts-block-p ()
|
2012-07-17 17:27:49 -03:00
|
|
|
|
"Return non-nil if current statement opens a block."
|
|
|
|
|
(save-excursion
|
|
|
|
|
(python-nav-beginning-of-statement)
|
|
|
|
|
(looking-at (python-rx block-start))))
|
|
|
|
|
|
2012-10-08 02:19:15 -03:00
|
|
|
|
(defun python-info-statement-ends-block-p ()
|
|
|
|
|
"Return non-nil if point is at end of block."
|
|
|
|
|
(let ((end-of-block-pos (save-excursion
|
|
|
|
|
(python-nav-end-of-block)))
|
|
|
|
|
(end-of-statement-pos (save-excursion
|
|
|
|
|
(python-nav-end-of-statement))))
|
|
|
|
|
(and end-of-block-pos end-of-statement-pos
|
|
|
|
|
(= end-of-block-pos end-of-statement-pos))))
|
|
|
|
|
|
|
|
|
|
(defun python-info-beginning-of-statement-p ()
|
|
|
|
|
"Return non-nil if point is at beginning of statement."
|
|
|
|
|
(= (point) (save-excursion
|
|
|
|
|
(python-nav-beginning-of-statement)
|
|
|
|
|
(point))))
|
|
|
|
|
|
|
|
|
|
(defun python-info-end-of-statement-p ()
|
|
|
|
|
"Return non-nil if point is at end of statement."
|
|
|
|
|
(= (point) (save-excursion
|
|
|
|
|
(python-nav-end-of-statement)
|
|
|
|
|
(point))))
|
|
|
|
|
|
|
|
|
|
(defun python-info-beginning-of-block-p ()
|
|
|
|
|
"Return non-nil if point is at beginning of block."
|
|
|
|
|
(and (python-info-beginning-of-statement-p)
|
|
|
|
|
(python-info-statement-starts-block-p)))
|
|
|
|
|
|
|
|
|
|
(defun python-info-end-of-block-p ()
|
|
|
|
|
"Return non-nil if point is at end of block."
|
|
|
|
|
(and (python-info-end-of-statement-p)
|
|
|
|
|
(python-info-statement-ends-block-p)))
|
|
|
|
|
|
2014-07-09 00:55:53 -03:00
|
|
|
|
(define-obsolete-function-alias
|
|
|
|
|
'python-info-closing-block
|
|
|
|
|
'python-info-dedenter-opening-block-position "24.4")
|
|
|
|
|
|
|
|
|
|
(defun python-info-dedenter-opening-block-position ()
|
|
|
|
|
"Return the point of the closest block the current line closes.
|
|
|
|
|
Returns nil if point is not on a dedenter statement or no opening
|
|
|
|
|
block can be detected. The latter case meaning current file is
|
|
|
|
|
likely an invalid python file."
|
|
|
|
|
(let ((positions (python-info-dedenter-opening-block-positions))
|
|
|
|
|
(indentation (current-indentation))
|
|
|
|
|
(position))
|
|
|
|
|
(while (and (not position)
|
|
|
|
|
positions)
|
2012-05-17 00:02:52 -03:00
|
|
|
|
(save-excursion
|
2014-07-09 00:55:53 -03:00
|
|
|
|
(goto-char (car positions))
|
|
|
|
|
(if (<= (current-indentation) indentation)
|
|
|
|
|
(setq position (car positions))
|
|
|
|
|
(setq positions (cdr positions)))))
|
|
|
|
|
position))
|
|
|
|
|
|
|
|
|
|
(defun python-info-dedenter-opening-block-positions ()
|
|
|
|
|
"Return points of blocks the current line may close sorted by closer.
|
|
|
|
|
Returns nil if point is not on a dedenter statement or no opening
|
|
|
|
|
block can be detected. The latter case meaning current file is
|
|
|
|
|
likely an invalid python file."
|
|
|
|
|
(save-excursion
|
|
|
|
|
(let ((dedenter-pos (python-info-dedenter-statement-p)))
|
|
|
|
|
(when dedenter-pos
|
|
|
|
|
(goto-char dedenter-pos)
|
2016-12-12 17:55:25 -08:00
|
|
|
|
(let* ((cur-line (line-beginning-position))
|
|
|
|
|
(pairs '(("elif" "elif" "if")
|
2014-07-09 00:55:53 -03:00
|
|
|
|
("else" "if" "elif" "except" "for" "while")
|
|
|
|
|
("except" "except" "try")
|
|
|
|
|
("finally" "else" "except" "try")))
|
|
|
|
|
(dedenter (match-string-no-properties 0))
|
|
|
|
|
(possible-opening-blocks (cdr (assoc-string dedenter pairs)))
|
|
|
|
|
(collected-indentations)
|
|
|
|
|
(opening-blocks))
|
|
|
|
|
(catch 'exit
|
|
|
|
|
(while (python-nav--syntactically
|
|
|
|
|
(lambda ()
|
|
|
|
|
(re-search-backward (python-rx block-start) nil t))
|
|
|
|
|
#'<)
|
|
|
|
|
(let ((indentation (current-indentation)))
|
|
|
|
|
(when (and (not (memq indentation collected-indentations))
|
|
|
|
|
(or (not collected-indentations)
|
2016-12-12 17:55:25 -08:00
|
|
|
|
(< indentation (apply #'min collected-indentations)))
|
|
|
|
|
;; There must be no line with indentation
|
|
|
|
|
;; smaller than `indentation' (except for
|
|
|
|
|
;; blank lines) between the found opening
|
|
|
|
|
;; block and the current line, otherwise it
|
|
|
|
|
;; is not an opening block.
|
|
|
|
|
(save-excursion
|
|
|
|
|
(forward-line)
|
|
|
|
|
(let ((no-back-indent t))
|
|
|
|
|
(save-match-data
|
|
|
|
|
(while (and (< (point) cur-line)
|
|
|
|
|
(setq no-back-indent
|
|
|
|
|
(or (> (current-indentation) indentation)
|
|
|
|
|
(python-info-current-line-empty-p))))
|
|
|
|
|
(forward-line)))
|
|
|
|
|
no-back-indent)))
|
2014-07-09 00:55:53 -03:00
|
|
|
|
(setq collected-indentations
|
|
|
|
|
(cons indentation collected-indentations))
|
|
|
|
|
(when (member (match-string-no-properties 0)
|
|
|
|
|
possible-opening-blocks)
|
|
|
|
|
(setq opening-blocks (cons (point) opening-blocks))))
|
|
|
|
|
(when (zerop indentation)
|
|
|
|
|
(throw 'exit nil)))))
|
|
|
|
|
;; sort by closer
|
|
|
|
|
(nreverse opening-blocks))))))
|
|
|
|
|
|
|
|
|
|
(define-obsolete-function-alias
|
|
|
|
|
'python-info-closing-block-message
|
|
|
|
|
'python-info-dedenter-opening-block-message "24.4")
|
|
|
|
|
|
|
|
|
|
(defun python-info-dedenter-opening-block-message ()
|
|
|
|
|
"Message the first line of the block the current statement closes."
|
|
|
|
|
(let ((point (python-info-dedenter-opening-block-position)))
|
2012-05-17 00:03:42 -03:00
|
|
|
|
(when point
|
|
|
|
|
(message "Closes %s" (save-excursion
|
|
|
|
|
(goto-char point)
|
|
|
|
|
(buffer-substring
|
2017-12-14 11:18:51 +02:00
|
|
|
|
(point) (line-end-position)))))))
|
2012-05-17 00:03:42 -03:00
|
|
|
|
|
2014-07-09 00:55:53 -03:00
|
|
|
|
(defun python-info-dedenter-statement-p ()
|
|
|
|
|
"Return point if current statement is a dedenter.
|
|
|
|
|
Sets `match-data' to the keyword that starts the dedenter
|
|
|
|
|
statement."
|
|
|
|
|
(save-excursion
|
|
|
|
|
(python-nav-beginning-of-statement)
|
|
|
|
|
(when (and (not (python-syntax-context-type))
|
|
|
|
|
(looking-at (python-rx dedenter)))
|
|
|
|
|
(point))))
|
|
|
|
|
|
2012-05-17 00:03:34 -03:00
|
|
|
|
(defun python-info-line-ends-backslash-p (&optional line-number)
|
2012-05-17 00:03:35 -03:00
|
|
|
|
"Return non-nil if current line ends with backslash.
|
2012-05-17 00:03:34 -03:00
|
|
|
|
With optional argument LINE-NUMBER, check that line instead."
|
2012-05-17 00:03:35 -03:00
|
|
|
|
(save-excursion
|
|
|
|
|
(when line-number
|
2013-02-19 00:18:32 -03:00
|
|
|
|
(python-util-goto-line line-number))
|
2012-05-17 00:03:36 -03:00
|
|
|
|
(while (and (not (eobp))
|
|
|
|
|
(goto-char (line-end-position))
|
2012-08-07 23:30:08 -03:00
|
|
|
|
(python-syntax-context 'paren)
|
2012-05-17 00:03:36 -03:00
|
|
|
|
(not (equal (char-before (point)) ?\\)))
|
|
|
|
|
(forward-line 1))
|
|
|
|
|
(when (equal (char-before) ?\\)
|
2017-12-14 11:18:51 +02:00
|
|
|
|
(point-marker))))
|
2012-05-17 00:03:36 -03:00
|
|
|
|
|
2012-06-17 01:53:31 -07:00
|
|
|
|
(defun python-info-beginning-of-backslash (&optional line-number)
|
2017-12-17 17:09:55 +01:00
|
|
|
|
"Return the point where the backslashed line starts.
|
2012-05-17 00:03:44 -03:00
|
|
|
|
Optional argument LINE-NUMBER forces the line number to check against."
|
2012-05-17 00:03:36 -03:00
|
|
|
|
(save-excursion
|
|
|
|
|
(when line-number
|
2013-02-19 00:18:32 -03:00
|
|
|
|
(python-util-goto-line line-number))
|
2012-05-17 00:03:36 -03:00
|
|
|
|
(when (python-info-line-ends-backslash-p)
|
|
|
|
|
(while (save-excursion
|
|
|
|
|
(goto-char (line-beginning-position))
|
2012-08-07 23:30:08 -03:00
|
|
|
|
(python-syntax-context 'paren))
|
2012-05-17 00:03:36 -03:00
|
|
|
|
(forward-line -1))
|
|
|
|
|
(back-to-indentation)
|
2017-12-14 11:18:51 +02:00
|
|
|
|
(point-marker))))
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
|
|
|
|
(defun python-info-continuation-line-p ()
|
2012-05-17 00:03:34 -03:00
|
|
|
|
"Check if current line is continuation of another.
|
|
|
|
|
When current line is continuation of another return the point
|
|
|
|
|
where the continued line ends."
|
|
|
|
|
(save-excursion
|
|
|
|
|
(let* ((context-type (progn
|
|
|
|
|
(back-to-indentation)
|
2012-08-07 23:30:08 -03:00
|
|
|
|
(python-syntax-context-type)))
|
2012-05-17 00:03:34 -03:00
|
|
|
|
(line-start (line-number-at-pos))
|
|
|
|
|
(context-start (when context-type
|
2012-08-07 23:30:08 -03:00
|
|
|
|
(python-syntax-context context-type))))
|
2012-05-17 00:03:34 -03:00
|
|
|
|
(cond ((equal context-type 'paren)
|
|
|
|
|
;; Lines inside a paren are always a continuation line
|
|
|
|
|
;; (except the first one).
|
2012-07-18 21:55:55 -03:00
|
|
|
|
(python-util-forward-comment -1)
|
|
|
|
|
(point-marker))
|
|
|
|
|
((member context-type '(string comment))
|
2012-05-17 00:03:34 -03:00
|
|
|
|
;; move forward an roll again
|
|
|
|
|
(goto-char context-start)
|
|
|
|
|
(python-util-forward-comment)
|
|
|
|
|
(python-info-continuation-line-p))
|
|
|
|
|
(t
|
2012-07-18 21:55:55 -03:00
|
|
|
|
;; Not within a paren, string or comment, the only way
|
|
|
|
|
;; we are dealing with a continuation line is that
|
|
|
|
|
;; previous line contains a backslash, and this can
|
|
|
|
|
;; only be the previous line from current
|
2012-05-17 00:03:34 -03:00
|
|
|
|
(back-to-indentation)
|
|
|
|
|
(python-util-forward-comment -1)
|
|
|
|
|
(when (and (equal (1- line-start) (line-number-at-pos))
|
|
|
|
|
(python-info-line-ends-backslash-p))
|
2017-12-14 11:18:51 +02:00
|
|
|
|
(point-marker)))))))
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
|
|
|
|
(defun python-info-block-continuation-line-p ()
|
|
|
|
|
"Return non-nil if current line is a continuation of a block."
|
|
|
|
|
(save-excursion
|
2012-05-17 00:03:34 -03:00
|
|
|
|
(when (python-info-continuation-line-p)
|
|
|
|
|
(forward-line -1)
|
|
|
|
|
(back-to-indentation)
|
|
|
|
|
(when (looking-at (python-rx block-start))
|
|
|
|
|
(point-marker)))))
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
2015-04-05 23:58:13 -03:00
|
|
|
|
(defun python-info-assignment-statement-p (&optional current-line-only)
|
|
|
|
|
"Check if current line is an assignment.
|
|
|
|
|
With argument CURRENT-LINE-ONLY is non-nil, don't follow any
|
|
|
|
|
continuations, just check the if current line is an assignment."
|
|
|
|
|
(save-excursion
|
|
|
|
|
(let ((found nil))
|
|
|
|
|
(if current-line-only
|
|
|
|
|
(back-to-indentation)
|
|
|
|
|
(python-nav-beginning-of-statement))
|
|
|
|
|
(while (and
|
|
|
|
|
(re-search-forward (python-rx not-simple-operator
|
|
|
|
|
assignment-operator
|
|
|
|
|
(group not-simple-operator))
|
|
|
|
|
(line-end-position) t)
|
|
|
|
|
(not found))
|
|
|
|
|
(save-excursion
|
|
|
|
|
;; The assignment operator should not be inside a string.
|
|
|
|
|
(backward-char (length (match-string-no-properties 1)))
|
|
|
|
|
(setq found (not (python-syntax-context-type)))))
|
|
|
|
|
(when found
|
|
|
|
|
(skip-syntax-forward " ")
|
|
|
|
|
(point-marker)))))
|
|
|
|
|
|
|
|
|
|
;; TODO: rename to clarify this is only for the first continuation
|
|
|
|
|
;; line or remove it and move its body to `python-indent-context'.
|
2012-05-17 00:02:52 -03:00
|
|
|
|
(defun python-info-assignment-continuation-line-p ()
|
2015-04-05 23:58:13 -03:00
|
|
|
|
"Check if current line is the first continuation of an assignment.
|
2012-05-17 00:03:34 -03:00
|
|
|
|
When current line is continuation of another with an assignment
|
|
|
|
|
return the point of the first non-blank character after the
|
|
|
|
|
operator."
|
2012-05-17 00:02:52 -03:00
|
|
|
|
(save-excursion
|
2012-05-17 00:03:34 -03:00
|
|
|
|
(when (python-info-continuation-line-p)
|
|
|
|
|
(forward-line -1)
|
2015-04-05 23:58:13 -03:00
|
|
|
|
(python-info-assignment-statement-p t))))
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
2012-05-17 00:03:44 -03:00
|
|
|
|
(defun python-info-looking-at-beginning-of-defun (&optional syntax-ppss)
|
2012-05-17 00:03:44 -03:00
|
|
|
|
"Check if point is at `beginning-of-defun' using SYNTAX-PPSS."
|
2012-08-07 23:30:08 -03:00
|
|
|
|
(and (not (python-syntax-context-type (or syntax-ppss (syntax-ppss))))
|
2012-05-17 00:03:44 -03:00
|
|
|
|
(save-excursion
|
|
|
|
|
(beginning-of-line 1)
|
|
|
|
|
(looking-at python-nav-beginning-of-defun-regexp))))
|
|
|
|
|
|
2012-07-16 10:13:01 -03:00
|
|
|
|
(defun python-info-current-line-comment-p ()
|
lisp/progmodes/python.el: Fix docstring typos.
(defconst, python-syntax-count-quotes)
(python-indent-region, python-indent-shift-right)
(python-indent-dedent-line-backspace, python-nav-backward-sexp)
(python-nav-backward-sexp-safe, python-nav-backward-up-list)
(python-shell-prompt-block-regexp, python-shell-prompt-output-regexp)
(python-shell-prompt-pdb-regexp, python-shell-enable-font-lock)
(inferior-python-mode, python-shell-make-comint, run-python-internal)
(python-shell-buffer-substring, python-shell-send-buffer)
(python-pdbtrack-activate, python-pdbtrack-stacktrace-info-regexp)
(python-completion-complete-at-point, python-fill-docstring-style)
(python-eldoc-function, python-imenu-format-item-label)
(python-imenu-format-parent-item-label)
(python-imenu-format-parent-item-jump-label)
(python-imenu--build-tree, python-imenu-create-index)
(python-imenu-create-flat-index): Fix docstring typos.
(python-indent-context, python-shell-prompt-regexp, run-python):
Remove superfluous backslashes.
(python-indent-line, python-nav-beginning-of-defun)
(python-shell-get-buffer, python-shell-get-process)
(python-info-current-defun, python-info-current-line-comment-p)
(python-info-current-line-empty-p, python-util-popn): Doc fixes.
(python-indent-post-self-insert-function, python-shell-send-file)
(python-shell-completion-get-completions)
(python-shell-completion-complete-or-indent)
(python-eldoc--get-doc-at-point): Reflow docstrings.
2014-03-15 18:37:58 +01:00
|
|
|
|
"Return non-nil if current line is a comment line."
|
2013-02-19 00:18:32 -03:00
|
|
|
|
(char-equal
|
|
|
|
|
(or (char-after (+ (line-beginning-position) (current-indentation))) ?_)
|
|
|
|
|
?#))
|
2012-07-16 10:13:01 -03:00
|
|
|
|
|
|
|
|
|
(defun python-info-current-line-empty-p ()
|
lisp/progmodes/python.el: Fix docstring typos.
(defconst, python-syntax-count-quotes)
(python-indent-region, python-indent-shift-right)
(python-indent-dedent-line-backspace, python-nav-backward-sexp)
(python-nav-backward-sexp-safe, python-nav-backward-up-list)
(python-shell-prompt-block-regexp, python-shell-prompt-output-regexp)
(python-shell-prompt-pdb-regexp, python-shell-enable-font-lock)
(inferior-python-mode, python-shell-make-comint, run-python-internal)
(python-shell-buffer-substring, python-shell-send-buffer)
(python-pdbtrack-activate, python-pdbtrack-stacktrace-info-regexp)
(python-completion-complete-at-point, python-fill-docstring-style)
(python-eldoc-function, python-imenu-format-item-label)
(python-imenu-format-parent-item-label)
(python-imenu-format-parent-item-jump-label)
(python-imenu--build-tree, python-imenu-create-index)
(python-imenu-create-flat-index): Fix docstring typos.
(python-indent-context, python-shell-prompt-regexp, run-python):
Remove superfluous backslashes.
(python-indent-line, python-nav-beginning-of-defun)
(python-shell-get-buffer, python-shell-get-process)
(python-info-current-defun, python-info-current-line-comment-p)
(python-info-current-line-empty-p, python-util-popn): Doc fixes.
(python-indent-post-self-insert-function, python-shell-send-file)
(python-shell-completion-get-completions)
(python-shell-completion-complete-or-indent)
(python-eldoc--get-doc-at-point): Reflow docstrings.
2014-03-15 18:37:58 +01:00
|
|
|
|
"Return non-nil if current line is empty, ignoring whitespace."
|
2012-07-16 10:13:01 -03:00
|
|
|
|
(save-excursion
|
|
|
|
|
(beginning-of-line 1)
|
|
|
|
|
(looking-at
|
|
|
|
|
(python-rx line-start (* whitespace)
|
|
|
|
|
(group (* not-newline))
|
|
|
|
|
(* whitespace) line-end))
|
|
|
|
|
(string-equal "" (match-string-no-properties 1))))
|
|
|
|
|
|
2015-04-05 23:58:13 -03:00
|
|
|
|
(defun python-info-docstring-p (&optional syntax-ppss)
|
|
|
|
|
"Return non-nil if point is in a docstring.
|
|
|
|
|
When optional argument SYNTAX-PPSS is given, use that instead of
|
|
|
|
|
point's current `syntax-ppss'."
|
|
|
|
|
;;; https://www.python.org/dev/peps/pep-0257/#what-is-a-docstring
|
|
|
|
|
(save-excursion
|
|
|
|
|
(when (and syntax-ppss (python-syntax-context 'string syntax-ppss))
|
|
|
|
|
(goto-char (nth 8 syntax-ppss)))
|
|
|
|
|
(python-nav-beginning-of-statement)
|
|
|
|
|
(let ((counter 1)
|
|
|
|
|
(indentation (current-indentation))
|
|
|
|
|
(backward-sexp-point)
|
|
|
|
|
(re (concat "[uU]?[rR]?"
|
|
|
|
|
(python-rx string-delimiter))))
|
|
|
|
|
(when (and
|
|
|
|
|
(not (python-info-assignment-statement-p))
|
|
|
|
|
(looking-at-p re)
|
|
|
|
|
;; Allow up to two consecutive docstrings only.
|
|
|
|
|
(>=
|
|
|
|
|
2
|
2016-11-08 15:26:43 -08:00
|
|
|
|
(let (last-backward-sexp-point)
|
2015-04-05 23:58:13 -03:00
|
|
|
|
(while (save-excursion
|
|
|
|
|
(python-nav-backward-sexp)
|
|
|
|
|
(setq backward-sexp-point (point))
|
|
|
|
|
(and (= indentation (current-indentation))
|
2016-11-08 15:26:43 -08:00
|
|
|
|
;; Make sure we're always moving point.
|
|
|
|
|
;; If we get stuck in the same position
|
|
|
|
|
;; on consecutive loop iterations,
|
|
|
|
|
;; bail out.
|
|
|
|
|
(prog1 (not (eql last-backward-sexp-point
|
|
|
|
|
backward-sexp-point))
|
|
|
|
|
(setq last-backward-sexp-point
|
|
|
|
|
backward-sexp-point))
|
2015-04-05 23:58:13 -03:00
|
|
|
|
(looking-at-p
|
|
|
|
|
(concat "[uU]?[rR]?"
|
|
|
|
|
(python-rx string-delimiter)))))
|
|
|
|
|
;; Previous sexp was a string, restore point.
|
|
|
|
|
(goto-char backward-sexp-point)
|
|
|
|
|
(cl-incf counter))
|
|
|
|
|
counter)))
|
|
|
|
|
(python-util-forward-comment -1)
|
|
|
|
|
(python-nav-beginning-of-statement)
|
|
|
|
|
(cond ((bobp))
|
|
|
|
|
((python-info-assignment-statement-p) t)
|
|
|
|
|
((python-info-looking-at-beginning-of-defun))
|
|
|
|
|
(t nil))))))
|
|
|
|
|
|
2014-12-27 01:30:21 -03:00
|
|
|
|
(defun python-info-encoding-from-cookie ()
|
|
|
|
|
"Detect current buffer's encoding from its coding cookie.
|
2014-12-28 15:06:16 -08:00
|
|
|
|
Returns the encoding as a symbol."
|
2014-12-27 01:30:21 -03:00
|
|
|
|
(let ((first-two-lines
|
|
|
|
|
(save-excursion
|
|
|
|
|
(save-restriction
|
|
|
|
|
(widen)
|
|
|
|
|
(goto-char (point-min))
|
|
|
|
|
(forward-line 2)
|
|
|
|
|
(buffer-substring-no-properties
|
|
|
|
|
(point)
|
|
|
|
|
(point-min))))))
|
|
|
|
|
(when (string-match (python-rx coding-cookie) first-two-lines)
|
|
|
|
|
(intern (match-string-no-properties 1 first-two-lines)))))
|
|
|
|
|
|
|
|
|
|
(defun python-info-encoding ()
|
|
|
|
|
"Return encoding for file.
|
|
|
|
|
Try `python-info-encoding-from-cookie', if none is found then
|
|
|
|
|
default to utf-8."
|
2014-12-28 15:06:16 -08:00
|
|
|
|
;; If no encoding is defined, then it's safe to use UTF-8: Python 2
|
2014-12-27 01:30:21 -03:00
|
|
|
|
;; uses ASCII as default while Python 3 uses UTF-8. This means that
|
2014-12-28 15:06:16 -08:00
|
|
|
|
;; in the worst case scenario python.el will make things work for
|
2014-12-27 01:30:21 -03:00
|
|
|
|
;; Python 2 files with unicode data and no encoding defined.
|
|
|
|
|
(or (python-info-encoding-from-cookie)
|
|
|
|
|
'utf-8))
|
|
|
|
|
|
2012-05-17 00:03:14 -03:00
|
|
|
|
|
|
|
|
|
;;; Utility functions
|
|
|
|
|
|
2013-02-19 00:18:32 -03:00
|
|
|
|
(defun python-util-goto-line (line-number)
|
|
|
|
|
"Move point to LINE-NUMBER."
|
|
|
|
|
(goto-char (point-min))
|
|
|
|
|
(forward-line (1- line-number)))
|
2012-05-17 00:03:14 -03:00
|
|
|
|
|
2012-05-17 00:03:24 -03:00
|
|
|
|
;; Stolen from org-mode
|
2012-05-17 00:03:24 -03:00
|
|
|
|
(defun python-util-clone-local-variables (from-buffer &optional regexp)
|
2012-05-17 00:03:24 -03:00
|
|
|
|
"Clone local variables from FROM-BUFFER.
|
|
|
|
|
Optional argument REGEXP selects variables to clone and defaults
|
|
|
|
|
to \"^python-\"."
|
|
|
|
|
(mapc
|
|
|
|
|
(lambda (pair)
|
|
|
|
|
(and (symbolp (car pair))
|
|
|
|
|
(string-match (or regexp "^python-")
|
|
|
|
|
(symbol-name (car pair)))
|
2012-05-17 00:03:35 -03:00
|
|
|
|
(set (make-local-variable (car pair))
|
|
|
|
|
(cdr pair))))
|
2012-05-17 00:03:24 -03:00
|
|
|
|
(buffer-local-variables from-buffer)))
|
|
|
|
|
|
2014-09-11 12:44:25 -07:00
|
|
|
|
(defvar comint-last-prompt-overlay) ; Shut up, byte compiler.
|
2014-07-26 20:43:51 -03:00
|
|
|
|
|
|
|
|
|
(defun python-util-comint-last-prompt ()
|
|
|
|
|
"Return comint last prompt overlay start and end.
|
|
|
|
|
This is for compatibility with Emacs < 24.4."
|
|
|
|
|
(cond ((bound-and-true-p comint-last-prompt-overlay)
|
|
|
|
|
(cons (overlay-start comint-last-prompt-overlay)
|
|
|
|
|
(overlay-end comint-last-prompt-overlay)))
|
|
|
|
|
((bound-and-true-p comint-last-prompt)
|
|
|
|
|
comint-last-prompt)
|
|
|
|
|
(t nil)))
|
|
|
|
|
|
2012-05-17 00:03:34 -03:00
|
|
|
|
(defun python-util-forward-comment (&optional direction)
|
2012-05-17 00:03:44 -03:00
|
|
|
|
"Python mode specific version of `forward-comment'.
|
|
|
|
|
Optional argument DIRECTION defines the direction to move to."
|
2012-08-07 23:30:08 -03:00
|
|
|
|
(let ((comment-start (python-syntax-context 'comment))
|
2012-05-17 00:03:34 -03:00
|
|
|
|
(factor (if (< (or direction 0) 0)
|
|
|
|
|
-99999
|
|
|
|
|
99999)))
|
|
|
|
|
(when comment-start
|
|
|
|
|
(goto-char comment-start))
|
|
|
|
|
(forward-comment factor)))
|
|
|
|
|
|
2014-07-27 03:39:17 -03:00
|
|
|
|
(defun python-util-list-directories (directory &optional predicate max-depth)
|
|
|
|
|
"List DIRECTORY subdirs, filtered by PREDICATE and limited by MAX-DEPTH.
|
|
|
|
|
Argument PREDICATE defaults to `identity' and must be a function
|
|
|
|
|
that takes one argument (a full path) and returns non-nil for
|
|
|
|
|
allowed files. When optional argument MAX-DEPTH is non-nil, stop
|
|
|
|
|
searching when depth is reached, else don't limit."
|
|
|
|
|
(let* ((dir (expand-file-name directory))
|
|
|
|
|
(dir-length (length dir))
|
|
|
|
|
(predicate (or predicate #'identity))
|
|
|
|
|
(to-scan (list dir))
|
|
|
|
|
(tally nil))
|
|
|
|
|
(while to-scan
|
|
|
|
|
(let ((current-dir (car to-scan)))
|
|
|
|
|
(when (funcall predicate current-dir)
|
|
|
|
|
(setq tally (cons current-dir tally)))
|
|
|
|
|
(setq to-scan (append (cdr to-scan)
|
|
|
|
|
(python-util-list-files
|
|
|
|
|
current-dir #'file-directory-p)
|
|
|
|
|
nil))
|
|
|
|
|
(when (and max-depth
|
|
|
|
|
(<= max-depth
|
|
|
|
|
(length (split-string
|
|
|
|
|
(substring current-dir dir-length)
|
|
|
|
|
"/\\|\\\\" t))))
|
|
|
|
|
(setq to-scan nil))))
|
|
|
|
|
(nreverse tally)))
|
|
|
|
|
|
|
|
|
|
(defun python-util-list-files (dir &optional predicate)
|
|
|
|
|
"List files in DIR, filtering with PREDICATE.
|
|
|
|
|
Argument PREDICATE defaults to `identity' and must be a function
|
|
|
|
|
that takes one argument (a full path) and returns non-nil for
|
|
|
|
|
allowed files."
|
|
|
|
|
(let ((dir-name (file-name-as-directory dir)))
|
|
|
|
|
(apply #'nconc
|
|
|
|
|
(mapcar (lambda (file-name)
|
|
|
|
|
(let ((full-file-name (expand-file-name file-name dir-name)))
|
|
|
|
|
(when (and
|
|
|
|
|
(not (member file-name '("." "..")))
|
|
|
|
|
(funcall (or predicate #'identity) full-file-name))
|
|
|
|
|
(list full-file-name))))
|
|
|
|
|
(directory-files dir-name)))))
|
|
|
|
|
|
|
|
|
|
(defun python-util-list-packages (dir &optional max-depth)
|
|
|
|
|
"List packages in DIR, limited by MAX-DEPTH.
|
|
|
|
|
When optional argument MAX-DEPTH is non-nil, stop searching when
|
|
|
|
|
depth is reached, else don't limit."
|
|
|
|
|
(let* ((dir (expand-file-name dir))
|
|
|
|
|
(parent-dir (file-name-directory
|
|
|
|
|
(directory-file-name
|
|
|
|
|
(file-name-directory
|
|
|
|
|
(file-name-as-directory dir)))))
|
|
|
|
|
(subpath-length (length parent-dir)))
|
|
|
|
|
(mapcar
|
|
|
|
|
(lambda (file-name)
|
|
|
|
|
(replace-regexp-in-string
|
|
|
|
|
(rx (or ?\\ ?/)) "." (substring file-name subpath-length)))
|
|
|
|
|
(python-util-list-directories
|
|
|
|
|
(directory-file-name dir)
|
|
|
|
|
(lambda (dir)
|
|
|
|
|
(file-exists-p (expand-file-name "__init__.py" dir)))
|
|
|
|
|
max-depth))))
|
|
|
|
|
|
2013-04-18 23:31:09 -03:00
|
|
|
|
(defun python-util-popn (lst n)
|
|
|
|
|
"Return LST first N elements.
|
lisp/progmodes/python.el: Fix docstring typos.
(defconst, python-syntax-count-quotes)
(python-indent-region, python-indent-shift-right)
(python-indent-dedent-line-backspace, python-nav-backward-sexp)
(python-nav-backward-sexp-safe, python-nav-backward-up-list)
(python-shell-prompt-block-regexp, python-shell-prompt-output-regexp)
(python-shell-prompt-pdb-regexp, python-shell-enable-font-lock)
(inferior-python-mode, python-shell-make-comint, run-python-internal)
(python-shell-buffer-substring, python-shell-send-buffer)
(python-pdbtrack-activate, python-pdbtrack-stacktrace-info-regexp)
(python-completion-complete-at-point, python-fill-docstring-style)
(python-eldoc-function, python-imenu-format-item-label)
(python-imenu-format-parent-item-label)
(python-imenu-format-parent-item-jump-label)
(python-imenu--build-tree, python-imenu-create-index)
(python-imenu-create-flat-index): Fix docstring typos.
(python-indent-context, python-shell-prompt-regexp, run-python):
Remove superfluous backslashes.
(python-indent-line, python-nav-beginning-of-defun)
(python-shell-get-buffer, python-shell-get-process)
(python-info-current-defun, python-info-current-line-comment-p)
(python-info-current-line-empty-p, python-util-popn): Doc fixes.
(python-indent-post-self-insert-function, python-shell-send-file)
(python-shell-completion-get-completions)
(python-shell-completion-complete-or-indent)
(python-eldoc--get-doc-at-point): Reflow docstrings.
2014-03-15 18:37:58 +01:00
|
|
|
|
N should be an integer, when negative its opposite is used.
|
|
|
|
|
When N is bigger than the length of LST, the list is
|
|
|
|
|
returned as is."
|
2013-04-18 23:31:09 -03:00
|
|
|
|
(let* ((n (min (abs n)))
|
|
|
|
|
(len (length lst))
|
|
|
|
|
(acc))
|
|
|
|
|
(if (> n len)
|
|
|
|
|
lst
|
|
|
|
|
(while (< 0 n)
|
|
|
|
|
(setq acc (cons (car lst) acc)
|
|
|
|
|
lst (cdr lst)
|
|
|
|
|
n (1- n)))
|
|
|
|
|
(reverse acc))))
|
|
|
|
|
|
2014-06-21 11:14:54 -03:00
|
|
|
|
(defun python-util-strip-string (string)
|
|
|
|
|
"Strip STRING whitespace and newlines from end and beginning."
|
|
|
|
|
(replace-regexp-in-string
|
|
|
|
|
(rx (or (: string-start (* (any whitespace ?\r ?\n)))
|
|
|
|
|
(: (* (any whitespace ?\r ?\n)) string-end)))
|
|
|
|
|
""
|
|
|
|
|
string))
|
|
|
|
|
|
2014-07-19 10:13:07 -03:00
|
|
|
|
(defun python-util-valid-regexp-p (regexp)
|
|
|
|
|
"Return non-nil if REGEXP is valid."
|
|
|
|
|
(ignore-errors (string-match regexp "") t))
|
|
|
|
|
|
2017-11-03 12:20:36 +00:00
|
|
|
|
|
|
|
|
|
;;; Flymake integration
|
|
|
|
|
|
|
|
|
|
(defgroup python-flymake nil
|
|
|
|
|
"Integration between Python and Flymake."
|
|
|
|
|
:group 'python
|
|
|
|
|
:link '(custom-group-link :tag "Flymake" flymake)
|
|
|
|
|
:version "26.1")
|
|
|
|
|
|
|
|
|
|
(defcustom python-flymake-command '("pyflakes")
|
|
|
|
|
"The external tool that will be used to perform the syntax check.
|
|
|
|
|
This is a non empty list of strings, the checker tool possibly followed by
|
|
|
|
|
required arguments. Once launched it will receive the Python source to be
|
|
|
|
|
checked as its standard input.
|
|
|
|
|
To use `flake8' you would set this to (\"flake8\" \"-\")."
|
2017-12-12 23:21:24 -08:00
|
|
|
|
:version "26.1"
|
2017-11-03 12:20:36 +00:00
|
|
|
|
:group 'python-flymake
|
|
|
|
|
:type '(repeat string))
|
|
|
|
|
|
|
|
|
|
;; The default regexp accomodates for older pyflakes, which did not
|
|
|
|
|
;; report the column number, and at the same time it's compatible with
|
|
|
|
|
;; flake8 output, although it may be redefined to explicitly match the
|
|
|
|
|
;; TYPE
|
|
|
|
|
(defcustom python-flymake-command-output-pattern
|
|
|
|
|
(list
|
|
|
|
|
"^\\(?:<?stdin>?\\):\\(?1:[0-9]+\\):\\(?:\\(?2:[0-9]+\\):\\)? \\(?3:.*\\)$"
|
|
|
|
|
1 2 nil 3)
|
|
|
|
|
"Specify how to parse the output of `python-flymake-command'.
|
|
|
|
|
The value has the form (REGEXP LINE COLUMN TYPE MESSAGE): if
|
|
|
|
|
REGEXP matches, the LINE'th subexpression gives the line number,
|
|
|
|
|
the COLUMN'th subexpression gives the column number on that line,
|
|
|
|
|
the TYPE'th subexpression gives the type of the message and the
|
|
|
|
|
MESSAGE'th gives the message text itself.
|
|
|
|
|
|
|
|
|
|
If COLUMN or TYPE are nil or that index didn't match, that
|
|
|
|
|
information is not present on the matched line and a default will
|
|
|
|
|
be used."
|
2017-12-12 23:21:24 -08:00
|
|
|
|
:version "26.1"
|
2017-11-03 12:20:36 +00:00
|
|
|
|
:group 'python-flymake
|
|
|
|
|
:type '(list regexp
|
|
|
|
|
(integer :tag "Line's index")
|
|
|
|
|
(choice
|
|
|
|
|
(const :tag "No column" nil)
|
|
|
|
|
(integer :tag "Column's index"))
|
|
|
|
|
(choice
|
|
|
|
|
(const :tag "No type" nil)
|
|
|
|
|
(integer :tag "Type's index"))
|
|
|
|
|
(integer :tag "Message's index")))
|
|
|
|
|
|
|
|
|
|
(defcustom python-flymake-msg-alist
|
|
|
|
|
'(("\\(^redefinition\\|.*unused.*\\|used$\\)" . :warning))
|
|
|
|
|
"Alist used to associate messages to their types.
|
2018-06-05 15:13:02 +01:00
|
|
|
|
Each element should be a cons-cell (REGEXP . TYPE), where TYPE
|
|
|
|
|
should be a diagnostic type symbol like `:error', `:warning' or
|
|
|
|
|
`:note'. For example, when using `flake8' a possible
|
|
|
|
|
configuration could be:
|
2017-11-03 12:20:36 +00:00
|
|
|
|
|
|
|
|
|
((\"\\(^redefinition\\|.*unused.*\\|used$\\)\" . :warning)
|
|
|
|
|
(\"^E999\" . :error)
|
|
|
|
|
(\"^[EW][0-9]+\" . :note))
|
|
|
|
|
|
|
|
|
|
By default messages are considered errors."
|
2017-12-12 23:21:24 -08:00
|
|
|
|
:version "26.1"
|
2017-11-03 12:20:36 +00:00
|
|
|
|
:group 'python-flymake
|
2018-11-05 01:22:15 +01:00
|
|
|
|
:type '(alist :key-type (regexp)
|
2017-11-03 12:20:36 +00:00
|
|
|
|
:value-type (symbol)))
|
|
|
|
|
|
|
|
|
|
(defvar-local python--flymake-proc nil)
|
|
|
|
|
|
|
|
|
|
(defun python--flymake-parse-output (source proc report-fn)
|
|
|
|
|
"Collect diagnostics parsing checker tool's output line by line."
|
|
|
|
|
(let ((rx (nth 0 python-flymake-command-output-pattern))
|
|
|
|
|
(lineidx (nth 1 python-flymake-command-output-pattern))
|
|
|
|
|
(colidx (nth 2 python-flymake-command-output-pattern))
|
|
|
|
|
(typeidx (nth 3 python-flymake-command-output-pattern))
|
|
|
|
|
(msgidx (nth 4 python-flymake-command-output-pattern)))
|
|
|
|
|
(with-current-buffer (process-buffer proc)
|
|
|
|
|
(goto-char (point-min))
|
|
|
|
|
(cl-loop
|
|
|
|
|
while (search-forward-regexp rx nil t)
|
|
|
|
|
for msg = (match-string msgidx)
|
|
|
|
|
for (beg . end) = (flymake-diag-region
|
|
|
|
|
source
|
|
|
|
|
(string-to-number
|
|
|
|
|
(match-string lineidx))
|
|
|
|
|
(and colidx
|
|
|
|
|
(match-string colidx)
|
|
|
|
|
(string-to-number
|
|
|
|
|
(match-string colidx))))
|
|
|
|
|
for type = (or (and typeidx
|
|
|
|
|
(match-string typeidx)
|
|
|
|
|
(assoc-default
|
|
|
|
|
(match-string typeidx)
|
|
|
|
|
python-flymake-msg-alist
|
|
|
|
|
#'string-match))
|
|
|
|
|
(assoc-default msg
|
|
|
|
|
python-flymake-msg-alist
|
|
|
|
|
#'string-match)
|
|
|
|
|
:error)
|
|
|
|
|
collect (flymake-make-diagnostic
|
|
|
|
|
source beg end type msg)
|
|
|
|
|
into diags
|
|
|
|
|
finally (funcall report-fn diags)))))
|
|
|
|
|
|
|
|
|
|
(defun python-flymake (report-fn &rest _args)
|
|
|
|
|
"Flymake backend for Python.
|
|
|
|
|
This backend uses `python-flymake-command' (which see) to launch a process
|
|
|
|
|
that is passed the current buffer's content via stdin.
|
|
|
|
|
REPORT-FN is Flymake's callback function."
|
|
|
|
|
(unless (executable-find (car python-flymake-command))
|
|
|
|
|
(error "Cannot find a suitable checker"))
|
|
|
|
|
|
|
|
|
|
(when (process-live-p python--flymake-proc)
|
|
|
|
|
(kill-process python--flymake-proc))
|
|
|
|
|
|
|
|
|
|
(let ((source (current-buffer)))
|
|
|
|
|
(save-restriction
|
|
|
|
|
(widen)
|
|
|
|
|
(setq python--flymake-proc
|
|
|
|
|
(make-process
|
|
|
|
|
:name "python-flymake"
|
|
|
|
|
:noquery t
|
|
|
|
|
:connection-type 'pipe
|
|
|
|
|
:buffer (generate-new-buffer " *python-flymake*")
|
|
|
|
|
:command python-flymake-command
|
|
|
|
|
:sentinel
|
|
|
|
|
(lambda (proc _event)
|
|
|
|
|
(when (eq 'exit (process-status proc))
|
|
|
|
|
(unwind-protect
|
|
|
|
|
(when (with-current-buffer source
|
|
|
|
|
(eq proc python--flymake-proc))
|
|
|
|
|
(python--flymake-parse-output source proc report-fn))
|
|
|
|
|
(kill-buffer (process-buffer proc)))))))
|
|
|
|
|
(process-send-region python--flymake-proc (point-min) (point-max))
|
|
|
|
|
(process-send-eof python--flymake-proc))))
|
|
|
|
|
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
2013-11-04 14:14:58 -05:00
|
|
|
|
(defun python-electric-pair-string-delimiter ()
|
|
|
|
|
(when (and electric-pair-mode
|
|
|
|
|
(memq last-command-event '(?\" ?\'))
|
|
|
|
|
(let ((count 0))
|
|
|
|
|
(while (eq (char-before (- (point) count)) last-command-event)
|
|
|
|
|
(cl-incf count))
|
2014-04-07 00:23:45 +01:00
|
|
|
|
(= count 3))
|
|
|
|
|
(eq (char-after) last-command-event))
|
|
|
|
|
(save-excursion (insert (make-string 2 last-command-event)))))
|
2013-11-04 14:14:58 -05:00
|
|
|
|
|
2013-10-07 14:51:26 -04:00
|
|
|
|
(defvar electric-indent-inhibit)
|
2018-03-01 21:52:27 -05:00
|
|
|
|
(defvar prettify-symbols-alist)
|
2013-10-07 14:51:26 -04:00
|
|
|
|
|
2012-05-17 00:02:52 -03:00
|
|
|
|
;;;###autoload
|
2012-06-19 09:04:47 -07:00
|
|
|
|
(define-derived-mode python-mode prog-mode "Python"
|
2012-05-17 00:03:09 -03:00
|
|
|
|
"Major mode for editing Python files.
|
|
|
|
|
|
2013-11-05 11:47:47 +02:00
|
|
|
|
\\{python-mode-map}"
|
2012-05-17 00:02:52 -03:00
|
|
|
|
(set (make-local-variable 'tab-width) 8)
|
|
|
|
|
(set (make-local-variable 'indent-tabs-mode) nil)
|
|
|
|
|
|
|
|
|
|
(set (make-local-variable 'comment-start) "# ")
|
|
|
|
|
(set (make-local-variable 'comment-start-skip) "#+\\s-*")
|
|
|
|
|
|
|
|
|
|
(set (make-local-variable 'parse-sexp-lookup-properties) t)
|
|
|
|
|
(set (make-local-variable 'parse-sexp-ignore-comments) t)
|
|
|
|
|
|
2012-07-16 10:13:01 -03:00
|
|
|
|
(set (make-local-variable 'forward-sexp-function)
|
2012-08-09 00:30:37 -03:00
|
|
|
|
'python-nav-forward-sexp)
|
2012-07-16 10:13:01 -03:00
|
|
|
|
|
2012-05-17 00:02:52 -03:00
|
|
|
|
(set (make-local-variable 'font-lock-defaults)
|
2018-07-19 22:06:07 +02:00
|
|
|
|
`(,python-font-lock-keywords
|
2014-12-07 11:24:35 -05:00
|
|
|
|
nil nil nil nil
|
|
|
|
|
(font-lock-syntactic-face-function
|
|
|
|
|
. python-font-lock-syntactic-face-function)))
|
2012-05-17 00:03:46 -03:00
|
|
|
|
|
|
|
|
|
(set (make-local-variable 'syntax-propertize-function)
|
|
|
|
|
python-syntax-propertize-function)
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
2012-05-17 00:03:35 -03:00
|
|
|
|
(set (make-local-variable 'indent-line-function)
|
|
|
|
|
#'python-indent-line-function)
|
2012-05-17 00:02:52 -03:00
|
|
|
|
(set (make-local-variable 'indent-region-function) #'python-indent-region)
|
2013-10-07 14:51:26 -04:00
|
|
|
|
;; Because indentation is not redundant, we cannot safely reindent code.
|
2014-11-16 17:59:42 -03:00
|
|
|
|
(set (make-local-variable 'electric-indent-inhibit) t)
|
|
|
|
|
(set (make-local-variable 'electric-indent-chars)
|
|
|
|
|
(cons ?: electric-indent-chars))
|
2013-11-04 14:14:58 -05:00
|
|
|
|
|
|
|
|
|
;; Add """ ... """ pairing to electric-pair-mode.
|
|
|
|
|
(add-hook 'post-self-insert-hook
|
|
|
|
|
#'python-electric-pair-string-delimiter 'append t)
|
|
|
|
|
|
2012-05-17 00:02:52 -03:00
|
|
|
|
(set (make-local-variable 'paragraph-start) "\\s-*$")
|
2012-05-17 00:03:35 -03:00
|
|
|
|
(set (make-local-variable 'fill-paragraph-function)
|
2013-11-28 21:03:39 -05:00
|
|
|
|
#'python-fill-paragraph)
|
2019-09-08 10:42:19 -04:00
|
|
|
|
(set (make-local-variable 'normal-auto-fill-function) #'python-do-auto-fill)
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
|
|
|
|
(set (make-local-variable 'beginning-of-defun-function)
|
2012-11-12 10:26:50 -03:00
|
|
|
|
#'python-nav-beginning-of-defun)
|
2012-05-17 00:02:52 -03:00
|
|
|
|
(set (make-local-variable 'end-of-defun-function)
|
2012-11-12 10:26:50 -03:00
|
|
|
|
#'python-nav-end-of-defun)
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
|
|
|
|
(add-hook 'completion-at-point-functions
|
2014-07-28 01:32:28 -03:00
|
|
|
|
#'python-completion-at-point nil 'local)
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
2012-05-17 00:03:42 -03:00
|
|
|
|
(add-hook 'post-self-insert-hook
|
2013-11-28 21:03:39 -05:00
|
|
|
|
#'python-indent-post-self-insert-function 'append 'local)
|
2012-05-17 00:03:42 -03:00
|
|
|
|
|
2013-04-18 23:31:09 -03:00
|
|
|
|
(set (make-local-variable 'imenu-create-index-function)
|
|
|
|
|
#'python-imenu-create-index)
|
2012-11-26 18:45:58 -03:00
|
|
|
|
|
2012-05-17 00:02:52 -03:00
|
|
|
|
(set (make-local-variable 'add-log-current-defun-function)
|
|
|
|
|
#'python-info-current-defun)
|
|
|
|
|
|
2012-05-17 00:03:45 -03:00
|
|
|
|
(add-hook 'which-func-functions #'python-info-current-defun nil t)
|
|
|
|
|
|
2012-05-17 00:03:05 -03:00
|
|
|
|
(set (make-local-variable 'skeleton-further-elements)
|
|
|
|
|
'((abbrev-mode nil)
|
|
|
|
|
(< '(backward-delete-char-untabify (min python-indent-offset
|
2012-05-17 00:03:35 -03:00
|
|
|
|
(current-column))))
|
|
|
|
|
(^ '(- (1+ (current-indentation))))))
|
2012-05-17 00:03:05 -03:00
|
|
|
|
|
2016-07-18 02:17:06 +03:00
|
|
|
|
(if (null eldoc-documentation-function)
|
|
|
|
|
;; Emacs<25
|
|
|
|
|
(set (make-local-variable 'eldoc-documentation-function)
|
|
|
|
|
#'python-eldoc-function)
|
|
|
|
|
(add-function :before-until (local 'eldoc-documentation-function)
|
|
|
|
|
#'python-eldoc-function))
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
2015-02-07 16:43:47 -03:00
|
|
|
|
(add-to-list
|
|
|
|
|
'hs-special-modes-alist
|
2018-11-05 01:22:15 +01:00
|
|
|
|
'(python-mode
|
2016-11-01 23:24:33 -04:00
|
|
|
|
"\\s-*\\_<\\(?:def\\|class\\)\\_>"
|
2015-02-07 16:43:47 -03:00
|
|
|
|
;; Use the empty string as end regexp so it doesn't default to
|
|
|
|
|
;; "\\s)". This way parens at end of defun are properly hidden.
|
|
|
|
|
""
|
|
|
|
|
"#"
|
|
|
|
|
python-hideshow-forward-sexp-function
|
|
|
|
|
nil))
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
|
|
|
|
(set (make-local-variable 'outline-regexp)
|
|
|
|
|
(python-rx (* space) block-start))
|
2014-06-21 08:26:43 -03:00
|
|
|
|
(set (make-local-variable 'outline-heading-end-regexp) ":[^\n]*\n")
|
2012-05-17 00:02:52 -03:00
|
|
|
|
(set (make-local-variable 'outline-level)
|
|
|
|
|
#'(lambda ()
|
|
|
|
|
"`outline-level' function for Python mode."
|
|
|
|
|
(1+ (/ (current-indentation) python-indent-offset))))
|
|
|
|
|
|
2018-03-01 21:52:27 -05:00
|
|
|
|
(set (make-local-variable 'prettify-symbols-alist)
|
|
|
|
|
python-prettify-symbols-alist)
|
2015-09-20 15:20:36 -04:00
|
|
|
|
|
2012-05-17 00:03:05 -03:00
|
|
|
|
(python-skeleton-add-menu-items)
|
|
|
|
|
|
2012-08-09 01:08:29 -03:00
|
|
|
|
(make-local-variable 'python-shell-internal-buffer)
|
|
|
|
|
|
2012-05-17 00:02:52 -03:00
|
|
|
|
(when python-indent-guess-indent-offset
|
2017-11-03 12:20:36 +00:00
|
|
|
|
(python-indent-guess-indent-offset))
|
|
|
|
|
|
|
|
|
|
(add-hook 'flymake-diagnostic-functions #'python-flymake nil t))
|
2012-05-17 00:02:52 -03:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(provide 'python)
|
2012-07-18 16:04:06 -03:00
|
|
|
|
|
|
|
|
|
;; Local Variables:
|
|
|
|
|
;; indent-tabs-mode: nil
|
|
|
|
|
;; End:
|
|
|
|
|
|
2012-05-17 00:02:52 -03:00
|
|
|
|
;;; python.el ends here
|