Mercurial > hg > dotemacs
changeset 91:5e4d85c82723
Remove old python-mode stuff
author | Jordi Gutiérrez Hermoso <jordigh@octave.org> |
---|---|
date | Sun, 05 Oct 2014 18:38:21 -0400 |
parents | b1915cf8617c |
children | a2f699e4f1ca |
files | dotemacs.el packages/python-mode.el |
diffstat | 2 files changed, 1 insertions(+), 17314 deletions(-) [+] |
line wrap: on
line diff
--- a/dotemacs.el +++ b/dotemacs.el @@ -3,11 +3,6 @@ (defalias 'perl-mode 'cperl-mode) -(require 'python-mode) - -(require 'ipython) -(setq py-python-command-args '("-nobanner")) - (require 'legalese) (require 'django-mode) @@ -272,7 +267,6 @@ '(legalese-default-author "Jordi GutiƩrrez Hermoso") '(legalese-default-copyright "Jordi GutiƩrrez Hermoso <jordigh@octave.org>") '(make-backup-files nil) - '(py-shell-name "ipython") '(safe-local-variable-values (quote ((eval when (string-match "\\.in\\'" (buffer-file-name)) (html-mode)) (eval when (string-match "\\.h\\'" (buffer-file-name)) (unless (string-match "/gnulib/" (buffer-file-name)) (c++-mode) (c-set-style "gnu"))) (py-indent-offset . 4) (eval when (string-match "\\.h\\'" (buffer-file-name)) (c++-mode) (c-set-style "gnu"))))) '(safe-local-variable-values (quote ((encoding . utf-8) (eval when (and (buffer-file-name) (string-match-p "\\.h\\'" (buffer-file-name)) (not (string-match-p "/gnulib/" (buffer-file-name)))) (c++-mode) (c-set-style "gnu")) (eval when (string-match "\\.in\\'" (buffer-file-name)) (html-mode)) (eval when (string-match "\\.h\\'" (buffer-file-name)) (unless (string-match "/gnulib/" (buffer-file-name)) (c++-mode) (c-set-style "gnu"))) (py-indent-offset . 4) (eval when (string-match "\\.h\\'" (buffer-file-name)) (c++-mode) (c-set-style "gnu"))))) '(savehist-mode t nil (savehist)) @@ -311,3 +305,4 @@ '(rst-level-3-face ((t (:background "grey10"))) t) '(show-ws-tab ((t (:background "Black")))) '(stripes-face ((t (:background "#444"))))) +
deleted file mode 100644 --- a/packages/python-mode.el +++ /dev/null @@ -1,17308 +0,0 @@ -;; python-mode.el --- Towards an Python-IDE in Emacs - -;; Maintainer: Andreas Roehler <andreas.roehler@online.de> -;; Keywords: languages, processes, python, oop - -;; Copyright (C) 1992,1993,1994 Tim Peters - -;; Author: 2003-2011 https://launchpad.net/python-mode -;; 1995-2002 Barry A. Warsaw -;; 1992-1994 Tim Peters -;; Maintainer: python-mode@python.org -;; Created: Feb 1992 -;; Keywords: python languages oop - -;; This program 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. - -;; This program 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. - -;; You should have received a copy of the GNU General Public License -;; along with this program. If not, see <http://www.gnu.org/licenses/>. - -;;; Commentary: - -;; commands-python-mode.org in directory doc reports -;; available commands, also a menu is provided - -;; as for `py-add-abbrev': -;; Similar to `add-mode-abbrev', but uses -;; `py-partial-expression' before point for expansion to -;; store, not `word'. Also provides a proposal for new -;; abbrevs. - -;; Proposal for an abbrev is composed from the downcased -;; initials of expansion - provided they are of char-class -;; [:alpha:] -;; -;; For example code below would be recognised as a -;; `py-expression' composed by three -;; py-partial-expressions. -;; -;; OrderedDict.popitem(last=True) -;; -;; Putting the curser at the EOL, M-3 M-x py-add-abbrev -;; -;; would prompt "op" for an abbrev to store, as first -;; `py-partial-expression' beginns with a "(", which is -;; not taken as proposal. - -;;; Code - -(require 'comint) -(require 'custom) -(eval-when-compile (require 'cl)) -(require 'compile) -(require 'ansi-color) -(require 'cc-cmds) -(require 'shell) -(require 'rx) -(require 'flymake) -(require 'imenu) - -(defgroup python-mode nil - "Support for the Python programming language, <http://www.python.org/>" - :group 'languages - :prefix "py-") - -(defconst py-version "6.0.10") - -(defvar python-local-version nil - "Used internally. ") -(make-variable-buffer-local 'python-local-version) - -(defvar py-local-command nil - "Returns locally used executable-name. ") -(make-variable-buffer-local 'py-local-command) - -(defvar py-local-versioned-command nil - "Returns locally used executable-name including its version. ") -(make-variable-buffer-local 'py-local-versioned-command) - -(defcustom python-mode-modeline-display "Py" - "String to display in Emacs modeline " - - :type 'string - :group 'python-mode) - -;;; User definable variables -(defcustom py-indent-offset 4 - "*Amount of offset per level of indentation. -`\\[py-guess-indent-offset]' can usually guess a good value when -you're editing someone else's Python code." - :type 'integer - :group 'python-mode) -(make-variable-buffer-local 'py-indent-offset) - -(defcustom pdb-path '/usr/lib/python2.7/pdb.py - "Where to find pdb.py. Edit this according to your system. - -If you ignore the location `M-x py-guess-pdb-path' might display it. -" - :type 'variable - :group 'python-mode) - -(defcustom py-verbose-p nil - "If indenting functions should report reached indent level. - -Default is nil. " - - :type 'boolean - :group 'python-mode) - -(defcustom py-prepare-autopair-mode-p t - "If autopair-mode hook should be loaded. Default is `t'. " - :type 'boolean - :group 'python-mode) - -(defcustom py-fontify-shell-buffer-p nil - "If code in Python shell should be highlighted as in script buffer. - -Default is nil. - -If `t', related vars like `comment-start' will be set too. -Seems convenient when playing with stuff in IPython shell -Might not be TRT when a lot of output arrives " - - :type 'boolean - :group 'python-mode) - -(defcustom py-modeline-display-full-path-p nil - "If the full PATH/TO/PYTHON should be displayed in shell modeline. - -Default is nil. Note: when `py-shell-name' is specified with path, it's shown as an acronym in buffer-name already. " - - :type 'boolean - :group 'python-mode) - -(defcustom py-modeline-acronym-display-home-p nil - "If the modeline acronym should contain chars indicating the home-directory. - -Default is nil " - :type 'boolean - :group 'python-mode) - -(defun py-guess-pdb-path () - "If py-pdb-path isn't set, find location of pdb.py. " - (interactive) - (let ((ele (split-string (shell-command-to-string "whereis python"))) - erg) - (while (or (not erg)(string= "" erg)) - (when (and (string-match "^/" (car ele)) (not (string-match "/man" (car ele)))) - (setq erg (shell-command-to-string (concat "find " (car ele) " -type f -name \"pdb.py\"")))) - (setq ele (cdr ele))) - (if erg - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - (when (interactive-p) (message "%s" "pdb.py not found, please customize `pdb-path'"))) - (concat "'" erg))) - -(defcustom py-install-directory "" - "Directory where python-mode.el and it's subdirectories should be installed. Needed for completion and other environment stuff only. " - :type 'string - :group 'python-mode) - -(defcustom py-guess-py-install-directory-p t - "If in cases, `py-install-directory' isn't set, `py-set-load-path'should guess it from `buffer-file-name'. " - - :type 'boolean - :group 'python-mode) - -(defcustom py-report-position-p nil - "If functions moving point like `py-forward-into-nomenclature' should report reached position. - -Default is nil. " - - :type 'boolean - :group 'python-mode) - -(defcustom py-extensions "py-extensions.el" - "File where extensions to python-mode.el should be installed. Used by virtualenv support. " - - :type 'string - :group 'python-mode) - -(defcustom py-hide-show-minor-mode-p nil - "If hide-show minor-mode should be on, default is nil. " - - :type 'boolean - :group 'python-mode) - -(defcustom py-org-cycle-p nil - "When non-nil, command `org-cycle' is available at shift-TAB, <backtab> - -Default is nil. " - - :type 'boolean - :group 'python-mode) - -(defcustom ipython-complete-use-separate-shell-p nil - - "If `ipython-complete' should use a separate shell. Thus prompt-counter is not incremented by completion. " - :type 'boolean :group 'python-mode) - -(defcustom py-outline-minor-mode-p t - "If outline minor-mode should be on, default is `t'. " - - :type 'boolean - :group 'python-mode) - -(defcustom py-outline-mode-keywords - '("class" "def" "elif" "else" "except" - "for" "if" "while" "finally" "try" - "with") - "Keywords composing visible heads. " - :type '(repeat string) - :group 'python-mode) - -(defcustom py-start-run-py-shell t - "If `python-mode' should start a python-shell, `py-shell'. Default is `t'. " - - :type 'boolean - :group 'python-mode) - -(defcustom py-start-run-ipython-shell t - "If `python-mode' should start an ipython-shell. Default is `t'. - -A running ipython-shell presently is needed by `ipython-complete', otherwise first try will fail. " - - :type 'boolean - :group 'python-mode) - -;; vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -(defcustom py-close-provides-newline t - "If a newline is inserted, when line after block isn't empty. Default is non-nil. " - :type 'boolean - :group 'python-mode) -(make-variable-buffer-local 'py-close-provides-newline) - -(defcustom py-dedent-keep-relative-column t - "If point should follow dedent or kind of electric move to end of line. Default is t - keep relative position. " - :type 'boolean - :group 'python-mode) - -(defcustom py-indent-honors-multiline-listing nil - "If `t', indents to 1+ column of opening delimiter. If `nil', indent adds one level to the beginning of statement. Default is `nil'. " - :type 'boolean - :group 'python-mode) - -(defcustom py-indent-honors-inline-comment nil - "If non-nil, indents to column of inlined comment start. -Default is nil. " - :type 'boolean - :group 'python-mode) - -(defcustom py-closing-list-dedents-bos nil - "If non-nil, closing parentesis dedents onto column of statement, otherwise keeps additional `py-indent-offset', default is nil " - :type 'boolean - :group 'python-mode) - -(defcustom py-electric-colon-active-p nil - "`py-electric-colon' feature. Default is `nil'. See lp:837065 for discussions. " - :type 'boolean - :group 'python-mode) - -(defcustom py-electric-comment-p t - "If \"#\" should call `py-electric-comment'. Default is `t'. " - :type 'boolean - :group 'python-mode) - -(defcustom py-electric-comment-add-space-p nil - "If py-electric-comment should add a space. Default is `nil'. " - :type 'boolean - :group 'python-mode) - -(defcustom py-mark-decorators nil - "If py-mark-def-or-class functions should mark decorators too. Default is `nil'. " - :type 'boolean - :group 'python-mode) - -(defcustom py-tab-indent t - "*Non-nil means TAB in Python mode calls `py-indent-line'." - :type 'boolean - :group 'python-mode) - -(defcustom py-complete-function 'nil - "When set, enforces function todo completion, default is nil. - -Normally python-mode, resp. inferior-python-mode know best which functin to use. " - :type '(choice - (const :tag "default" nil) - (const :tag "py-completion-at-point" py-completion-at-point) - (const :tag "Pymacs based py-complete" py-complete) - (const :tag "py-shell-complete" py-shell-complete) - (const :tag "IPython's ipython-complete" ipython-complete) - ) - :group 'python-mode) - -(defcustom ipython-complete-function 'ipython-complete - "Function used for completion in IPython shell buffers. - -Minor bug: `ipython-complete' raises the prompt counter when completion done - -Richard Everson commented: - - I don't know how to stop IPython from incrementing the prompt - counter, but using py-completion-at-point just hangs emacs for - me. If I start with a new IPython shell, then - - In [1]: import sys - - In [2]: sys.pa - - then M-x py-completion-at-point, hoping to complete to sys.path, Emacs - hangs. Escaping out of it shows that the \*Python\* buffer has the - contents: - - >>> Traceback (most recent call last): - File \"<stdin>\", line 1, in <module> - NameError: name 'nil' is not defined - >>> = - [ ... ] - - On the other hand, IPython's interaction and completion itself is pretty - impressive (for versions greater than 0.10 at least): it inserts the - correct indentation for for, if, etc and it will show completions even - within a loop. Here's an example from a terminal shell: - - In [1]: - - In [1]: for i in range(3): - ...: print i, sys.p<------------ Pressed tab here; indentation inser= - ted automatically - sys.path sys.path_importer_cache sys.prefix - sys.path_hooks sys.platform sys.py3kwarning - ...: print i, sys.path<------------ Pressed tab again - sys.path sys.path_hooks sys.path_importer_cache -" - :type '(choice (const :tag "py-completion-at-point" py-completion-at-point) - (const :tag "py-shell-complete" py-shell-complete) - (const :tag "Pymacs based py-complete" py-complete) - (const :tag "IPython's ipython-complete" ipython-complete)) - :group 'python-mode) -(make-variable-buffer-local 'ipython-complete-function) - -(defvar py-local-complete-function nil - "Set by python-mode-hook resp. to environment. - -`py-complete-function', when set, overrides it. ") -(make-variable-buffer-local 'py-local-complete-function) - -(defcustom py-encoding-string " # -*- coding: utf-8 -*-" - "Default string specifying encoding of a Python file. " - :type 'string - :group 'python-mode) - -(defvar py-encoding-string-re "^[ \t]*#[ \t]*-\\*-[ \t]*coding:.+-\\*-" - "Matches encoding string of a Python file. ") - -(defvar symbol-definition-start-re) -(setq symbol-definition-start-re "^[ \t]*(\\(defun\\|defvar\\|defcustom\\)") -(defcustom py-shebang-startstring "#! /bin/env" - "Detecting the shell in head of file. " - :type 'string - :group 'python-mode) - -(defvar py-shebang-regexp "#![ \t]?\\([^ \t\n]+\\)[ \t]?\\([biptj]+ython[^ \t\n]*\\)" - "Detecting the shell in head of file. ") - -(defcustom py-python-command-args '("-i") - "*List of string arguments to be used when starting a Python shell." - :type '(repeat string) - :group 'python-mode) -(make-variable-buffer-local 'py-python-command-args) - -(set-default 'py-python-command-args '("-i")) - -(make-obsolete-variable 'py-jpython-command-args 'py-jython-command-args nil) -(defcustom py-jython-command-args '("-i") - "*List of string arguments to be used when starting a Jython shell." - :type '(repeat string) - :group 'python-mode - :tag "Jython Command Args") - -(defcustom py-cleanup-temporary t - "If temporary buffers and files used by functions executing region should be deleted afterwards. " - :type 'boolean - :group 'python-mode) - -(defcustom py-lhs-inbound-indent 1 - "When line starts a multiline-assignment: How many colums indent should be more than opening bracket, brace or parenthesis. " - :type 'integer - :group 'python-mode) -(make-variable-buffer-local 'py-lhs-inbound-indent) - -(defcustom py-rhs-inbound-indent 1 - "When inside a multiline-assignment: How many colums indent should be more than opening bracket, brace or parenthesis. " - :type 'integer - :group 'python-mode) -(make-variable-buffer-local 'py-rhs-inbound-indent) - -(defcustom py-continuation-offset 2 - "*Additional amount of offset to give for some continuation lines. -Continuation lines are those that immediately follow a backslash -terminated line. " - :type 'integer - :group 'python-mode) - -(defcustom py-indent-tabs-mode nil - "Python-mode starts `indent-tabs-mode' with the value specified here, default is nil. " - :type 'boolean - :group 'python-mode) - -(defcustom py-smart-indentation t - "*Should `python-mode' try to automagically set some indentation variables? -When this variable is non-nil, two things happen when a buffer is set -to `python-mode': - - 1. `py-indent-offset' is guessed from existing code in the buffer. - Only guessed values between 2 and 8 are considered. If a valid - guess can't be made (perhaps because you are visiting a new - file), then the value in `py-indent-offset' is used. - - 2. `indent-tabs-mode' is turned off if `py-indent-offset' does not - equal `tab-width' (`indent-tabs-mode' is never turned on by - Python mode). This means that for newly written code, tabs are - only inserted in indentation if one tab is one indentation - level, otherwise only spaces are used. - -Note that both these settings occur *after* `python-mode-hook' is run, -so if you want to defeat the automagic configuration, you must also -set `py-smart-indentation' to nil in your `python-mode-hook'." - :type 'boolean - :group 'python-mode) -(make-variable-buffer-local 'py-smart-indentation) - -(defcustom py-align-multiline-strings-p t - "*Flag describing how multi-line triple quoted strings are aligned. -When this flag is non-nil, continuation lines are lined up under the -preceding line's indentation. When this flag is nil, continuation -lines are aligned to column zero." - :type '(choice (const :tag "Align under preceding line" t) - (const :tag "Align to column zero" nil)) - :group 'python-mode) - -(defcustom py-block-comment-prefix "##" - "*String used by \\[comment-region] to comment out a block of code. -This should follow the convention for non-indenting comment lines so -that the indentation commands won't get confused (i.e., the string -should be of the form `#x...' where `x' is not a blank or a tab, and -`...' is arbitrary). However, this string should not end in whitespace." - :type 'string - :group 'python-mode) - -(defcustom py-indent-comments t - "When t, comment lines are indented. " - :type 'boolean - :group 'python-mode) - -(defvar py-separator-char 47 - "Values set by defcustom only will not be seen in batch-mode. ") - -(defcustom py-separator-char 47 - "The character, which separates the system file-path components. - -Precedes guessing when not empty, returned by function `py-separator-char'. " - :type 'character - :group 'python-mode) - -(defcustom py-custom-temp-directory "" - "If set, will take precedence over guessed values from `py-temp-directory'. Default is the empty string. - -When set, make sure the directory exists. " - :type 'string - :group 'python-mode) - -(defvar py-temp-directory - (let ((ok '(lambda (x) - (and x - (setq x (expand-file-name x)) ; always true - (file-directory-p x) - (file-writable-p x) - x))) - erg) - (or - (and (not (string= "" py-custom-temp-directory)) - (if (funcall ok py-custom-temp-directory) - (setq erg (expand-file-name py-custom-temp-directory)) - (if (file-directory-p (expand-file-name py-custom-temp-directory)) - (error "py-custom-temp-directory set but not writable") - (error "py-custom-temp-directory not an existing directory")))) - (and (funcall ok (getenv "TMPDIR")) - (setq erg (getenv "TMPDIR"))) - (and (funcall ok (getenv "TEMP/TMP")) - (setq erg (getenv "TEMP/TMP"))) - (and (funcall ok "/usr/tmp") - (setq erg "/usr/tmp")) - (and (funcall ok "/tmp") - (setq erg "/tmp")) - (and (funcall ok "/var/tmp") - (setq erg "/var/tmp")) - (and (eq system-type 'darwin) - (funcall ok "/var/folders") - (setq erg "/var/folders")) - (and (or (eq system-type 'ms-dos)(eq system-type 'windows-nt)) - (funcall ok (concat "c:" (char-to-string py-separator-char) "Users")) - (setq erg (concat "c:" (char-to-string py-separator-char) "Users"))) - ;; (funcall ok ".") - (error - "Couldn't find a usable temp directory -- set `py-temp-directory'")) - (when erg (setq py-temp-directory erg))) - "*Directory used for temporary files created by a *Python* process. -By default, guesses the first directory from this list that exists and that you -can write into: the value (if any) of the environment variable TMPDIR, -/usr/tmp, /tmp, /var/tmp, or the current directory. - -`py-custom-temp-directory' will take precedence when setq ") - -(defcustom py-beep-if-tab-change t - "*Ring the bell if `tab-width' is changed. -If a comment of the form - - \t# vi:set tabsize=<number>: - -is found before the first code line when the file is entered, and the -current value of (the general Emacs variable) `tab-width' does not -equal <number>, `tab-width' is set to <number>, a message saying so is -displayed in the echo area, and if `py-beep-if-tab-change' is non-nil -the Emacs bell is also rung as a warning." - :type 'boolean - :group 'python-mode) - -(defcustom py-jump-on-exception t - "*Jump to innermost exception frame in *Python Output* buffer. -When this variable is non-nil and an exception occurs when running -Python code synchronously in a subprocess, jump immediately to the -source code of the innermost traceback frame." - :type 'boolean - :group 'python-mode) - -(defcustom py-ask-about-save t - "If not nil, ask about which buffers to save before executing some code. -Otherwise, all modified buffers are saved without asking." - :type 'boolean - :group 'python-mode) - -(defcustom py-backspace-function 'backward-delete-char-untabify - "*Function called by `py-electric-backspace' when deleting backwards." - :type 'function - :group 'python-mode) - -(defcustom py-delete-function 'delete-char - "*Function called by `py-electric-delete' when deleting forwards." - :type 'function - :group 'python-mode) - -(defcustom py-pdbtrack-do-tracking-p t - "*Controls whether the pdbtrack feature is enabled or not. -When non-nil, pdbtrack is enabled in all comint-based buffers, -e.g. shell buffers and the *Python* buffer. When using pdb to debug a -Python program, pdbtrack notices the pdb prompt and displays the -source file and line that the program is stopped at, much the same way -as gud-mode does for debugging C programs with gdb." - :type 'boolean - :group 'python-mode) -(make-variable-buffer-local 'py-pdbtrack-do-tracking-p) - -(defcustom py-pdbtrack-filename-mapping nil - "Supports mapping file paths when opening file buffers in pdbtrack. -When non-nil this is an alist mapping paths in the Python interpreter -to paths in Emacs." - :type 'alist - :group 'python-mode) - -(defcustom py-pdbtrack-minor-mode-string " PDB" - "*String to use in the minor mode list when pdbtrack is enabled." - :type 'string - :group 'python-mode) - -(defcustom py-import-check-point-max - 20000 - "Maximum number of characters to search for a Java-ish import statement. -When `python-mode' tries to calculate the shell to use (either a -CPython or a Jython shell), it looks at the so-called `shebang' line --- i.e. #! line. If that's not available, it looks at some of the -file heading imports to see if they look Java-like." - :type 'integer - :group 'python-mode) - -(defcustom py-jython-packages - '("java" "javax") - "Imported packages that imply `jython-mode'." - :type '(repeat string) - :group 'python-mode) -(make-obsolete-variable 'py-jpython-packages 'py-jython-packages nil) - -(defcustom py-current-defun-show t - "If `py-current-defun' should jump to the definition, highlight it while waiting PY-WHICH-FUNC-DELAY seconds, before returning to previous position. - -Default is `t'." - - :type 'boolean - :group 'python-mode) - -(defcustom py-current-defun-delay 2 - "When called interactively, `py-current-defun' should wait PY-WHICH-FUNC-DELAY seconds at the definition name found, before returning to previous position. " - - :type 'number - :group 'python-mode) - -(defcustom py-send-receive-delay 5 - "Seconds to wait for output, used by `python-send-receive'. " - - :type 'number - :group 'python-mode) - -(defvar py-exec-command nil - "Mode commands will set this. ") -(make-variable-buffer-local 'py-exec-command) - -(defvar py-exec-string-command nil - "Mode commands will set this. ") -(make-variable-buffer-local 'py-exec-string-command) - -(defvar py-which-bufname "Python") -(make-variable-buffer-local 'py-which-bufname) - -(defcustom py-master-file nil - "If non-nil, \\[py-execute-buffer] executes the named -master file instead of the buffer's file. If the file name has a -relative path, the value of variable `default-directory' for the -buffer is prepended to come up with a file name. - -Beside you may set this variable in the file's local -variable section, e.g.: - - # Local Variables: - # py-master-file: \"master.py\" - # End: - -" - :type 'string - :group 'python-mode) -(make-variable-buffer-local 'py-master-file) - -(defvar py-pychecker-history nil) -(defcustom py-pychecker-command "pychecker" - "*Shell command used to run Pychecker." - :type 'string - :group 'python-mode - :tag "Pychecker Command") - -(defcustom py-pychecker-command-args '("--stdlib") - "*List of string arguments to be passed to pychecker." - :type '(repeat string) - :group 'python-mode - :tag "Pychecker Command Args") - -(defvar py-pep8-history nil) -(defcustom py-pep8-command "pep8" - "*Shell command used to run pep8." - :type 'string - :group 'python-mode - :tag "PEP 8 Command") - -(defcustom py-pep8-command-args '("") - "*List of string arguments to be passed to pep8. - -Default is \"\" " - :type '(repeat string) - :group 'python-mode - :tag "PEP 8 Command Args") - -(defvar py-pyflakespep8-history nil) -(defcustom py-pyflakespep8-command (concat py-install-directory "pyflakespep8.py") - "*Shell command used to run `pyflakespep8'." - :type 'string - :group 'python-mode - :tag "Pyflakespep8 Command") - -(defcustom py-pyflakespep8-command-args '("") - "*List of string arguments to be passed to pyflakespep8. - -Default is \"\" " - :type '(repeat string) - :group 'python-mode - :tag "Pyflakes-pep8 Command Args") - -(defvar py-pyflakes-history nil) -(defcustom py-pyflakes-command "pyflakes" - "*Shell command used to run Pyflakes." - :type 'string - :group 'python-mode - :tag "Pyflakes Command") - -(defcustom py-pyflakes-command-args '("") - "*List of string arguments to be passed to pyflakes. - -Default is \"\" " - :type '(repeat string) - :group 'python-mode - :tag "Pyflakes Command Args") - -(defcustom py-pep8-command-args '("") - "*List of string arguments to be passed to pylint. - -Default is \"\" " - :type '(repeat string) - :group 'python-mode - :tag "PEP 8 Command Args") - -(defvar py-pylint-history nil) -(defcustom py-pylint-command "pylint" - "*Shell command used to run Pylint." - :type 'string - :group 'python-mode - :tag "Pylint Command") - -(defcustom py-pylint-command-args '("--errors-only") - "*List of string arguments to be passed to pylint. - -Default is \"--errors-only\" " - :type '(repeat string) - :group 'python-mode - :tag "Pylint Command Args") - -(defvar py-shell-alist - '(("jython" . 'jython) - ("python" . 'cpython)) - "*Alist of interpreters and python shells. Used by `py-choose-shell' -to select the appropriate python interpreter mode for a file.") - -(defcustom py-shell-input-prompt-1-regexp "^>>> " - "*A regular expression to match the input prompt of the shell." - :type 'string - :group 'python-mode) - -(defcustom py-shell-input-prompt-2-regexp "^[.][.][.] " - "*A regular expression to match the input prompt of the shell after the - first line of input." - :type 'string - :group 'python-mode) - -(defcustom py-shell-switch-buffers-on-execute-p t - "When non-nil switch to the new Python shell. " - - :type 'boolean - :group 'python-mode) - -(defcustom py-switch-buffers-on-execute-p nil - "When non-nil switch to the Python output buffer. " - - :type 'boolean - :group 'python-mode) - -(defcustom py-split-windows-on-execute-p t - "When non-nil split windows. " - :type 'boolean - :group 'python-mode) - -(defcustom py-split-windows-on-execute-function 'split-window-vertically - "How window should get splitted to display results of py-execute-... functions. " - :type '(choice (const :tag "split-window-vertically" split-window-vertically) - (const :tag "split-window-horizontally" split-window-horizontally) - ) - :group 'python-mode) -(make-variable-buffer-local 'py-split-windows-on-execute-function) - -(defcustom py-hide-show-keywords - '("class" "def" "elif" "else" "except" - "for" "if" "while" "finally" "try" - "with") - "Keywords composing visible heads. -Also used by (minor-)outline-mode " - :type '(repeat string) - :group 'python-mode) - -(defcustom py-hide-show-hide-docstrings t - "*Controls if doc strings can be hidden by hide-show" - :type 'boolean - :group 'python-mode) - -(defcustom python-mode-hook nil - "Hook run when entering Python mode." - :group 'python-mode - :type 'hook) - -(custom-add-option 'python-mode-hook 'imenu-add-menubar-index) -(custom-add-option 'python-mode-hook - (lambda () - "Turn off Indent Tabs mode." - (setq indent-tabs-mode nil))) -(custom-add-option 'python-mode-hook 'turn-on-eldoc-mode) -(custom-add-option 'python-mode-hook 'abbrev-mode) -(custom-add-option 'python-mode-hook 'python-setup-brm) - -(defcustom py-imenu-create-index-p nil - "Non-nil means Python mode creates and displays an index menu of functions and global variables. " - :type 'boolean - :group 'python-mode) - -(defcustom py-shell-name "python" - "A PATH/TO/EXECUTABLE or default value `py-shell' may look for, if no shell is specified by command. " - :type 'string - :group 'python-mode) -(make-variable-buffer-local 'py-shell-name) - -(defcustom py-shell-toggle-1 py-shell-name - "A PATH/TO/EXECUTABLE or default value used by `py-toggle-shell'. " - :type 'string - :group 'python-mode) -(make-variable-buffer-local 'py-shell-toggle-1) - -(defcustom py-shell-toggle-2 "python3" - "A PATH/TO/EXECUTABLE or default value used by `py-toggle-shell'. " - :type 'string - :group 'python-mode) -(make-variable-buffer-local 'py-shell-toggle-2) - -(defcustom py-source-modes '(python-mode jython-mode) - "Used to determine if a buffer contains Python source code. - -If a file is loaded into a buffer that is in one of these major modes, it is considered Python source by `py-load-file', which uses the -value to determine defaults." - :type '(repeat function) - :group 'python-mode) - -(defcustom py-shell-prompt-alist - '(("ipython" . "^In \\[[0-9]+\\]: *") - (t . "^>>> ")) - "Alist of Python input prompts. -Each element has the form (PROGRAM . REGEXP), where PROGRAM is -the value of `py-shell-name' for the python process and -REGEXP is a regular expression matching the Python prompt. -PROGRAM can also be t, which specifies the default when no other -element matches `py-shell-name'." - :type 'string - :group 'python-mode) - -(defcustom py-shell-continuation-prompt-alist - '(("ipython" . "^ [.][.][.]+: *") - (t . "^[.][.][.] ")) - "Alist of Python continued-line prompts. -Each element has the form (PROGRAM . REGEXP), where PROGRAM is -the value of `py-shell-name' for the python process and -REGEXP is a regular expression matching the Python prompt for -continued lines. -PROGRAM can also be t, which specifies the default when no other -element matches `py-shell-name'." - :type 'string - :group 'python-mode) - -;; ipython.el -(defvar ipython-de-input-prompt-regexp "\\(?: -In \\[[0-9]+\\]: *.* -----+> \\(.* -\\)[\n]?\\)\\|\\(?: -In \\[[0-9]+\\]: *\\(.* -\\)\\)\\|^[ ]\\{3\\}[.]\\{3,\\}: *\\(.* -\\)" - "A regular expression to match the IPython input prompt and the python -command after it. The first match group is for a command that is rewritten, -the second for a 'normal' command, and the third for a multiline command.") - -(defvar ipython-de-output-prompt-regexp "^Out\\[[0-9]+\\]: " - "A regular expression to match the output prompt of IPython.") - -(defcustom py-match-paren-mode nil - "*Non-nil means, cursor will jump to beginning or end of a block. -This vice versa, to beginning first. -Sets `py-match-paren-key' in python-mode-map. -Customize `py-match-paren-key' which key to use. " - :type 'boolean - :group 'python-mode) - -(defcustom py-match-paren-key "%" - "*String used by \\[comment-region] to comment out a block of code. -This should follow the convention for non-indenting comment lines so -that the indentation commands won't get confused (i.e., the string -should be of the form `#x...' where `x' is not a blank or a tab, and -`...' is arbitrary). However, this string should not end in whitespace." - :type 'string - :group 'python-mode) - -(defcustom py-kill-empty-line t - "*If t, py-indent-forward-line kills empty lines. " - :type 'boolean - :group 'python-mode) - -(defcustom py-remove-cwd-from-path t - "Whether to allow loading of Python modules from the current directory. -If this is non-nil, Emacs removes '' from sys.path when starting -an inferior Python process. This is the default, for security -reasons, as it is easy for the Python process to be started -without the user's realization (e.g. to perform completion)." - :type 'boolean - :group 'python-mode) - -(defcustom py-imenu-show-method-args-p nil - "*Controls echoing of arguments of functions & methods in the Imenu buffer. -When non-nil, arguments are printed." - :type 'boolean - :group 'python-mode) - -(defcustom python-default-interpreter 'cpython - "*Which Python interpreter is used by default. -The value for this variable can be either `cpython' or `jpython'. - -When the value is `cpython', the variables `python-python-command' and -`python-python-command-args' are consulted to determine the interpreter -and arguments to use. - -When the value is `jpython', the variables `python-jpython-command' and -`python-jpython-command-args' are consulted to determine the interpreter -and arguments to use. - -Note that this variable is consulted only the first time that a Python -mode buffer is visited during an Emacs session. After that, use -\\[py-toggle-shell] to change the interpreter shell." - :type '(choice (const :tag "Python (a.k.a. CPython)" cpython) - (const :tag "JPython" jpython)) - :group 'python-mode) - -(defcustom python-python-command-args '("-i") - "*List of string arguments to be used when starting a Python shell." - :type '(repeat string) - :group 'python-mode) - -(defcustom python-jython-command-args '("-i") - "*List of string arguments to be used when starting a Jython shell." - :type '(repeat string) - :group 'python-mode - :tag "JPython Command Args") - -(defcustom python-pdbtrack-do-tracking-p t - "*Controls whether the pdbtrack feature is enabled or not. - -When non-nil, pdbtrack is enabled in all comint-based buffers, -e.g. shell interaction buffers and the *Python* buffer. - -When using pdb to debug a Python program, pdbtrack notices the -pdb prompt and presents the line in the source file where the -program is stopped in a pop-up buffer. It's similar to what -gud-mode does for debugging C programs with gdb, but without -having to restart the program." - :type 'boolean - :group 'python-mode) -(make-variable-buffer-local 'python-pdbtrack-do-tracking-p) - -(defcustom python-pdbtrack-minor-mode-string " PDB" - "*Minor-mode sign to be displayed when pdbtrack is active." - :type 'string - :group 'python-mode) - -(defcustom python-shell-prompt-alist - '(("ipython" . "^In \\[[0-9]+\\]: *") - (t . "^>>> ")) - "Alist of Python input prompts. -Each element has the form (PROGRAM . REGEXP), where PROGRAM is -the value of `python-python-command' for the python process and -REGEXP is a regular expression matching the Python prompt. -PROGRAM can also be t, which specifies the default when no other -element matches `python-python-command'." - :type 'string - :group 'python-mode) - -(defcustom python-shell-continuation-prompt-alist - '(("ipython" . "^ [.][.][.]+: *") - (t . "^[.][.][.] ")) - "Alist of Python continued-line prompts. -Each element has the form (PROGRAM . REGEXP), where PROGRAM is -the value of `python-python-command' for the python process and -REGEXP is a regular expression matching the Python prompt for -continued lines. -PROGRAM can also be t, which specifies the default when no other -element matches `python-python-command'." - :type 'string - :group 'python-mode) - -(defcustom python-python-command "python" - "Shell command to run Python interpreter. -Any arguments can't contain whitespace." - :group 'python-mode - :type 'string) - -(defcustom python-jython-command "jython" - "Shell command to run Jython interpreter. -Any arguments can't contain whitespace." - :group 'python-mode - :type 'string) - -(defcustom py-history-filter-regexp "\\`\\s-*\\S-?\\S-?\\s-*\\'" - "Input matching this regexp is not saved on the history list. -Default ignores all inputs of 0, 1, or 2 non-blank characters." - :type 'regexp - :group 'python-mode) - -(defcustom python-remove-cwd-from-path t - "Whether to allow loading of Python modules from the current directory. -If this is non-nil, Emacs removes '' from sys.path when starting -an inferior Python process. This is the default, for security -reasons, as it is easy for the Python process to be started -without the user's realization (e.g. to perform completion)." - :type 'boolean - :group 'python-mode - :version "23.3") - -(defcustom python-source-modes '(python-mode jython-mode) - "Used to determine if a buffer contains Python source code. - -If a file is loaded into a buffer that is in one of these major modes, it is considered Python source by `py-load-file', which uses the -value to determine defaults." - :type '(repeat function) - :group 'python-mode) - -(defcustom python-jython-packages '("java" "javax" "org" "com") - "Packages implying `jython-mode'. -If these are imported near the beginning of the buffer, `python-mode' -actually punts to `jython-mode'." - :type '(repeat string) - :group 'python-mode) - -(defface py-number-face - '((t (:inherit default))) - ;; '((t (:inherit 'font-lock-variable-name-face))) - "Highlight numbers. " - :group 'python-mode) -(defvar py-number-face 'py-number-face) - -(defface py-XXX-tag-face - '((t (:inherit font-lock-string-face))) - "XXX\\|TODO\\|FIXME " - :group 'python-mode) -(defvar py-XXX-tag-face 'py-XXX-tag-face) - -;; ;; Face for None, True, False, self, and Ellipsis -(defface py-pseudo-keyword-face - '((t (:inherit font-lock-keyword-face))) - "Face for pseudo keywords in Python mode, like self, True, False, Ellipsis." - :group 'python-mode) -(defvar py-pseudo-keyword-face 'py-pseudo-keyword-face) - -(defface py-variable-name-face - '((t (:inherit default))) - ;; '((t (:inherit 'font-lock-variable-name-face))) - "Face method decorators." - :group 'python-mode) -(defvar py-variable-name-face 'py-variable-name-face) - -;; PEP 318 decorators -(defface py-decorators-face - '((t (:inherit font-lock-keyword-face))) - "Face method decorators." - :group 'python-mode) -(defvar py-decorators-face 'py-decorators-face) - -;; Face for builtins -(defface py-builtins-face - '((t (:inherit font-lock-builtin-face))) - "Face for builtins like TypeError, object, open, and exec." - :group 'python-mode) -(defvar py-builtins-face 'py-builtins-face) - -(defface py-class-name-face - '((t (:inherit font-lock-type-face))) - "Face for classes." - :group 'python-mode) -(defvar py-class-name-face 'py-class-name-face) - -;; XXX, TODO, and FIXME comments and such -(defface py-exception-name-face - '((t (:inherit font-lock-builtin-face))) - "." - :group 'python-mode) -(defvar py-exception-name-face 'py-exception-name-face) - -(defcustom py-use-local-default nil - "If `t', py-shell will use `py-shell-local-path' instead - of default Python. - -Making switch between several virtualenv's easier, - `python-mode' should deliver an installer, so named-shells pointing to virtualenv's will be available. " - :type 'boolean - :group 'python-mode) - -;; (defcustom python-load-extended-executes-p t -;; "If commands from `python-extended-executes.el' should be loaded. -;; -;; Default is `t'. -;; Provides commands executing buffers code at different conditions, thus avoids customization of `py-shell-name', `py-switch-buffers-on-execute-p'. " -;; -;; :type 'boolean -;; :group 'python-mode) - -(defcustom py-shell-local-path "" - "If `py-use-local-default' is non-nil, `py-shell' will use EXECUTABLE indicated here incl. path. " - - :type 'string - :group 'python-mode) - -;;; highlight-indentation.el --- Function for highlighting indentation -;; Original Author: Anton Johansson <anton.johansson@gmail.com> - http://antonj.se -;; Created: Dec 15 23:42:04 2010 -;; URL: https://github.com/antonj/Highlight-Indentation-for-Emacs - -(defcustom highlight-indentation nil - "If level of indentation should be displayed at start. -Toggle buffer local status via `M-x highlight-indentation' during session. " - - :type 'boolean - :group 'python-mode) -(make-variable-buffer-local 'highlight-indentation) - -(defvar highlight-indent-active nil) -(make-variable-buffer-local 'highlight-indent-active) - -(defface highlight-indent-face - '((((class color) (background dark)) - (:background "grey33")) - (((class color) (background light)) - (:background "grey"))) - "Basic face for highlighting indentation guides.") - -(defvar highlight-indent-offset 4) -(setq-default highlight-indent-offset 4) - -(defvar ruby-indent-level nil) -(defvar nxml-child-indent nil) - -(defun highlight-indentation-on () - "Make sure `highlight-indentation' is on. " - (interactive) - (set (make-local-variable 'highlight-indent-active) nil) - (highlight-indentation) - (when (called-interactively-p 'any) - (message "highlight-indentation ON"))) - -(defun highlight-indentation-off () - "Make sure `highlight-indentation' is off. " - (interactive) - (set (make-local-variable 'highlight-indent-active) t) - (highlight-indentation) - (when (called-interactively-p 'any) - (message "highlight-indentation OFF"))) - -(defun highlight-indentation (&optional indent-width) - "Toggle highlight indentation. -Optional argument INDENT-WIDTH specifies which indentation -level (spaces only) should be highlighted, if omitted -indent-width will be guessed from current major-mode" - (interactive "P") - (let ((re (format "\\( \\) \\{%s\\}" (- highlight-indent-offset 1)))) - (if (not highlight-indent-active) - (progn ;; Toggle on - (set (make-local-variable 'highlight-indent-offset) - (if indent-width - indent-width - ;; Set indentation offset according to major mode - (cond ((eq major-mode 'python-mode) - (if (boundp 'python-indent) - python-indent - py-indent-offset)) - ((eq major-mode 'ruby-mode) - ruby-indent-level) - ((eq major-mode 'nxml-mode) - nxml-child-indent) - ((local-variable-p 'c-basic-offset) - c-basic-offset) - (t - (default-value 'highlight-indent-offset))))) - (set (make-local-variable 'highlight-indent-active) t) - (if (featurep 'xemacs) - (font-lock-add-keywords nil `((,re (1 'paren-face-match)))) - (font-lock-add-keywords nil `((,re (1 'highlight-indent-face))))) - (message (format "highlight-indentation with indent-width %s" - highlight-indent-offset))) - ;; Toggle off - (set (make-local-variable 'highlight-indent-active) nil) - (if (featurep 'xemacs) - (font-lock-remove-keywords nil `((,re (1 'paren-face-match)))) - (font-lock-remove-keywords nil `((,re (1 'highlight-indent-face))))) - (message "highlight-indentation OFF")) - (font-lock-fontify-buffer))) - -(defcustom py-underscore-word-syntax-p t - "If underscore chars should be of syntax-class `word', not of `symbol'. - -Underscores in word-class makes `forward-word' etc. travel the indentifiers. Default is `t'. - -See bug report at launchpad, lp:940812 " - :type 'boolean - :group 'python-mode) - -(defcustom py-edit-only-p nil - "When `t' `python-mode' will not take resort nor check for installed Python executables. Default is nil. - -See bug report at launchpad, lp:944093. " - :type 'boolean - :group 'python-mode) - -(defvar py-force-local-shell-p nil - "Used internally, see `toggle-force-local-shell'. ") - -(defcustom py-force-py-shell-name-p nil - "When `t', execution with kind of Python specified in `py-shell-name' is enforced, possibly shebang doesn't take precedence. " - - :type 'boolean - :group 'python-mode) - -(defvar python-mode-v5-behavior nil) -(defcustom python-mode-v5-behavior-p nil - "Execute region through `shell-command-on-region' as -v5 did it - lp:990079. This might fail with certain chars - see UnicodeEncodeError lp:550661" - - :type 'boolean - :group 'python-mode) - -(defcustom py-warn-tmp-files-left-p nil - "Messages a warning, when `py-temp-directory' contains files susceptible being left by previous Python-mode sessions. See also lp:987534 " - :type 'boolean - :group 'python-mode) - -(defcustom py-ipython-execute-delay 0.3 - "Delay needed by execute functions when no IPython shell is running. " - :type 'float - :group 'python-mode) - -;;; Derived Python's flying circus support for Emacs -;; Employed for completion in Python3 shells -;; Copyright (C) 2010, 2011 Free Software Foundation, Inc. - -;; Original author: FabiĆ”n E. Gallina <fabian@anue.biz> -;; URL: https://github.com/fgallina/python.el - -(defcustom python-shell-buffer-name "Python" - "Default buffer name for Python interpreter." - :type 'string - :group 'python-mode - :safe 'stringp) - -(defcustom python-shell-interpreter "python" - "Default Python interpreter for shell." - :type 'string - :group 'python-mode - :safe 'stringp) - -(defcustom python-shell-internal-buffer-name "Python Internal" - "Default buffer name for the Internal Python interpreter." - :type 'string - :group 'python-mode - :safe 'stringp) - -(defcustom python-shell-interpreter-args "-i" - "Default arguments for the Python interpreter." - :type 'string - :group 'python-mode - :safe 'stringp) - -(defcustom python-shell-prompt-regexp ">>> " - "Regular Expression matching top\-level input prompt of python shell. -It should not contain a caret (^) at the beginning." - :type 'string - :group 'python-mode - :safe 'stringp) - -(defcustom python-shell-prompt-block-regexp "[.][.][.] " - "Regular Expression matching block input prompt of python shell. -It should not contain a caret (^) at the beginning." - :type 'string - :group 'python-mode - :safe 'stringp) - -(defcustom python-shell-prompt-output-regexp "" - "Regular Expression matching output prompt of python shell. -It should not contain a caret (^) at the beginning." - :type 'string - :group 'python-mode - :safe 'stringp) - -(defcustom python-shell-prompt-pdb-regexp "[(<]*[Ii]?[Pp]db[>)]+ " - "Regular Expression matching pdb input prompt of python shell. -It should not contain a caret (^) at the beginning." - :type 'string - :group 'python-mode - :safe 'stringp) - -(defcustom python-shell-send-setup-max-wait 5 - "Seconds to wait for process output before code setup. -If output is received before the especified time then control is -returned in that moment and not after waiting." - :type 'integer - :group 'python-mode - :safe 'integerp) - -(defcustom python-shell-process-environment nil - "List of environment variables for Python shell. -This variable follows the same rules as `process-environment' -since it merges with it before the process creation routines are -called. When this variable is nil, the Python shell is run with -the default `process-environment'." - :type '(repeat string) - :group 'python-mode - :safe 'listp) - -(defcustom python-shell-extra-pythonpaths nil - "List of extra pythonpaths for Python shell. -The values of this variable are added to the existing value of -PYTHONPATH in the `process-environment' variable." - :type '(repeat string) - :group 'python-mode - :safe 'listp) - -(defcustom python-shell-exec-path nil - "List of path to search for binaries. -This variable follows the same rules as `exec-path' since it -merges with it before the process creation routines are called. -When this variable is nil, the Python shell is run with the -default `exec-path'." - :type '(repeat string) - :group 'python-mode - :safe 'listp) - -(defcustom python-shell-virtualenv-path nil - "Path to virtualenv root. -This variable, when set to a string, makes the values stored in -`python-shell-process-environment' and `python-shell-exec-path' -to be modified properly so shells are started with the specified -virtualenv." - :type 'string - :group 'python-mode - :safe 'stringp) - -(defcustom python-ffap-setup-code - "def __FFAP_get_module_path(module): - try: - import os - path = __import__(module).__file__ - if path[-4:] == '.pyc' and os.path.exists(path[0:-1]): - path = path[:-1] - return path - except: - return ''" - "Python code to get a module path." - :type 'string - :group 'python-mode - :safe 'stringp) - -(defcustom python-ffap-string-code - "__FFAP_get_module_path('''%s''')\n" - "Python code used to get a string with the path of a module." - :type 'string - :group 'python-mode - :safe 'stringp) - -(defvar python--prompt-regexp nil) - -(defvar python-command python-python-command - "Actual command used to run Python. -May be `python-python-command' or `python-jython-command', possibly -modified by the user. Additional arguments are added when the command -is used by `run-python' et al.") - -(defvar python-buffer nil - "*The current Python process buffer. - -Commands that send text from source buffers to Python processes have -to choose a process to send to. This is determined by buffer-local -value of `python-buffer'. If its value in the current buffer, -i.e. both any local value and the default one, is nil, `run-python' -and commands that send to the Python process will start a new process. - -Whenever \\[run-python] starts a new process, it resets the default -value of `python-buffer' to be the new process's buffer and sets the -buffer-local value similarly if the current buffer is in Python mode -or Inferior Python mode, so that source buffer stays associated with a -specific sub-process. ") -(make-variable-buffer-local 'python-buffer) - -(defun python-ffap-module-path (module) - "Function for `ffap-alist' to return path for MODULE." - (let ((process (or - (and (eq major-mode 'inferior-python-mode) - (get-buffer-process (current-buffer))) - (python-shell-get-process)))) - (if (not process) - nil - (let ((module-file - (python-shell-send-string-no-output - (format python-ffap-string-code module) process))) - (when module-file - (substring-no-properties module-file 1 -1)))))) - -(eval-after-load "ffap" - '(progn - (push '(python-mode . python-ffap-module-path) ffap-alist) - (push '(inferior-python-mode . python-ffap-module-path) ffap-alist))) - -(defcustom python-shell-setup-codes '(python-shell-completion-setup-code - python-ffap-setup-code - python-eldoc-setup-code) - "List of code run by `py-shell-send-setup-codes'." - :type '(repeat symbol) - :group 'python-mode - :safe 'listp) - -(defcustom python-shell-compilation-regexp-alist - `((,(rx line-start (1+ (any " \t")) "File \"" - (group (1+ (not (any "\"<")))) ; avoid `<stdin>' &c - "\", line " (group (1+ digit))) - 1 2) - (,(rx " in file " (group (1+ not-newline)) " on line " - (group (1+ digit))) - 1 2) - (,(rx line-start "> " (group (1+ (not (any "(\"<")))) - "(" (group (1+ digit)) ")" (1+ (not (any "("))) "()") - 1 2)) - "`compilation-error-regexp-alist' for inferior Python." - :type '(alist string) - :group 'python-mode) - -(defvar python-mode-syntax-table nil - "Syntax table for Python files.") - -(setq 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 "_")) - (sst (standard-syntax-table))) - (dotimes (i 128) - (unless (= i ?_) - (if (equal symbol (aref sst i)) - (modify-syntax-entry i "." table))))) - (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) - (when py-underscore-word-syntax-p - (modify-syntax-entry ?_ "w" table)) - table)) - -(defconst python-dotty-syntax-table - (let ((table (make-syntax-table))) - (set-char-table-parent table python-mode-syntax-table) - (modify-syntax-entry ?. "_" table) - table) - "Syntax table giving `.' symbol syntax. -Otherwise inherits from `python-mode-syntax-table'.") -(defvar outline-heading-end-regexp) -(defvar eldoc-documentation-function) - -;; Stolen from org-mode -(defun python-util-clone-local-variables (from-buffer &optional regexp) - "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))) - (set (make-local-variable (car pair)) - (cdr pair)))) - (buffer-local-variables from-buffer))) - -(defun py-send-shell-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." - (let ((process (get-buffer-process (current-buffer)))) - ;; (accept-process-output process python-shell-send-setup-max-wait) - (accept-process-output process 1) - (dolist (code python-shell-setup-codes) - (when code - (py-send-string (symbol-value code) process))))) - -(defun python-shell-get-process-name (dedicated) - "Calculate the appropiate process name for inferior Python process. -If DEDICATED is t and the variable `buffer-file-name' is non-nil -returns a string with the form -`python-shell-buffer-name'[variable `buffer-file-name'] else -returns the value of `python-shell-buffer-name'. After -calculating the process name adds the buffer name for the process -in the `same-window-buffer-names' list." - (let ((process-name - (if (and dedicated - buffer-file-name) - (format "%s[%s]" python-shell-buffer-name buffer-file-name) - (format "%s" python-shell-buffer-name)))) - (add-to-list 'same-window-buffer-names (purecopy - (format "*%s*" process-name))) - process-name)) - -(defun python-shell-internal-get-process-name () - "Calculate the appropiate process name for Internal Python process. -The name is calculated from `python-shell-global-buffer-name' and -a hash of all relevant global shell settings in order to ensure -uniqueness for different types of configurations." - (format "%s [%s]" - python-shell-internal-buffer-name - (md5 - (concat - (python-shell-parse-command) - python-shell-prompt-regexp - python-shell-prompt-block-regexp - python-shell-prompt-output-regexp - (mapconcat #'symbol-value python-shell-setup-codes "") - (mapconcat #'identity python-shell-process-environment "") - (mapconcat #'identity python-shell-extra-pythonpaths "") - (mapconcat #'identity python-shell-exec-path "") - (or python-shell-virtualenv-path "") - (mapconcat #'identity python-shell-exec-path ""))))) - -(defun python-shell-parse-command () - "Calculate the string used to execute the inferior Python process." - (format "%s %s" python-shell-interpreter python-shell-interpreter-args)) - -(defun python-shell-calculate-process-environment () - "Calculate process environment given `python-shell-virtualenv-path'." - (let ((process-environment (append - python-shell-process-environment - process-environment nil)) - (virtualenv (if python-shell-virtualenv-path - (directory-file-name python-shell-virtualenv-path) - nil))) - (when python-shell-extra-pythonpaths - (setenv "PYTHONPATH" - (format "%s%s%s" - (mapconcat 'identity - python-shell-extra-pythonpaths - path-separator) - path-separator - (or (getenv "PYTHONPATH") "")))) - (if (not virtualenv) - process-environment - (setenv "PYTHONHOME" nil) - (setenv "PATH" (format "%s/bin%s%s" - virtualenv path-separator - (or (getenv "PATH") ""))) - (setenv "VIRTUAL_ENV" virtualenv)) - process-environment)) - -(defun python-shell-calculate-exec-path () - "Calculate exec path given `python-shell-virtualenv-path'." - (let ((path (append python-shell-exec-path - exec-path nil))) - (if (not python-shell-virtualenv-path) - path - (cons (format "%s/bin" - (directory-file-name python-shell-virtualenv-path)) - path)))) - -(defcustom python-shell-send-setup-max-wait 5 - "Seconds to wait for process output before code setup. -If output is received before the especified time then control is -returned in that moment and not after waiting." - :type 'integer - :group 'python-mode - :safe 'integerp) - -(defun python-shell-make-comint (cmd proc-name &optional pop) - "Create a python shell comint buffer. -CMD is the python command to be executed and PROC-NAME is the -process name the comint buffer will get. After the comint buffer -is created the `inferior-python-mode' is activated. If POP is -non-nil the buffer is shown." - (save-excursion - (let* ((proc-buffer-name (format "*%s*" proc-name)) - (process-environment (python-shell-calculate-process-environment)) - (exec-path (python-shell-calculate-exec-path))) - (when (not (comint-check-proc proc-buffer-name)) - (let* ((cmdlist (split-string-and-unquote cmd)) - (buffer (apply 'make-comint proc-name (car cmdlist) nil - (cdr cmdlist))) - (current-buffer (current-buffer))) - (with-current-buffer buffer - (inferior-python-mode) - (python-util-clone-local-variables current-buffer)))) - (when pop - (pop-to-buffer proc-buffer-name)) - proc-buffer-name))) - -(defcustom python-shell-completion-setup-code - "try: - import readline -except ImportError: - def __COMPLETER_all_completions(text): [] -else: - import rlcompleter - readline.set_completer(rlcompleter.Completer().complete) - def __COMPLETER_all_completions(text): - import sys - completions = [] - try: - i = 0 - while True: - res = readline.get_completer()(text, i) - if not res: break - i += 1 - completions.append(res) - except NameError: - pass - return completions" - "Code used to setup completion in inferior Python processes." - :type 'string - :group 'python-mode - :safe 'stringp) - -(defcustom python-shell-completion-string-code - "';'.join(__COMPLETER_all_completions('''%s'''))\n" - "Python code used to get a string of completions separated by semicolons." - :type 'string - :group 'python-mode - :safe 'stringp) - -(defcustom python-shell-module-completion-string-code "" - "Python code used to get completions separated by semicolons for imports. - -For IPython v0.11, add the following line to -`python-shell-completion-setup-code': - -from IPython.core.completerlib import module_completion - -and use the following as the value of this variable: - -';'.join(module_completion('''%s'''))\n" - :type 'string - :group 'python-mode - :safe 'stringp) - -(defvar python-completion-original-window-configuration nil) - -(defun run-python-internal () - "Run an inferior Internal Python process. -Input and output via buffer named after -`python-shell-internal-buffer-name' and what -`python-shell-internal-get-process-name' returns. This new kind -of shell is intended to be used for generic communication related -to defined configurations. The main 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. Runs the hook -`inferior-python-mode-hook' (after the `comint-mode-hook' is -run). \(Type \\[describe-mode] in the process buffer for a list -of commands.)" - (interactive) - (set-process-query-on-exit-flag - (get-buffer-process - (python-shell-make-comint - (python-shell-parse-command) - (python-shell-internal-get-process-name))) nil)) - -(defun python-shell-get-process () - "Get inferior Python process for current buffer and return it." - (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 - (get-buffer-process (or (and dedicated-running dedicated-proc-buffer-name) - (and global-running global-proc-buffer-name))))) - -(defun python-shell-get-or-create-process () - "Get or create an inferior Python process for current buffer and return it." - (let* ((old-buffer (current-buffer)) - (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)) - (current-prefix-arg 4)) - (when (and (not dedicated-running) (not global-running)) - (if (call-interactively 'run-python) - (setq dedicated-running t) - (setq global-running t))) - ;; Always prefer dedicated - (switch-to-buffer old-buffer) - (get-buffer-process (if dedicated-running - dedicated-proc-buffer-name - global-proc-buffer-name)))) - -(defun python-shell-internal-get-or-create-process () - "Get or create an inferior Internal Python process." - (let* ((proc-name (python-shell-internal-get-process-name)) - (proc-buffer-name (format "*%s*" proc-name))) - (run-python-internal) - (get-buffer-process proc-buffer-name))) - -(defun python-shell-send-string (string &optional process msg) - "Send STRING to inferior Python PROCESS. -When `py-verbose-p' and MSG is non-nil messages the first line of STRING." - (interactive "sPython command: ") - (let* ((process (or process (python-shell-get-or-create-process))) - (lines (split-string string "\n" t)) - ;; (temp-file-name (make-temp-file "py")) - (temp-file-name (concat (py-normalize-directory py-temp-directory) "psss-temp.py")) - (file-name (or (buffer-file-name) temp-file-name))) - ;; (when (and py-verbose-p msg) - ;; (message (format "Sent: %s..." (nth 0 lines))) - ;; ) - (if (> (length lines) 1) - (progn - (with-temp-file temp-file-name - (insert string) - (delete-trailing-whitespace)) - (python-shell-send-file file-name process temp-file-name)) - (comint-send-string process string) - (when (or (not (string-match "\n$" string)) - (string-match "\n[ \t].*\n?$" string)) - (comint-send-string process "\n"))) - ;; (when (file-readable-p temp-file-name) (delete-file temp-file-name)) - ) - ) - -(defun python-shell-send-string-no-output (string &optional process msg) - "Send STRING to PROCESS and inhibit output. -When MSG is non-nil messages the first line of STRING. Return -the output." - (let* ((output-buffer) - (process (or process (python-shell-get-or-create-process))) - (comint-preoutput-filter-functions - (append comint-preoutput-filter-functions - '(ansi-color-filter-apply - (lambda (string) - (setq output-buffer (concat output-buffer string)) - ""))))) - (python-shell-send-string string process msg) - (accept-process-output process 1) - (when output-buffer - (replace-regexp-in-string - (if (> (length python-shell-prompt-output-regexp) 0) - (format "\n*%s$\\|^%s\\|\n$" - python-shell-prompt-regexp - (or python-shell-prompt-output-regexp "")) - (format "\n*$\\|^%s\\|\n$" - python-shell-prompt-regexp)) - "" output-buffer)))) - -(defun python-shell-internal-send-string (string) - "Send STRING to the Internal Python interpreter. -Returns the output. See `python-shell-send-string-no-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) - (python-shell-internal-get-or-create-process) nil)) - -(defun python-shell-send-region (start end) - "Send the region delimited by START and END to inferior Python process." - (interactive "r") - (let ((deactivate-mark nil)) - (python-shell-send-string (buffer-substring start end) nil t))) - -(defun python-shell-send-buffer () - "Send the entire buffer to inferior Python process." - (interactive) - (save-restriction - (widen) - (python-shell-send-region (point-min) (point-max)))) - -(defun python-shell-send-defun (arg) - "Send the current defun to inferior Python process. -When argument ARG is non-nil sends the innermost defun." - (interactive "P") - (save-excursion - (python-shell-send-region - (progn - (or (python-beginning-of-defun-function) - (progn (beginning-of-line) (point-marker)))) - (progn - (or (python-end-of-defun-function) - (progn (end-of-line) (point-marker))))))) - -(defun python-shell-send-file (file-name &optional process temp-file-name) - "Send FILE-NAME to inferior Python PROCESS. -If TEMP-FILE-NAME is passed then that file is used for processing -instead, while internally the shell will continue to use -FILE-NAME." - (interactive "fFile to send: ") - (let* ((process (or process (python-shell-get-or-create-process))) - (temp-file-name (when temp-file-name - (expand-file-name temp-file-name))) - (file-name (or (expand-file-name file-name) temp-file-name)) - py-python-command-args) - (when (not file-name) - (error "If FILE-NAME is nil then TEMP-FILE-NAME must be non-nil")) - (python-shell-send-string - (format - (concat "__pyfile = open('''%s''');" - "exec(compile(__pyfile.read(), '''%s''', 'exec'));" - "__pyfile.close()") - (or temp-file-name file-name) file-name) - process))) - -(defun python-shell-switch-to-shell () - "Switch to inferior Python process buffer." - (interactive) - (pop-to-buffer (process-buffer (python-shell-get-or-create-process)) t)) - -(defcustom python-pdbtrack-stacktrace-info-regexp - "^> \\([^\"(<]+\\)(\\([0-9]+\\))\\([?a-zA-Z0-9_<>]+\\)()" - "Regular Expression matching stacktrace information. -Used to extract the current line and module being inspected." - :type 'string - :group 'python-mode - :safe 'stringp) - -;;; Eldoc - -(defcustom python-eldoc-setup-code - "def __PYDOC_get_help(obj): - try: - import inspect - if hasattr(obj, 'startswith'): - obj = eval(obj, globals()) - 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: - args = inspect.formatargspec( - *inspect.getargspec(target) - ) - name = obj.__name__ - doc = '{objtype} {name}{args}'.format( - objtype=objtype, name=name, args=args - ) - else: - doc = doc.splitlines()[0] - except: - doc = '' - try: - exec('print doc') - except SyntaxError: - print(doc)" - "Python code to setup documentation retrieval." - :type 'string - :group 'python-mode - :safe 'stringp) - -(defcustom python-eldoc-string-code - "__PYDOC_get_help('''%s''')\n" - "Python code used to get a string with the documentation of an object." - :type 'string - :group 'python-mode - :safe 'stringp) - -;;; Pdb -(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.") -(make-variable-buffer-local 'python-pdbtrack-tracked-buffer) - -(defvar python-pdbtrack-buffers-to-kill nil - "List of buffers to be deleted after tracking finishes.") -(make-variable-buffer-local 'python-pdbtrack-buffers-to-kill) - -(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." - (let ((file-buffer (get-file-buffer file-name))) - (if file-buffer - (setq python-pdbtrack-tracked-buffer file-buffer) - (setq file-buffer (find-file-noselect file-name)) - (when (not (member file-buffer python-pdbtrack-buffers-to-kill)) - (add-to-list 'python-pdbtrack-buffers-to-kill file-buffer))) - file-buffer)) - -(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." - (when (not (string= output "")) - (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) - (goto-char (point-min)) - ;; OK, this sucked but now it became a cool hack. The - ;; stacktrace information normally is on the first line - ;; but in some cases (like when doing a step-in) it is - ;; on the second. - (when (or (looking-at python-pdbtrack-stacktrace-info-regexp) - (and (forward-line) - (looking-at python-pdbtrack-stacktrace-info-regexp))) - (setq line-number (string-to-number - (match-string-no-properties 2))) - (match-string-no-properties 1))))) - (if (and file-name line-number) - (let* ((tracked-buffer (python-pdbtrack-set-tracked-buffer file-name)) - (shell-buffer (current-buffer)) - (tracked-buffer-window (get-buffer-window tracked-buffer)) - (tracked-buffer-line-pos)) - (with-current-buffer tracked-buffer - (set (make-local-variable 'overlay-arrow-string) "=>") - (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)) - (pop-to-buffer tracked-buffer) - (switch-to-buffer-other-window shell-buffer)) - (when python-pdbtrack-tracked-buffer - (with-current-buffer python-pdbtrack-tracked-buffer - (set-marker overlay-arrow-position nil)) - (mapc #'(lambda (buffer) - (ignore-errors (kill-buffer buffer))) - python-pdbtrack-buffers-to-kill) - (setq python-pdbtrack-tracked-buffer nil - python-pdbtrack-buffers-to-kill nil))))) - output) - -;;; - -(defun python-shell-completion--get-completions (input process completion-code) - "Retrieve available completions for INPUT using PROCESS. -Argument COMPLETION-CODE is the python code used to get -completions on the current context." - (with-current-buffer (process-buffer process) - (let ((completions - (python-shell-send-string-no-output - (format completion-code input) process))) - (when (> (length completions) 2) - (split-string completions "^'\\|^\"\\|;\\|'$\\|\"$" t))))) - -(defun python-shell-completion--do-completion-at-point (process imports input) - "Do completion at point for PROCESS." - (with-syntax-table python-dotty-syntax-table - (let* ((code - (if imports - (concat imports python-shell-module-completion-string-code) - python-shell-module-completion-string-code)) - (completions - (python-shell-completion--get-completions - input process code)) - (completion (when completions - (try-completion input completions)))) - (cond ((eq completion t) - (if (eq this-command last-command) - (when python-completion-original-window-configuration - (set-window-configuration - python-completion-original-window-configuration))) - (setq python-completion-original-window-configuration nil) - nil) - ((null completion) - (message "Can't find completion for \"%s\"" input) - (ding) - nil) - ((not (string= input completion)) - (progn (delete-char (- (length input))) - (insert completion) - ;; minibuffer.el expects a list, a bug IMO - nil)) - (t - (unless python-completion-original-window-configuration - (setq python-completion-original-window-configuration - (current-window-configuration))) - (with-output-to-temp-buffer "*Python Completions*" - (display-completion-list - (all-completions input completions))) - nil))))) - -(defun python-shell-completion-complete-at-point () - "Perform completion at point in inferior Python process." - (interactive) - (and comint-last-prompt-overlay - (> (point-marker) (overlay-end comint-last-prompt-overlay)) - (python-shell-completion--do-completion-at-point - (get-buffer-process (current-buffer))(buffer-substring-no-properties beg end) word))) - -(defun python-shell-completion-complete-or-indent () - "Complete or indent depending on the context. -If content before pointer is all whitespace indent. If not try -to complete." - (interactive) - (if (string-match "^[[:space:]]*$" - (buffer-substring (comint-line-beginning-position) - (point-marker))) - (indent-for-tab-command) - (comint-dynamic-complete))) - -;;; NO USER DEFINABLE VARIABLES BEYOND THIS POINT -(defvar ipython-version nil) - -(defvar python-command "python" - "Used by `py-completion-at-point', derived from python.el" ) - -(defvaralias 'python-python-command-args 'py-python-command-args) -(defvaralias 'py-python-command 'py-shell-name) -(defvaralias 'py-jpython-command 'py-shell-name) -(defvaralias 'py-jython-command 'py-shell-name) -(defvaralias 'py-default-interpreter 'py-shell-name) -;; (defvaralias 'python-command 'py-shell-name) - -(defvar py-shell-template " -\(defun NAME (&optional argprompt) - \"Start an DOCNAME interpreter in another window. - -With optional \\\\[universal-argument] user is prompted -for options to pass to the DOCNAME interpreter. \" - (interactive \"P\") - (let\* ((py-shell-name \"FULLNAME\")) - (py-shell argprompt) - (when (interactive-p) (switch-to-buffer (current-buffer)) - (goto-char (point-max))))) -") - -(setq py-shell-template " -\(defun NAME (&optional argprompt) - \"Start an DOCNAME interpreter in another window. - -With optional \\\\[universal-argument] user is prompted -for options to pass to the DOCNAME interpreter. \" - (interactive \"P\") - (let\* ((py-shell-name \"FULLNAME\")) - (py-shell argprompt) - (when (interactive-p) (switch-to-buffer (current-buffer)) - (goto-char (point-max))))) -") - -(defvar view-return-to-alist) -(defvar python-imports) ; forward declaration - -(defvar py-execute-directory nil - "Stores the file's directory-name py-execute-... functions act upon. ") - -(defvar py-prev-dir/file nil - "Caches (directory . file) pair used in the last `py-load-file' command. -Used for determining the default in the next one.") - -(defvar py-exception-buffer nil) - -(defvar py-output-buffer "*Python Output*") -(make-variable-buffer-local 'py-output-buffer) - -(defvar py-execute-keep-temporary-file-p nil - "For tests only. Excute functions delete temporary files default. ") - -(defvar py-expression-skip-regexp "^ =:#\t\r\n\f" - "py-expression assumes chars indicated possible composing a py-expression, skip it. ") -;; (setq py-expression-skip-regexp "^ =:#\t\r\n\f") - -(defvar py-expression-looking-regexp "[^ =:#\t\r\n\f]+" - "py-expression assumes chars indicated possible composing a py-expression, when looking-at or -back. ") -;; (setq py-expression-looking-regexp "[^ =:#\t\r\n\f)]") - -(defvar py-not-expression-regexp "[ .=:#\t\r\n\f)]" - "py-expression assumes chars indicated probably will not compose a py-expression. ") -;; (setq py-not-expression-regexp "[ .=:#\t\r\n\f)]") - -(defvar py-partial-expression-skip-regexp "^ .()[]{}=:#\t\r\n\f" - "py-partial-expression assumes chars indicated possible composing a py-partial-expression, skip it. ") -;; (setq py-partial-expression-skip-regexp "^ .(){}=:#\t\r\n\f") - -(defvar py-partial-expression-forward-regexp "^ .)}=:#\t\r\n\f" - "py-partial-expression assumes chars indicated possible composing a py-partial-expression, skip it. ") - -(defvar py-partial-expression-backward-regexp "^ .({=:#\t\r\n\f" - "py-partial-expression assumes chars indicated possible composing a py-partial-expression, skip it. ") - -(defvar py-not-partial-expression-skip-regexp " \\.=:#\t\r\n\f" - "py-partial-expression assumes chars indicated may not compose a py-partial-expression, skip it. ") - -(defvar py-partial-expression-looking-regexp "[^ .=:#\t\r\n\f]" - "py-partial-expression assumes chars indicated possible composing a py-partial-expression, when looking-at or -back. ") -;; (setq py-partial-expression-looking-regexp "[^ .=:#\t\r\n\f)]") - -(defvar py-not-partial-expression-regexp "[ .=:#\t\r\n\f)]" - "py-partial-expression assumes chars indicated probably will not compose a py-partial-expression. ") -;; (setq py-not-partial-expression-regexp "[ .=:#\t\r\n\f)]") - -(defvar py-line-number-offset 0 - "When an exception occurs as a result of py-execute-region, a -subsequent py-up-exception needs the line number where the region -started, in order to jump to the correct file line. This variable is -set in py-execute-region and used in py-jump-to-exception.") - -(defvar match-paren-no-use-syntax-pps nil) - -(defsubst py-keep-region-active () - "Keep the region active in XEmacs." - ;; Ignore byte-compiler warnings you might see. Also note that - ;; FSF's Emacs does it differently; its policy doesn't require us - ;; to take explicit action. - (and (boundp 'zmacs-region-stays) - (setq zmacs-region-stays t))) - -;; Constants -(defconst py-blank-or-comment-re "[ \t]*\\($\\|#\\)" - "Regular expression matching a blank or comment line.") - -(defconst py-block-closing-keywords-re - "[ \t]*\\<\\(return\\|raise\\|break\\|continue\\|pass\\)\\_>[ \n\t]" - "Matches the beginning of a class, method or compound statement. ") - -(defconst py-finally-re - "[ \t]*\\_<finally\\_>[: \n\t]" - "Regular expression matching keyword which closes a try-block. ") - -(defconst py-except-re - "[ \t]*\\_<except\\_>[: \n\t]" - "Regular expression matching keyword which composes a try-block. ") - -(defconst py-else-re - "[ \t]*\\_<else\\_>[: \n\t]" - "Regular expression matching keyword which closes a for- if- or try-block. ") - -(defconst py-return-re - ".*:?[ \t]*\\_<\\(return\\)\\_>[ \n\t]" - "Regular expression matching keyword which typically closes a function. ") - -(defconst py-no-outdent-re "\\(try:\\|except\\(\\s +.*\\)?:\\|while\\s +.*:\\|for\\s +.*:\\|if\\s +.*:\\|elif\\s +.*:\\)\\([ ]*\\_<\\(return\\|raise\\|break\\|continue\\|pass\\)\\_>[ \n]\\)") - -;; (defconst py-no-outdent-re -;; (concat -;; "\\(" -;; (mapconcat 'identity -;; (list "try:" -;; "except\\(\\s +.*\\)?:" -;; "while\\s +.*:" -;; "for\\s +.*:" -;; "if\\s +.*:" -;; "elif\\s +.*:" -;; (concat py-block-closing-keywords-re "[ \t\n]")) -;; "\\|") -;; "\\)") -;; "Regular expression matching lines not to dedent after.") - -(defvar py-traceback-line-re - "^IPython\\|^In \\[[0-9]+\\]: *\\|^>>>\\|^[^ \t>]+>[^0-9]+\\([0-9]+\\)\\|^[ \t]+File \"\\([^\"]+\\)\", line \\([0-9]+\\)" - "Regular expression that describes tracebacks. -Inludes Python shell-prompt in order to stop further searches. ") - -(defconst py-assignment-re "\\<\\w+\\>[ \t]*\\(=\\|+=\\|*=\\|%=\\|&=\\|^=\\|<<=\\|-=\\|/=\\|**=\\||=\\|>>=\\|//=\\)" - "If looking at the beginning of an assignment. ") - -(defconst py-block-re "[ \t]*\\_<\\(class\\|def\\|for\\|if\\|try\\|while\\|with\\)\\_>[: \n\t]" - "Matches the beginning of a compound statement. ") - -(defconst py-minor-block-re "[ \t]*\\_<\\(for\\|if\\|try\\)\\_>[: \n\t]" - "Matches the beginning of an `for', `if' or `try' block. ") - -(defconst py-try-block-re "[ \t]*\\_<try\\_>[: \n\t]" - "Matches the beginning of an `if' or `try' block. ") - -(defconst py-class-re "[ \t]*\\_<\\(class\\)\\_>[ \n\t]" - "Matches the beginning of a class definition. ") - -(defconst py-def-or-class-re "[ \t]*\\_<\\(def\\|class\\)\\_>[ \n\t]" - "Matches the beginning of a class- or functions definition. ") - -(defconst py-def-re "[ \t]*\\_<\\(def\\)\\_>[ \n\t]" - "Matches the beginning of a functions definition. ") - -(defconst py-block-or-clause-re "[ \t]*\\_<\\(if\\|else\\|elif\\|while\\|for\\|def\\|class\\|try\\|except\\|finally\\|with\\)\\_>[: \n\t]" - "Matches the beginning of a compound statement or it's clause. ") - -(defconst py-clause-re "[ \t]*\\_<\\(else\\|elif\\|except\\|finally\\)\\_>[: \n\t]" - "Matches the beginning of a compound statement's clause. ") - -(defconst py-elif-re "[ \t]*\\_<\\elif\\_>[: \n\t]" - "Matches the beginning of a compound if-statement's clause exclusively. ") - -(defconst py-try-clause-re "[ \t]*\\_<\\(except\\|else\\|finally\\)\\_>[: \n\t]" - "Matches the beginning of a compound try-statement's clause. ") - -(defconst py-if-re "[ \t]*\\_<if\\_>[ \n\t]" - "Matches the beginning of a compound statement saying `if'. ") - -(defconst py-try-re "[ \t]*\\_<try\\_>[: \n\t]" - "Matches the beginning of a compound statement saying `try'. " ) - -;;; Macro definitions -(defmacro py-in-string-or-comment-p () - "Returns beginning position if inside a string or comment, nil otherwise. " - `(or (nth 8 (syntax-ppss)) - (when (or (looking-at "\"")(looking-at "[ \t]*#[ \t]*")) - (match-beginning 0)))) - -(defmacro empty-line-p () - "Returns t if cursor is at an line with nothing but whitespace-characters, nil otherwise." - (interactive "p") - `(save-excursion - (progn - (beginning-of-line) - (looking-at "\\s-*$")))) - -(defmacro py-escaped () - "Return t if char is preceded by an odd number of backslashes. " - `(save-excursion - (< 0 (% (abs (skip-chars-backward "\\\\")) 2)))) - -(defmacro py-preceding-line-backslashed-p () - "Return t if preceding line is a backslashed continuation line. " - `(save-excursion - (beginning-of-line) - (skip-chars-backward " \t\r\n\f") - (and (eq (char-before (point)) ?\\ ) - (py-escaped)))) - -(defmacro py-current-line-backslashed-p () - "Return t if current line is a backslashed continuation line. " - `(save-excursion - (end-of-line) - (skip-chars-backward " \t\r\n\f") - (and (eq (char-before (point)) ?\\ ) - (py-escaped)))) - -(defmacro py-continuation-line-p () - "Return t iff current line is a continuation line." - `(save-excursion - (beginning-of-line) - (or (py-preceding-line-backslashed-p) - (< 0 (nth 0 (syntax-ppss)))))) - -(defun py-count-lines (&optional start end) - "Count lines in accessible part until current line. - -See http://debbugs.gnu.org/cgi/bugreport.cgi?bug=7115" - (interactive) - (save-excursion - (let ((count 0) - (orig (point))) - (goto-char (point-min)) - (while (and (< (point) orig)(not (eobp)) (skip-chars-forward "^\n" orig)) - (setq count (1+ count)) - (unless (or (not (< (point) orig)) (eobp)) (forward-char 1) - (setq count (+ count (abs (skip-chars-forward "\n" orig)))))) - (when (bolp) (setq count (1+ count))) - (when (interactive-p) (message "%s" count)) - count))) - - -(eval-when-compile - (defconst python-rx-constituents - (list - `(block-start . ,(rx symbol-start - (or "def" "class" "if" "elif" "else" "try" - "except" "finally" "for" "while" "with") - symbol-end)) - `(decorator . ,(rx line-start (* space) ?@ (any letter ?_) - (* (any word ?_)))) - `(defun . ,(rx symbol-start (or "def" "class") symbol-end)) - `(symbol-name . ,(rx (any letter ?_) (* (any word ?_)))) - `(open-paren . ,(rx (or "{" "[" "("))) - `(close-paren . ,(rx (or "}" "]" ")"))) - `(simple-operator . ,(rx (any ?+ ?- ?/ ?& ?^ ?~ ?| ?* ?< ?> ?= ?%))) - `(not-simple-operator . ,(rx (not (any ?+ ?- ?/ ?& ?^ ?~ ?| ?* ?< ?> ?= ?%)))) - `(operator . ,(rx (or "+" "-" "/" "&" "^" "~" "|" "*" "<" ">" - "=" "%" "**" "//" "<<" ">>" "<=" "!=" - "==" ">=" "is" "not"))) - `(assignment-operator . ,(rx (or "=" "+=" "-=" "*=" "/=" "//=" "%=" "**=" - ">>=" "<<=" "&=" "^=" "|=")))) - "Additional Python specific sexps for `python-rx'")) - -(defmacro python-rx (&rest regexps) - "Python mode specialized rx macro which supports common python named REGEXPS." - (let ((rx-constituents (append python-rx-constituents rx-constituents))) - (cond ((null regexps) - (error "No regexp")) - ((cdr regexps) - (rx-to-string `(and ,@regexps) t)) - (t - (rx-to-string (car regexps) t))))) - -;;; -;; GNU's syntax-ppss-context -(unless (functionp 'syntax-ppss-context) - (defsubst syntax-ppss-context (ppss) - (cond - ((nth 3 ppss) 'string) - ((nth 4 ppss) 'comment) - (t nil)))) - -;; Skip's XE workaround -(unless (fboundp 'string-to-syntax) - (defun string-to-syntax (s) - (cond - ((equal s "|") '(15)) - ((equal s "_") '(3)) - (t (error "Unhandled string: %s" s))))) - -;;; GNU python.el stuff - -(defun py-history-input-filter (str) - "`comint-input-filter' function for inferior Python. -Don't save anything for STR matching `py-history-filter-regexp'." - (not (string-match py-history-filter-regexp str))) - -;; Fixme: Loses with quoted whitespace. -(defun python-args-to-list (string) - (let ((where (string-match "[ \t]" string))) - (cond ((null where) (list string)) - ((not (= where 0)) - (cons (substring string 0 where) - (python-args-to-list (substring string (+ 1 where))))) - (t (let ((pos (string-match "[^ \t]" string))) - (if pos (python-args-to-list (substring string pos)))))))) - -(defvar python-preoutput-result nil - "Data from last `_emacs_out' line seen by the preoutput filter.") - -(defvar python-preoutput-continuation nil - "If non-nil, funcall this when `python-preoutput-filter' sees `_emacs_ok'.") - -(defvar python-preoutput-leftover nil) -(defvar python-preoutput-skip-next-prompt nil) - -;; Using this stops us getting lines in the buffer like -;; >>> ... ... >>> -;; Also look for (and delete) an `_emacs_ok' string and call -;; `python-preoutput-continuation' if we get it. -(defun python-preoutput-filter (s) - "`comint-preoutput-filter-functions' function: ignore prompts not at bol." - (when python-preoutput-leftover - (setq s (concat python-preoutput-leftover s)) - (setq python-preoutput-leftover nil)) - (let ((start 0) - (res "")) - ;; First process whole lines. - (while (string-match "\n" s start) - (let ((line (substring s start (setq start (match-end 0))))) - ;; Skip prompt if needed. - (when (and python-preoutput-skip-next-prompt - (string-match comint-prompt-regexp line)) - (setq python-preoutput-skip-next-prompt nil) - (setq line (substring line (match-end 0)))) - ;; Recognize special _emacs_out lines. - (if (and (string-match "\\`_emacs_out \\(.*\\)\n\\'" line) - (local-variable-p 'python-preoutput-result)) - (progn - (setq python-preoutput-result (match-string 1 line)) - (set (make-local-variable 'python-preoutput-skip-next-prompt) t)) - (setq res (concat res line))))) - ;; Then process the remaining partial line. - (unless (zerop start) (setq s (substring s start))) - (cond ((and (string-match comint-prompt-regexp s) - ;; Drop this prompt if it follows an _emacs_out... - (or python-preoutput-skip-next-prompt - ;; ... or if it's not gonna be inserted at BOL. - ;; Maybe we could be more selective here. - (if (zerop (length res)) - (not (bolp)) - (string-match ".\\'" res)))) - ;; The need for this seems to be system-dependent: - ;; What is this all about, exactly? --Stef - ;; (if (and (eq ?. (aref s 0))) - ;; (accept-process-output (get-buffer-process (current-buffer)) 1)) - (setq python-preoutput-skip-next-prompt nil) - res) - ((let ((end (min (length "_emacs_out ") (length s)))) - (eq t (compare-strings s nil end "_emacs_out " nil end))) - ;; The leftover string is a prefix of _emacs_out so we don't know - ;; yet whether it's an _emacs_out or something else: wait until we - ;; get more output so we can resolve this ambiguity. - (set (make-local-variable 'python-preoutput-leftover) s) - res) - (t (concat res s))))) - -(defvar python-version-checked nil) -(defun python-check-version (cmd) - "Check that CMD runs a suitable version of Python." - ;; Fixme: Check on Jython. - (unless (or python-version-checked - (equal 0 (string-match (regexp-quote python-python-command) - cmd))) - (unless (shell-command-to-string cmd) - (error "Can't run Python command `%s'" cmd)) - (let* ((res (shell-command-to-string - (concat cmd - " -c \"from sys import version_info;\ -print version_info >= (2, 2) and version_info < (3, 0)\"")))) - (unless (string-match "True" res) - (error "Only Python versions >= 2.2 and < 3.0 are supported"))) - (setq python-version-checked t))) - -(defun run-python (&optional cmd noshow new) - "Run an inferior Python process, input and output via buffer *Python*. - -CMD is the Python command to run. NOSHOW non-nil means don't -show the buffer automatically. - -Interactively, a prefix arg means to prompt for the initial -Python command line (default is `python-command'). - -A new process is started if one isn't running attached to -`python-buffer', or if called from Lisp with non-nil arg NEW. -Otherwise, if a process is already running in `python-buffer', -switch to that buffer. - -This command runs the hook `inferior-python-mode-hook' after -running `comint-mode-hook'. Type \\[describe-mode] in the -process buffer for a list of commands. - -By default, Emacs inhibits the loading of Python modules from the -current working directory, for security reasons. To disable this -behavior, change `python-remove-cwd-from-path' to nil." - (interactive (if current-prefix-arg - (list (read-string "Run Python: " python-command) nil t) - (list python-command))) - (unless cmd (setq cmd python-command)) - (setq python-command cmd) - ;; Fixme: Consider making `python-buffer' buffer-local as a buffer - ;; (not a name) in Python buffers from which `run-python' &c is - ;; invoked. Would support multiple processes better. - (when (or new (not (comint-check-proc python-buffer))) - (with-current-buffer - (let* ((cmdlist - (append (python-args-to-list cmd) '("-i") - (if python-remove-cwd-from-path - '("-c" "import sys; sys.path.remove('')")))) - (path (getenv "PYTHONPATH")) - (process-environment ; to import emacs.py - (cons (concat "PYTHONPATH=" - (if path (concat path path-separator)) - data-directory) - process-environment)) - ;; If we use a pipe, unicode characters are not printed - ;; correctly (Bug#5794) and IPython does not work at - ;; all (Bug#5390). - ;; (process-connection-type t)) - ) - (apply 'make-comint-in-buffer "Python" - (generate-new-buffer "*Python*") - (car cmdlist) nil (cdr cmdlist))) - (setq-default python-buffer (current-buffer)) - (setq python-buffer (current-buffer)) - (accept-process-output (get-buffer-process python-buffer) 5) - (inferior-python-mode) - ;; Load function definitions we need. - ;; Before the preoutput function was used, this was done via -c in - ;; cmdlist, but that loses the banner and doesn't run the startup - ;; file. The code might be inline here, but there's enough that it - ;; seems worth putting in a separate file, and it's probably cleaner - ;; to put it in a module. - ;; Ensure we're at a prompt before doing anything else. - (py-send-string "import emacs") - ;; The following line was meant to ensure that we're at a prompt - ;; before doing anything else. However, this can cause Emacs to - ;; hang waiting for a response, if that Python function fails - ;; (i.e. raises an exception). - ;; (python-send-receive "print '_emacs_out ()'") - )) - (if (derived-mode-p 'python-mode) - (setq python-buffer (default-value 'python-buffer))) ; buffer-local - ;; Without this, help output goes into the inferior python buffer if - ;; the process isn't already running. - (sit-for 1 t) ;Should we use accept-process-output instead? --Stef - (unless noshow (pop-to-buffer python-buffer t))) - -(defun python-send-command (command) - "Like `python-send-string' but resets `compilation-shell-minor-mode'." - (when (python-check-comint-prompt) - (with-current-buffer (process-buffer (py-proc)) - (goto-char (point-max)) - (compilation-forget-errors) - (py-send-string command) - (setq compilation-last-buffer (current-buffer))))) - -(defun python-send-region (start end) - "Send the region to the inferior Python process." - ;; The region is evaluated from a temporary file. This avoids - ;; problems with blank lines, which have different semantics - ;; interactively and in files. It also saves the inferior process - ;; buffer filling up with interpreter prompts. We need a Python - ;; function to remove the temporary file when it has been evaluated - ;; (though we could probably do it in Lisp with a Comint output - ;; filter). This function also catches exceptions and truncates - ;; tracebacks not to mention the frame of the function itself. - ;; - ;; The `compilation-shell-minor-mode' parsing takes care of relating - ;; the reference to the temporary file to the source. - ;; - ;; Fixme: Write a `coding' header to the temp file if the region is - ;; non-ASCII. - (interactive "r") - (let* ((f (make-temp-file "py")) - (command - ;; IPython puts the FakeModule module into __main__ so - ;; emacs.eexecfile becomes useless. - (if (or (string-match "[iI][pP]ython[^[:alpha:]]*$" (py-choose-shell)) - (string-match "[pP]ython3[[:alnum:]:]*$" (py-choose-shell))) - (format "execfile %S" f) - (format "emacs.eexecfile(%S)" f))) - (orig-start (copy-marker start))) - (when (save-excursion - (goto-char start) - (/= 0 (current-indentation))) ; need dummy block - (save-excursion - (goto-char orig-start) - ;; Wrong if we had indented code at buffer start. - (set-marker orig-start (line-beginning-position 0))) - (write-region "if True:\n" nil f nil 'nomsg)) - (write-region start end f t 'nomsg) - (python-send-command command) - (with-current-buffer (process-buffer (py-proc)) - ;; Tell compile.el to redirect error locations in file `f' to - ;; positions past marker `orig-start'. It has to be done *after* - ;; `python-send-command''s call to `compilation-forget-errors'. - (compilation-fake-loc orig-start f)))) - -(defun python-send-string (string) - "Evaluate STRING in inferior Python process." - (interactive "sPython command: ") - (comint-send-string (py-proc) string) - (unless (string-match "\n\\'" string) - ;; Make sure the text is properly LF-terminated. - (comint-send-string (py-proc) "\n")) - (when (string-match "\n[ \t].*\n?\\'" string) - ;; If the string contains a final indented line, add a second newline so - ;; as to make sure we terminate the multiline instruction. - (comint-send-string (py-proc) "\n"))) - -(defun python-send-buffer () - "Send the current buffer to the inferior Python process." - (interactive) - (python-send-region (point-min) (point-max))) - -;; Fixme: Try to define the function or class within the relevant -;; module, not just at top level. -(defun python-send-defun () - "Send the current defun (class or method) to the inferior Python process." - (interactive) - (save-excursion (python-send-region (progn (beginning-of-defun) (point)) - (progn (end-of-defun) (point))))) - -(defun python-switch-to-python (eob-p) - "Switch to the Python process buffer, maybe starting new process. -With prefix arg, position cursor at end of buffer." - (interactive "P") - (pop-to-buffer (process-buffer (py-proc)) t) ;Runs python if needed. - (when eob-p - (push-mark) - (goto-char (point-max)))) - -(defun python-send-region-and-go (start end) - "Send the region to the inferior Python process. -Then switch to the process buffer." - (interactive "r") - (python-send-region start end) - (python-switch-to-python t)) - -(defvar python-prev-dir/file nil - "Caches (directory . file) pair used in the last `python-load-file' command. -Used for determining the default in the next one.") - -(defun python-load-file (file-name) - "Load a Python file FILE-NAME into the inferior Python process. -If the file has extension `.py' import or reload it as a module. -Treating it as a module keeps the global namespace clean, provides -function location information for debugging, and supports users of -module-qualified names." - (interactive (comint-get-source "Load Python file: " python-prev-dir/file - python-source-modes - t)) ; because execfile needs exact name - (comint-check-source file-name) ; Check to see if buffer needs saving. - (setq python-prev-dir/file (cons (file-name-directory file-name) - (file-name-nondirectory file-name))) - (with-current-buffer (process-buffer (py-proc)) ;Runs python if needed. - ;; Fixme: I'm not convinced by this logic from python-mode.el. - (python-send-command - (if (string-match "\\.py\\'" file-name) - (let ((module (file-name-sans-extension - (file-name-nondirectory file-name)))) - (format "emacs.eimport(%S,%S)" - module (file-name-directory file-name))) - (format "execfile(%S)" file-name))) - (message "%s loaded" file-name))) - -(defun py-proc () - "Return the current Python process. - -See variable `python-buffer'. Starts a new process if necessary." - ;; Fixme: Maybe should look for another active process if there - ;; isn't one for `python-buffer'. - (unless (comint-check-proc python-buffer) - (run-python nil t)) - (get-buffer-process (if (derived-mode-p 'inferior-python-mode) - (current-buffer) - python-buffer))) - -(defun python-set-proc () - "Set the default value of `python-buffer' to correspond to this buffer. -If the current buffer has a local value of `python-buffer', set the -default (global) value to that. The associated Python process is -the one that gets input from \\[python-send-region] et al when used -in a buffer that doesn't have a local value of `python-buffer'." - (interactive) - (if (local-variable-p 'python-buffer) - (setq-default python-buffer python-buffer) - (error "No local value of `python-buffer'"))) - -;; Fixme: Should this actually be used instead of info-look, i.e. be -;; bound to C-h S? [Probably not, since info-look may work in cases -;; where this doesn't.] -;; (defun python-describe-symbol (symbol) -;; "Get help on SYMBOL using `help'. -;; Interactively, prompt for symbol. -;; -;; Symbol may be anything recognized by the interpreter's `help' -;; command -- e.g. `CALLS' -- not just variables in scope in the -;; interpreter. This only works for Python version 2.2 or newer -;; since earlier interpreters don't support `help'. -;; -;; In some cases where this doesn't find documentation, \\[info-lookup-symbol] -;; will." -;; ;; Note that we do this in the inferior process, not a separate one, to -;; ;; ensure the environment is appropriate. -;; (interactive -;; (let ((symbol (with-syntax-table python-dotty-syntax-table -;; (current-word))) -;; (enable-recursive-minibuffers t)) -;; (list (read-string (if symbol -;; (format "Describe symbol (default %s): " symbol) -;; "Describe symbol: ") -;; nil nil symbol)))) -;; (if (equal symbol "") (error "No symbol")) -;; ;; Ensure we have a suitable help buffer. -;; ;; Fixme: Maybe process `Related help topics' a la help xrefs and -;; ;; allow C-c C-f in help buffer. -;; (let ((temp-buffer-show-hook ; avoid xref stuff -;; (lambda () -;; (toggle-read-only 1) -;; (setq view-return-to-alist -;; (list (cons (selected-window) help-return-method)))))) -;; (with-output-to-temp-buffer (help-buffer) -;; (with-current-buffer standard-output -;; ;; Fixme: Is this actually useful? -;; (help-setup-xref (list 'python-describe-symbol symbol) -;; (called-interactively-p 'interactive)) -;; (set (make-local-variable 'comint-redirect-subvert-readonly) t) -;; (help-print-return-message)))) -;; (comint-redirect-send-command-to-process (format "emacs.ehelp(%S, %s)" -;; symbol python-imports) -;; "*Help*" (py-proc) nil nil)) - -(add-to-list 'debug-ignored-errors "^No symbol") - -(defun python-send-receive (string) - "Send STRING to inferior Python (if any) and return result. -The result is what follows `_emacs_out' in the output. -This is a no-op if `python-check-comint-prompt' returns nil." - (py-send-string string) - (let ((proc (py-proc))) - (with-current-buffer (process-buffer proc) - (when (python-check-comint-prompt proc) - (set (make-local-variable 'python-preoutput-result) nil) - (while (progn - (accept-process-output proc 5) - (null python-preoutput-result))) - (prog1 python-preoutput-result - (kill-local-variable 'python-preoutput-result)))))) - -(defun python-check-comint-prompt (&optional proc) - "Return non-nil if and only if there's a normal prompt in the inferior buffer. -If there isn't, it's probably not appropriate to send input to return Eldoc -information etc. If PROC is non-nil, check the buffer for that process." - (with-current-buffer (process-buffer (or proc (py-proc))) - (save-excursion - (save-match-data - (re-search-backward (concat python--prompt-regexp " *\\=") - nil t))))) - -;; Fixme: Is there anything reasonable we can do with random methods? -;; (Currently only works with functions.) -(defun python-eldoc-function () - "`eldoc-documentation-function' for Python. -Only works when point is in a function name, not its arg list, for -instance. Assumes an inferior Python is running." - (let ((symbol (with-syntax-table python-dotty-syntax-table - (current-word)))) - ;; This is run from timers, so inhibit-quit tends to be set. - (with-local-quit - ;; First try the symbol we're on. - (or (and symbol - (py-send-receive (format "emacs.eargs(%S, %s)" - symbol python-imports))) - ;; Try moving to symbol before enclosing parens. - (let ((s (syntax-ppss))) - (unless (zerop (car s)) - (when (eq ?\( (char-after (nth 1 s))) - (save-excursion - (goto-char (nth 1 s)) - (skip-syntax-backward "-") - (let ((point (point))) - (skip-chars-backward "a-zA-Z._") - (if (< (point) point) - (python-send-receive - (format "emacs.eargs(%S, %s)" - (buffer-substring-no-properties (point) point) - python-imports)))))))))))) - -;;; Info-look functionality. - -(declare-function info-lookup-maybe-add-help "info-look" (&rest arg)) - -(defun python-after-info-look () - "Set up info-look for Python. -Used with `eval-after-load'." - (let* ((version (let ((s (shell-command-to-string (concat py-shell-name - " -V")))) - (string-match "^Python \\([0-9]+\\.[0-9.]+\\_>\\)" s) - (match-string 1 s))) - ;; Whether info files have a Python version suffix, e.g. in Debian. - (versioned - (with-temp-buffer - (with-no-warnings (Info-mode)) - (condition-case () - ;; Don't use `info' because it would pop-up a *info* buffer. - (with-no-warnings - (Info-goto-node (format "(python%s-lib)Miscellaneous Index" - version)) - t) - (error nil))))) - (info-lookup-maybe-add-help - :mode 'python-mode - :regexp "[[:alnum:]_]+" - :doc-spec - ;; Fixme: Can this reasonably be made specific to indices with - ;; different rules? Is the order of indices optimal? - ;; (Miscellaneous in -ref first prefers lookup of keywords, for - ;; instance.) - (if versioned - ;; The empty prefix just gets us highlighted terms. - `((,(concat "(python" version "-ref)Miscellaneous Index") nil "") - (,(concat "(python" version "-ref)Module Index" nil "")) - (,(concat "(python" version "-ref)Function-Method-Variable Index" - nil "")) - (,(concat "(python" version "-ref)Class-Exception-Object Index" - nil "")) - (,(concat "(python" version "-lib)Module Index" nil "")) - (,(concat "(python" version "-lib)Class-Exception-Object Index" - nil "")) - (,(concat "(python" version "-lib)Function-Method-Variable Index" - nil "")) - (,(concat "(python" version "-lib)Miscellaneous Index" nil ""))) - '(("(python-ref)Miscellaneous Index" nil "") - ("(python-ref)Module Index" nil "") - ("(python-ref)Function-Method-Variable Index" nil "") - ("(python-ref)Class-Exception-Object Index" nil "") - ("(python-lib)Module Index" nil "") - ("(python-lib)Class-Exception-Object Index" nil "") - ("(python-lib)Function-Method-Variable Index" nil "") - ("(python-lib)Miscellaneous Index" nil "")))))) -(eval-after-load "info-look" '(python-after-info-look)) - -;;;; Miscellany. - -;; Called from `python-mode', this causes a recursive call of the -;; mode. See logic there to break out of the recursion. -(defun python-maybe-jython () - "Invoke `jython-mode' if the buffer appears to contain Jython code. -The criterion is either a match for `jython-mode' via -`interpreter-mode-alist' or an import of a module from the list -`python-jython-packages'." - ;; The logic is taken from python-mode.el. - (save-excursion - (save-restriction - (widen) - (goto-char (point-min)) - (let ((interpreter (if (looking-at auto-mode-interpreter-regexp) - (match-string 2)))) - (if (and interpreter (eq 'jython-mode - (cdr (assoc (file-name-nondirectory - interpreter) - interpreter-mode-alist)))) - (jython-mode) - (if (catch 'done - (while (re-search-forward - (rx bol (or "import" "from") (1+ space) - (group (1+ (not (any " \t\n."))))) - (+ (point-min) 10000) ; Probably not worth customizing. - t) - (if (member (match-string 1) python-jython-packages) - (throw 'done t)))) - (jython-mode))))))) - -(defun python-fill-paragraph (&optional justify) - "`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 -the string's indentation." - (interactive "P") - (or (fill-comment-paragraph justify) - (save-excursion - (end-of-line) - (let* ((syntax (syntax-ppss)) - (orig (point)) - start end) - (cond ((nth 4 syntax) ; comment. fixme: loses with trailing one - (let (fill-paragraph-function) - (fill-paragraph justify))) - ;; The `paragraph-start' and `paragraph-separate' - ;; variables don't allow us to delimit the last - ;; paragraph in a multi-line string properly, so narrow - ;; to the string and then fill around (the end of) the - ;; current line. - ((eq t (nth 3 syntax)) ; in fenced string - (goto-char (nth 8 syntax)) ; string start - (setq start (line-beginning-position)) - (setq end (condition-case () ; for unbalanced quotes - (progn (forward-sexp) - (- (point) 3)) - (error (point-max))))) - ((re-search-backward "\\s|\\s-*\\=" nil t) ; end of fenced string - (forward-char) - (setq end (point)) - (condition-case () - (progn (backward-sexp) - (setq start (line-beginning-position))) - (error nil)))) - (when end - (save-restriction - (narrow-to-region start end) - (goto-char orig) - ;; Avoid losing leading and trailing newlines in doc - ;; strings written like: - ;; """ - ;; ... - ;; """ - (let ((paragraph-separate - ;; Note that the string could be part of an - ;; expression, so it can have preceding and - ;; trailing non-whitespace. - (concat - (rx (or - ;; Opening triple quote without following text. - (and (* nonl) - (group (syntax string-delimiter)) - (repeat 2 (backref 1)) - ;; Fixme: Not sure about including - ;; trailing whitespace. - (* (any " \t")) - eol) - ;; Closing trailing quote without preceding text. - (and (group (any ?\" ?')) (backref 2) - (syntax string-delimiter)))) - "\\(?:" paragraph-separate "\\)")) - fill-paragraph-function) - (fill-paragraph justify))))))) t) - -(defun python-shift-left (start end &optional count) - "Shift lines in region COUNT (the prefix arg) columns to the left. -COUNT defaults to `py-indent-offset'. If region isn't active, just shift -current line. The region shifted includes the lines in which START and -END lie. It is an error if any lines in the region are indented less than -COUNT columns." - (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 py-indent-offset)) - (when (> count 0) - (save-excursion - (goto-char start) - (while (< (point) end) - (if (and (< (current-indentation) count) - (not (looking-at "[ \t]*$"))) - (error "Can't shift all lines enough")) - (forward-line)) - (indent-rigidly start end (- count))))) - -(add-to-list 'debug-ignored-errors "^Can't shift all lines enough") - -(defun python-shift-right (start end &optional count) - "Shift lines in region COUNT (the prefix arg) columns to the right. -COUNT defaults to `py-indent-offset'. If region isn't active, just shift -current line. The region shifted includes the lines in which START and -END lie." - (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 py-indent-offset)) - (indent-rigidly start end count)) - -(defun python-outline-level () - "`outline-level' function for Python mode. -The level is the number of `py-indent-offset' steps of indentation -of current line." - (1+ (/ (current-indentation) py-indent-offset))) - -;; Fixme: Consider top-level assignments, imports, &c. -(defun python-current-defun (&optional length-limit) - "`add-log-current-defun-function' for Python." - (save-excursion - ;; Move up the tree of nested `class' and `def' blocks until we - ;; get to zero indentation, accumulating the defined names. - (let ((accum) - (length -1)) - (catch 'done - (while (or (null length-limit) - (null (cdr accum)) - (< length length-limit)) - (let ((started-from (point))) - (python-beginning-of-block) - (end-of-line) - (beginning-of-defun) - (when (= (point) started-from) - (throw 'done nil))) - (when (looking-at (rx (0+ space) (or "def" "class") (1+ space) - (group (1+ (or word (syntax symbol)))))) - (push (match-string 1) accum) - (setq length (+ length 1 (length (car accum))))) - (when (= (current-indentation) 0) - (throw 'done nil)))) - (when accum - (when (and length-limit (> length length-limit)) - (setcar accum "..")) - (mapconcat 'identity accum "."))))) - -(defun python-mark-block () - "Mark the block around point. -Uses `python-beginning-of-block', `python-end-of-block'." - (interactive) - (push-mark) - (python-beginning-of-block) - (push-mark (point) nil t) - (python-end-of-block) - (exchange-point-and-mark)) - -;; Fixme: Provide a find-function-like command to find source of a -;; definition (separate from BicycleRepairMan). Complicated by -;; finding the right qualified name. - -;;;; Completion. - -;; http://lists.gnu.org/archive/html/bug-gnu-emacs/2008-01/msg00076.html -(defvar python-imports "None" - "String of top-level import statements updated by `python-find-imports'.") -(make-variable-buffer-local 'python-imports) - -;; Fixme: Should font-lock try to run this when it deals with an import? -;; Maybe not a good idea if it gets run multiple times when the -;; statement is being edited, and is more likely to end up with -;; something syntactically incorrect. -;; However, what we should do is to trundle up the block tree from point -;; to extract imports that appear to be in scope, and add those. -(defun python-find-imports () - "Find top-level imports, updating `python-imports'." - (interactive) - (save-excursion - (let (lines) - (goto-char (point-min)) - (while (re-search-forward "^import\\_>\\|^from\\_>" nil t) - (unless (syntax-ppss-context (syntax-ppss)) - (let ((start (line-beginning-position))) - ;; Skip over continued lines. - (while (and (eq ?\\ (char-before (line-end-position))) - (= 0 (forward-line 1))) - t) - (push (buffer-substring start (line-beginning-position 2)) - lines)))) - (setq python-imports - (if lines - (apply #'concat - ;; This is probably best left out since you're unlikely to need the - ;; doc for a function in the buffer and the import will lose if the - ;; Python sub-process' working directory isn't the same as the - ;; buffer's. - ;; (if buffer-file-name - ;; (concat - ;; "import " - ;; (file-name-sans-extension - ;; (file-name-nondirectory buffer-file-name)))) - (nreverse lines)) - "None")) - (when lines - (set-text-properties 0 (length python-imports) nil python-imports) - ;; The output ends up in the wrong place if the string we - ;; send contains newlines (from the imports). - (setq python-imports - (replace-regexp-in-string "\n" "\\n" - (format "%S" python-imports) t t)))))) - -(defun python-completion-at-point () - (let ((end (point)) - (start (save-excursion - (and (re-search-backward - (rx (or buffer-start (regexp "[^[:alnum:]._]")) - (group (1+ (regexp "[[:alnum:]._]"))) point) - nil t) - (match-beginning 1))))) - (when start - (list start end - (completion-table-dynamic 'python-symbol-completions))))) - -;;; FFAP support - -(defun python-module-path (module) - "Function for `ffap-alist' to return path to MODULE." - (python-send-receive (format "emacs.modpath (%S)" module))) - -(eval-after-load "ffap" - '(push '(python-mode . python-module-path) ffap-alist)) - -;;;; Find-function support - -;; Fixme: key binding? - -(defun python-find-function (name) - "Find source of definition of function NAME. -Interactively, prompt for name." - (interactive - (let ((symbol (with-syntax-table python-dotty-syntax-table - (current-word))) - (enable-recursive-minibuffers t)) - (list (read-string (if symbol - (format "Find location of (default %s): " symbol) - "Find location of: ") - nil nil symbol)))) - (unless python-imports - (error "Not called from buffer visiting Python file")) - (let* ((loc (python-send-receive (format "emacs.location_of (%S, %s)" - name python-imports))) - (loc (car (read-from-string loc))) - (file (car loc)) - (line (cdr loc))) - (unless file (error "Don't know where `%s' is defined" name)) - (pop-to-buffer (find-file-noselect file)) - (when (integerp line) - (goto-char (point-min)) - (forward-line (1- line))))) - -;;; -(defvar py-mode-syntax-table nil) -(setq py-mode-syntax-table - (let ((table (make-syntax-table)) - (tablelookup (if (featurep 'xemacs) - 'get-char-table - 'aref))) - ;; Give punctuation syntax to ASCII that normally has symbol - ;; syntax or has word syntax and isn't a letter. - (if (featurep 'xemacs) - (setq table (standard-syntax-table)) - (let ((symbol (string-to-syntax "_")) - ;; (symbol (string-to-syntax "_")) - (sst (standard-syntax-table))) - (dotimes (i 128) - (unless (= i ?_) - (if (equal symbol (funcall tablelookup sst i)) - (modify-syntax-entry i "." table)))))) - (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) - (modify-syntax-entry ?\_ "w" table) - table)) - -(defvar py-help-mode-syntax-table - (let ((st (make-syntax-table py-mode-syntax-table))) - ;; Don't get confused by apostrophes in the process's output (e.g. if - ;; you execute "help(os)"). - (modify-syntax-entry ?\' "." st) - ;; Maybe we should do the same for double quotes? - (modify-syntax-entry ?\" "." st) - st)) - -(defconst py-space-backslash-table - (let ((table (copy-syntax-table py-mode-syntax-table))) - (modify-syntax-entry ?\\ " " table) - table) - "`py-mode-syntax-table' with backslash given whitespace syntax.") - -;; have to bind py-file-queue before installing the kill-emacs-hook -(defvar py-file-queue nil - "Queue of Python temp files awaiting execution. -Currently-active file is at the head of the list.") - -(defvar python-mode-abbrev-table nil) -(define-abbrev-table 'python-mode-abbrev-table ()) - -(defvar inferior-python-mode-abbrev-table nil - "Not in use.") -(define-abbrev-table 'inferior-python-mode-abbrev-table ()) - -;; pdbtrack constants -(defconst py-pdbtrack-stack-entry-regexp - (concat ".*\\("py-shell-input-prompt-1-regexp">\\|>\\) *\\(.*\\)(\\([0-9]+\\))\\([?a-zA-Z0-9_<>()]+\\)()") - "Regular expression pdbtrack uses to find a stack trace entry.") - -;; ipython.el -;; Recognize the ipython pdb, whose prompt is 'ipdb>' or 'ipydb>' -;;instead of '(Pdb)' -(defvar py-pdbtrack-input-prompt) -(setq py-pdbtrack-input-prompt "^[(<]*[Ii]?[Pp]y?db[>)]+ ") -(defvar py-pydbtrack-input-prompt) -(setq py-pydbtrack-input-prompt "^[(]*ipydb[>)]+ ") - -;; pydb-328837.diff -;; (defconst py-pydbtrack-stack-entry-regexp -;; "^(\\([-a-zA-Z0-9_/.]*\\):\\([0-9]+\\)):[ \t]?\\(.*\n\\)" -;; "Regular expression pdbtrack uses to find a stack trace entry for pydb. -;; -;; The debugger outputs program-location lines that look like this: -;; (/usr/bin/zonetab2pot.py:15): makePOT") - -(defconst py-pdbtrack-marker-regexp-file-group 2 - "Group position in gud-pydb-marker-regexp that matches the file name.") - -(defconst py-pdbtrack-marker-regexp-line-group 3 - "Group position in gud-pydb-marker-regexp that matches the line number.") - -(defconst py-pdbtrack-marker-regexp-funcname-group 4 - "Group position in gud-pydb-marker-regexp that matches the function name.") - -(defconst py-pdbtrack-track-range 10000 - "Max number of characters from end of buffer to search for stack entry.") - -(defvar py-pdbtrack-is-tracking-p nil) - -;;; Bindings -(add-to-list 'auto-mode-alist (cons (purecopy "\\.py\\'") 'python-mode)) -(add-to-list 'interpreter-mode-alist (cons (purecopy "python") 'python-mode)) -(add-to-list 'interpreter-mode-alist (cons (purecopy "jython") 'jython-mode)) -(add-to-list 'same-window-buffer-names (purecopy "*Python*")) - -(defconst python-font-lock-syntactic-keywords - ;; Make outer chars of matching triple-quote sequences into generic - ;; string delimiters. Fixme: Is there a better way? - ;; First avoid a sequence preceded by an odd number of backslashes. - `((,(concat "\\(?:^\\|[^\\]\\(?:\\\\.\\)*\\)" ;Prefix. - "\\(?1:\"\\)\\(?2:\"\\)\\(?3:\"\\)\\(?4:\"\\)\\(?5:\"\\)\\(?6:\"\\)\\|\\(?1:\"\\)\\(?2:\"\\)\\(?3:\"\\)\\|\\('\\)\\('\\)\\('\\)\\|\\('\\)\\('\\)\\('\\)\\('\\)\\('\\)\\('\\)") - (1 (python-quote-syntax 1) t t) - (2 (python-quote-syntax 2) t t) - (3 (python-quote-syntax 3) t t) - (6 (python-quote-syntax 1) t t)) - ;; This doesn't really help. - ;; (,(rx (and ?\\ (group ?\n))) (1 " ")) - )) - -(defun python-quote-syntax (n) - "Put `syntax-table' property correctly on triple quote. -Used for syntactic keywords. N is the match number (1, 2 or 3)." - ;; Given a triple quote, we have to check the context to know - ;; whether this is an opening or closing triple or whether it's - ;; quoted anyhow, and should be ignored. (For that we need to do - ;; the same job as `syntax-ppss' to be correct and it seems to be OK - ;; to use it here despite initial worries.) We also have to sort - ;; out a possible prefix -- well, we don't _have_ to, but I think it - ;; should be treated as part of the string. - - ;; Test cases: - ;; ur"""ar""" x='"' # """ - ;; x = ''' """ ' a - ;; ''' - ;; x '"""' x """ \"""" x - (save-excursion - (goto-char (match-beginning 0)) - (cond - ;; Consider property for the last char if in a fenced string. - ((= n 3) - (let* ((font-lock-syntactic-keywords nil) - (syntax (syntax-ppss))) - (when (eq t (nth 3 syntax)) ; after unclosed fence - (goto-char (nth 8 syntax)) ; fence position - ;; (skip-chars-forward "uUrR") ; skip any prefix - ;; Is it a matching sequence? - (if (eq (char-after) (char-after (match-beginning 2))) - (eval-when-compile (string-to-syntax "|")))))) - ;; Consider property for initial char, accounting for prefixes. - ((or (and (= n 2) ; leading quote (not prefix) - (not (match-end 1))) ; prefix is null - (and (= n 1) ; prefix - (match-end 1))) ; non-empty - (let ((font-lock-syntactic-keywords nil)) - (unless (eq 'string (syntax-ppss-context (syntax-ppss))) - (eval-when-compile (string-to-syntax "|"))))) - ;; Otherwise (we're in a non-matching string) the property is - ;; nil, which is OK. - ))) - - -;;; Keymap and syntax - -(defvar py-shell-map nil - "Keymap used in *Python* shell buffers.") - -;; used by py-completion-at-point, the way of python.el -(defvar python-shell-map - (let ((map (copy-keymap comint-mode-map))) - (define-key map [tab] 'py-shell-complete) - (define-key map "\C-c-" 'py-up-exception) - (define-key map "\C-c=" 'py-down-exception) - map) - "Keymap used in *Python* shell buffers.") - -;;; Intern -(defun py-point (position) - "Returns the value of point at certain commonly referenced POSITIONs. -POSITION can be one of the following symbols: - - bol -- beginning of line - eol -- end of line - bod -- beginning of def or class - eod -- end of def or class - bob -- beginning of buffer - eob -- end of buffer - boi -- back to indentation - bos -- beginning of statement - -This function does not modify point or mark." - (let (erg) - (save-excursion - (setq erg - (progn - (cond - ((eq position 'bol) (beginning-of-line)) - ((eq position 'eol) (end-of-line)) - ((eq position 'bod) (py-beginning-of-def-or-class)) - ((eq position 'eod) (py-end-of-def-or-class)) - ;; Kind of funny, I know, but useful for py-up-exception. - ((eq position 'bob) (goto-char (point-min))) - ((eq position 'eob) (goto-char (point-max))) - ((eq position 'boi) (back-to-indentation)) - ((eq position 'bos) (py-beginning-of-statement)) - (t (error "Unknown buffer position requested: %s" position))) (point)))) - erg)) - - -;;; Font-lock and syntax -(defun python-info-ppss-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." - (let ((ppss (or syntax-ppss (syntax-ppss)))) - (cond ((eq type 'comment) - (and (nth 4 ppss) - (nth 8 ppss))) - ((eq type 'string) - (nth 8 ppss)) - ((eq type 'paren) - (nth 1 ppss)) - (t nil)))) - -(defvar python-font-lock-keywords nil - "Additional expressions to highlight in Python mode.") - -(setq python-font-lock-keywords - ;; Keywords - `(,(rx symbol-start - (or "and" "del" "from" "not" "while" "as" "elif" "global" "or" "with" - "assert" "else" "if" "pass" "yield" "break" "import" - "print" "exec" "in" "continue" "finally" "is" - "return" "def" "for" "lambda" "try") - symbol-end) - ;; functions - (,(rx symbol-start "def" (1+ space) (group (1+ (or word ?_)))) - (1 font-lock-function-name-face)) - ;; classes - (,(rx symbol-start (group "class") (1+ space) (group (1+ (or word ?_)))) - (1 font-lock-keyword-face) (2 py-class-name-face)) - (,(rx symbol-start - (or "raise" "except") - symbol-end) . py-exception-name-face) - ;; already pseudo-keyword - ;; (,(rx symbol-start - ;; (or "None" "True" "False" "__debug__" "NotImplemented") - ;; symbol-end) . font-lock-constant-face) - (,(rx symbol-start - (or "cls" "self" "cls" "Ellipsis" "True" "False" "None" "__debug__" "NotImplemented") - symbol-end) . py-pseudo-keyword-face) - ;; Decorators. - (,(rx line-start (* (any " \t")) (group "@" (1+ (or word ?_)) - (0+ "." (1+ (or word ?_))))) - (1 py-decorators-face)) - ;; '("\\_<raise[ \t]+\\([a-zA-Z_]+[a-zA-Z0-9_.]*\\)" 1 py-exception-name-face) - ;; '("[ \t]*\\(_\\{0,2\\}[a-zA-Z][a-zA-Z_0-9.]+_\\{0,2\\}\\) *\\(+\\|-\\|*\\|*\\*\\|/\\|//\\|&\\|%\\||\\|\\^\\|>>\\|<<\\)? ?=[^=\n]" - ;; Builtin Exceptions - (,(rx symbol-start - (or "ArithmeticError" "AssertionError" "AttributeError" - "BaseException" "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" "StandardError" "StopIteration" "SyntaxError" - "SyntaxWarning" "SystemError" "SystemExit" "TabError" "TypeError" - "UnboundLocalError" "UnicodeDecodeError" "UnicodeEncodeError" - "UnicodeError" "UnicodeTranslateError" "UnicodeWarning" - "UserWarning" "ValueError" "Warning" "ZeroDivisionError") - symbol-end) . py-exception-name-face) - ;; (,(rx (or space line-start) symbol-start "range - ;; Builtins - (,(rx (or space line-start) symbol-start - (or "_" "__doc__" "__import__" "__name__" "__package__" "abs" "all" - "any" "apply" "basestring" "bin" "bool" "buffer" "bytearray" - "bytes" "callable" "chr" "classmethod" "cmp" "coerce" "compile" - "complex" "delattr" "dict" "dir" "divmod" "enumerate" "eval" - "execfile" "file" "filter" "float" "format" "frozenset" - "getattr" "globals" "hasattr" "hash" "help" "hex" "id" "input" - "int" "intern" "isinstance" "issubclass" "iter" "len" "list" - "locals" "long" "map" "max" "min" "next" "object" "oct" "open" - "ord" "pow" "print" "property" "range" "raw_input" "reduce" - "reload" "repr" "reversed" "round" "set" "setattr" "slice" - "sorted" "staticmethod" "str" "sum" "super" "tuple" "type" - "unichr" "unicode" "vars" "xrange" "zip") - symbol-end) . py-builtins-face) - ;; '("[ \t]*\\(_\\{0,2\\}[a-zA-Z][a-zA-Z_0-9.]+_\\{0,2\\}\\) *\\(+\\|-\\|*\\|*\\*\\|/\\|//\\|&\\|%\\||\\|\\^\\|>>\\|<<\\)? ?=[^=\n]" - ;; 1 py-variable-name-face) - (,(python-rx line-start (* (any " \t"))(group (** 0 2 "_") word (0+ (or word ?_))(** 0 2 "_"))(* (any " \t")) assignment-operator) - 1 py-variable-name-face) - ;; asignations - ;; support for a = b = c = 5 - (,(lambda (limit) - (let ((re (python-rx (group (+ (any word ?. ?_))) - (? ?\[ (+ (not (any ?\]))) ?\]) (* space) - assignment-operator))) - (when (re-search-forward re limit t) - (while (and (python-info-ppss-context 'paren) - (re-search-forward re limit t))) - (if (and (not (python-info-ppss-context 'paren)) - (not (equal (char-after (point-marker)) ?=))) - t - (set-match-data nil))))) - (1 py-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) - assignment-operator))) - (when (and (re-search-forward re limit t) - (goto-char (nth 3 (match-data)))) - (while (and (python-info-ppss-context 'paren) - (re-search-forward re limit t)) - (goto-char (nth 3 (match-data)))) - (if (not (python-info-ppss-context 'paren)) - t - (set-match-data nil))))) - (1 py-variable-name-face nil nil)) - ;; (,(rx (or space line-start) symbol-start "range" symbol-end) . py-builtins-face) - ;; Numbers - (,(rx symbol-start (or (1+ digit) (1+ hex-digit)) symbol-end) . py-number-face))) - -(defconst py-font-lock-syntactic-keywords - '(("[^\\]\\\\\\(?:\\\\\\\\\\)*\\(\\s\"\\)\\1\\(\\1\\)" - (2 - (7))) - ("\\([RUBrub]?\\)[Rr]?\\(\\s\"\\)\\2\\(\\2\\)" - (1 - (py-quote-syntax 1)) - (2 - (py-quote-syntax 2)) - (3 - (py-quote-syntax 3))))) - -(defun py-quote-syntax (n) - "Put `syntax-table' property correctly on triple quote. -Used for syntactic keywords. N is the match number (1, 2 or 3)." - ;; Given a triple quote, we have to check the context to know - ;; whether this is an opening or closing triple or whether it's - ;; quoted anyhow, and should be ignored. (For that we need to do - ;; the same job as `syntax-ppss' to be correct and it seems to be OK - ;; to use it here despite initial worries.) We also have to sort - ;; out a possible prefix -- well, we don't _have_ to, but I think it - ;; should be treated as part of the string. - ;; Test cases: - ;; ur"""ar""" x='"' # """ - ;; x = ''' """ ' a - ;; ''' - ;; x '"""' x """ \"""" x - (save-excursion - (goto-char (match-beginning 0)) - (cond - ;; Consider property for the last char if in a fenced string. - ((= n 3) - (let* ((font-lock-syntactic-keywords nil) - (syntax (if (featurep 'xemacs) - (parse-partial-sexp (point-min) (point)) - (syntax-ppss)))) - (when (eq t (nth 3 syntax)) ; after unclosed fence - (goto-char (nth 8 syntax)) ; fence position - (skip-chars-forward "uUrRbB") ; skip any prefix - ;; Is it a matching sequence? - (if (eq (char-after) (char-after (match-beginning 2))) - (eval-when-compile (string-to-syntax "|")))))) - ;; Consider property for initial char, accounting for prefixes. - ((or (and (= n 2) ; leading quote (not prefix) - (= (match-beginning 1) (match-end 1))) ; prefix is null - (and (= n 1) ; prefix - (/= (match-beginning 1) (match-end 1)))) ; non-empty - (let ((font-lock-syntactic-keywords nil)) - (unless (eq 'string (syntax-ppss-context (if (featurep 'xemacs) - (parse-partial-sexp (point-min) (point)) - (syntax-ppss)))) - ;; (eval-when-compile (string-to-syntax "|")) - (eval-when-compile (string-to-syntax "|"))))) - ;; Otherwise (we're in a non-matching string) the property is - ;; nil, which is OK. - ))) - -(defconst python-dotty-syntax-table - (let ((table (make-syntax-table))) - (set-char-table-parent table py-mode-syntax-table) - (modify-syntax-entry ?. "_" table) - table) - "Syntax table giving `.' symbol syntax. -Otherwise inherits from `py-mode-syntax-table'.") - -;; An auxiliary syntax table which places underscore and dot in the -;; symbol class for simplicity -(defvar py-dotted-expression-syntax-table - (let ((table (make-syntax-table python-mode-syntax-table))) - (modify-syntax-entry ?_ "_" table) - (modify-syntax-entry ?. "_" table) - table) - "Syntax table used to identify Python dotted expressions.") - -;; credits to python.el -(defun py-beg-of-defun-function () - (set (make-local-variable 'beginning-of-defun-function) - 'py-beginning-of-def-or-class)) - -(defun py-end-of-defun-function () - (set (make-local-variable 'end-of-defun-function) 'py-end-of-def-or-class)) - -(make-obsolete-variable 'jpython-mode-hook 'jython-mode-hook nil) -(defvar jython-mode-hook nil - "*Hook called by `jython-mode'. `jython-mode' also calls -`python-mode-hook'.") - -(defvar py-shell-hook nil - "*Hook called by `py-shell'.") - -;; In previous version of python-mode.el, the hook was incorrectly -;; called py-mode-hook, and was not defvar'd. Deprecate its use. -(and (fboundp 'make-obsolete-variable) - (make-obsolete-variable 'py-mode-hook 'python-mode-hook nil)) - -(defvar py-keywords "\\_<\\(ArithmeticError\\|AssertionError\\|AttributeError\\|BaseException\\|BufferError\\|BytesWarning\\|DeprecationWarning\\|EOFError\\|Ellipsis\\|EnvironmentError\\|Exception\\|False\\|FloatingPointError\\|FutureWarning\\|GeneratorExit\\|IOError\\|ImportError\\|ImportWarning\\|IndentationError\\|IndexError\\|KeyError\\|KeyboardInterrupt\\|LookupError\\|MemoryError\\|NameError\\|NoneNotImplementedError\\|NotImplemented\\|OSError\\|OverflowError\\|PendingDeprecationWarning\\|ReferenceError\\|RuntimeError\\|RuntimeWarning\\|StandardError\\|StopIteration\\|SyntaxError\\|SyntaxWarning\\|SystemError\\|SystemExit\\|TabError\\|True\\|TypeError\\|UnboundLocalError\\|UnicodeDecodeError\\|UnicodeEncodeError\\|UnicodeError\\|UnicodeTranslateError\\|UnicodeWarning\\|UserWarning\\|ValueError\\|Warning\\|ZeroDivisionError\\|__debug__\\|__import__\\|__name__\\|abs\\|all\\|and\\|any\\|apply\\|as\\|assert\\|basestring\\|bin\\|bool\\|break\\|buffer\\|bytearray\\|callable\\|chr\\|class\\|classmethod\\|cmp\\|coerce\\|compile\\|complex\\|continue\\|copyright\\|credits\\|def\\|del\\|delattr\\|dict\\|dir\\|divmod\\|elif\\|else\\|enumerate\\|eval\\|except\\|exec\\|execfile\\|exit\\|file\\|filter\\|float\\|for\\|format\\|from\\|getattr\\|global\\|globals\\|hasattr\\|hash\\|help\\|hex\\|id\\|if\\|import\\|in\\|input\\|int\\|intern\\|is\\|isinstance\\|issubclass\\|iter\\|lambda\\|len\\|license\\|list\\|locals\\|long\\|map\\|max\\|memoryview\\|min\\|next\\|not\\|object\\|oct\\|open\\|or\\|ord\\|pass\\|pow\\|print\\|property\\|quit\\|raise\\|range\\|raw_input\\|reduce\\|reload\\|repr\\|return\\|round\\|set\\|setattr\\|slice\\|sorted\\|staticmethod\\|str\\|sum\\|super\\|tuple\\|type\\|unichr\\|unicode\\|vars\\|while\\|with\\|xrange\\|yield\\|zip\\|\\)\\_>" - "Contents like py-fond-lock-keyword") - -(defun py-insert-default-shebang () - "Insert in buffer shebang of installed default Python. " - (interactive "*") - (let* ((erg (if py-edit-only-p - py-shell-name - (executable-find py-shell-name))) - (sheb (concat "#! " erg))) - (insert sheb))) - -(defun py-electric-comment (arg) - "Insert a comment. If starting a comment, indent accordingly. - -If a numeric argument ARG is provided, that many colons are inserted -non-electrically. -With \\[universal-argument] \"#\" electric behavior is inhibited inside a string or comment." - (interactive "*P") - (if (and py-indent-comments py-electric-comment-p) - (if (ignore-errors (eq 4 (car-safe arg))) - (insert "#") - (when (and (eq last-command 'py-electric-comment) (looking-back " ")) - (forward-char -1)) - (if (interactive-p) (self-insert-command (prefix-numeric-value arg)) - (insert "#")) - (let ((orig (copy-marker (point))) - (indent (py-compute-indentation))) - (unless - ;; (or - (eq (current-indentation) indent) - ;; (looking-back "#[ \t]*")) - (goto-char orig) - (beginning-of-line) - (delete-horizontal-space) - (indent-to indent) - (goto-char orig)) - (when py-electric-comment-add-space-p - (unless (looking-at "[ \t]") - (insert " ")))) - (setq last-command this-command)) - (self-insert-command (prefix-numeric-value arg)))) - -(defun py-electric-colon (arg) - "Insert a colon and indent accordingly. - -If a numeric argument ARG is provided, that many colons are inserted -non-electrically. - -Electric behavior is inhibited inside a string or -comment or by universal prefix C-u. -Default is nil, controlled by `py-electric-colon-active-p'" - (interactive "*P") - (cond ((not py-electric-colon-active-p) - (self-insert-command (prefix-numeric-value arg))) - ((eq 4 (prefix-numeric-value arg)) - (self-insert-command 1)) - (t (self-insert-command (prefix-numeric-value arg)) - (unless (py-in-string-or-comment-p) - (let ((orig (copy-marker (point))) - (indent (py-compute-indentation))) - (unless (or (eq (current-indentation) indent) - (and (py-top-level-form-p)(< (current-indentation) indent))) - (beginning-of-line) - (delete-horizontal-space) - (indent-to indent)) - (goto-char orig)))))) - -(defun py-top-level-form-p () - "Return non-nil, if line starts with a top level definition. - -Used by `py-electric-colon', which will not indent than. " - (let (erg) - (save-excursion - (beginning-of-line) - (setq erg (or (looking-at py-class-re) - (looking-at py-def-re)))) - erg)) - - -;; Electric deletion -(defun py-electric-backspace (&optional arg) - "Delete preceding character or level of indentation. - -With ARG do that ARG times. -Returns column reached. " - (interactive "*p") - (let ((arg (or arg 1)) - erg) - (dotimes (i arg) - (if (looking-back "^[ \t]+") - (let* ((remains (% (current-column) py-indent-offset))) - (if (< 0 remains) - (delete-char (- remains)) - (indent-line-to (- (current-indentation) py-indent-offset)))) - (delete-char (- 1)))) - (setq erg (current-column)) - (when (and (interactive-p) py-verbose-p) (message "%s" erg)) - erg)) - -(defun py-electric-delete (&optional arg) - "Delete following character or levels of whitespace. - -With ARG do that ARG times. " - (interactive "*p") - (let ((arg (or arg 1))) - (dotimes (i arg) - (if (and (or (bolp)(looking-back "^[ \t]+")) (looking-at "[ \t]+")) - (let* ((remains (% (+ (current-column) (- (match-end 0)(match-beginning 0))) py-indent-offset))) - (if (< 0 remains) - (delete-char remains) - (delete-char py-indent-offset))) - (delete-char 1))))) - -;; (defun py-electric-delete (arg) -;; "Delete preceding or following character or levels of whitespace. -;; -;; The behavior of this function depends on the variable -;; `delete-key-deletes-forward'. If this variable is nil (or does not -;; exist, as in older Emacsen and non-XEmacs versions), then this -;; function behaves identically to \\[c-electric-backspace]. -;; -;; If `delete-key-deletes-forward' is non-nil and is supported in your -;; Emacs, then deletion occurs in the forward direction, by calling the -;; function in `py-delete-function'. -;; -;; \\[universal-argument] (programmatically, argument ARG) specifies the -;; number of characters to delete (default is 1)." -;; (interactive "*p") -;; (if (or (and (fboundp 'delete-forward-p) ;XEmacs 21 -;; (delete-forward-p)) -;; (and (boundp 'delete-key-deletes-forward) ;XEmacs 20 -;; delete-key-deletes-forward)) -;; (funcall py-delete-function arg) -;; (py-electric-backspace arg))) - -;; required for pending-del and delsel modes -(put 'py-electric-colon 'delete-selection t) ;delsel -(put 'py-electric-colon 'pending-delete t) ;pending-del -(put 'py-electric-backspace 'delete-selection 'supersede) ;delsel -(put 'py-electric-backspace 'pending-delete 'supersede) ;pending-del -(put 'py-electric-delete 'delete-selection 'supersede) ;delsel -(put 'py-electric-delete 'pending-delete 'supersede) ;pending-del - - -(defun py-indent-line-outmost (&optional arg) - "Indent the current line to the outmost reasonable indent. - -With optional \\[universal-argument] an indent with length `py-indent-offset' is inserted unconditionally " - (interactive "*P") - (let* ((need (py-compute-indentation (point))) - (cui (current-indentation)) - (cuc (current-column))) - (cond ((eq 4 (prefix-numeric-value arg)) - (insert (make-string py-indent-offset ?\ ))) - (t - (if (and (eq need cui)(not (eq cuc cui))) - (back-to-indentation) - (beginning-of-line) - (delete-horizontal-space) - (indent-to need)))))) - -(defvar py-indent-line-indent nil - "Used internal by `py-indent-line'") - -(defun py-indent-line-intern (need cui) - (if py-tab-indent - (cond ((eq need cui) - (when (eq this-command last-command) - (beginning-of-line) - (delete-horizontal-space) - (if (<= (line-beginning-position) (+ (point) (- col cui))) - (forward-char (- col cui)) - (beginning-of-line)))) - ((< cui need) - (if (eq this-command last-command) - (progn - (beginning-of-line) - (delete-horizontal-space) - (indent-to (+ (* (/ cui py-indent-offset) py-indent-offset) py-indent-offset)) - (forward-char (- col cui))) - (beginning-of-line) - (delete-horizontal-space) - (indent-to need) - (forward-char (- col cui)))) - (t (beginning-of-line) - (delete-horizontal-space) - (indent-to need) - (if (<= (line-beginning-position) (+ (point) (- col cui))) - (forward-char (- col cui)) - (beginning-of-line)))) - (insert-tab))) - -(defun py-indent-line (&optional arg) - "Indent the current line according to Python rules. - -When called interactivly with \\[universal-argument], ignore dedenting rules for block closing statements -\(e.g. return, raise, break, continue, pass) - -An optional \\[universal-argument] followed by a numeric argument neither 1 nor 4 will switch off `py-smart-indentation' for this execution. This permits to correct allowed but unwanted indents. -Similar to `toggle-py-smart-indentation' resp. `py-smart-indentation-off' followed by TAB. - -This function is normally used by `indent-line-function' resp. -\\[indent-for-tab-command]. -Returns current indentation " - (interactive "P") - (let ((cui (current-indentation)) - (col (current-column)) - (psi py-smart-indentation) - (need (py-compute-indentation))) - (cond ((eq 4 (prefix-numeric-value arg)) - (beginning-of-line) - (delete-horizontal-space) - (indent-to (+ need py-indent-offset))) - ((not (eq 1 (prefix-numeric-value arg))) - (py-smart-indentation-off) - (py-indent-line-intern) - (setq py-smart-indentation psi)) - (t (py-indent-line-intern need cui)))) - (when (and (interactive-p) py-verbose-p)(message "%s" (current-indentation))) - (current-indentation)) - -(defun py-newline-and-indent () - "Add a newline and indent to outmost reasonable indent. -When indent is set back manually, this is honoured in following lines. " - (interactive "*") - (let ((ci (current-indentation)) - (orig (point)) - erg) - (if (< ci (current-column)) ; if point beyond indentation - (progn - (newline) - (save-excursion - (goto-char orig) (delete-trailing-whitespace)) - (setq erg (indent-to-column (py-compute-indentation)))) - (beginning-of-line) - (insert-char ?\n 1) - (insert (make-string (setq erg (py-compute-indentation)) ?\ )) - ;; (move-to-column erg) - (when (looking-at "\\([ \t]+\\)") (delete-region (match-beginning 1) (match-end 1)))) - (when (and (looking-at "[ \t]+") - (nth 1 (if (featurep 'xemacs) - (parse-partial-sexp (point-min) (point)) - (syntax-ppss)))) - (delete-region (match-beginning 0) (match-end 0))) - (when (and (interactive-p) py-verbose-p) (message "%s" erg)) - erg)) - -(defalias 'py-newline-and-close-block 'py-newline-and-dedent) -(defun py-newline-and-dedent () - "Add a newline and indent to one level below current. -Returns column. " - (interactive "*") - (let ((cui (current-indentation)) - erg) - (newline) - (when (< 0 cui) - (setq erg (- (py-compute-indentation) py-indent-offset)) - (indent-to-column erg)) - (when (and (interactive-p) py-verbose-p) (message "%s" erg)) - erg)) - -(defun toggle-force-local-shell (&optional arg) - "If locally indicated Python shell should be taken and -enforced upon sessions execute commands. - -Toggles boolean `py-force-local-shell-p' along with `py-force-py-shell-name-p' -Returns value of `toggle-force-local-shell' switched to. - -When on, kind of an option 'follow', local shell sets `py-shell-name', enforces its use afterwards. - -See also commands -`py-force-local-shell-on' -`py-force-local-shell-off' - " - (interactive (list arg)) - (let ((arg (or arg (if py-force-local-shell-p -1 1)))) - (if (< 0 arg) - (progn - (setq py-shell-name (or py-local-command (py-choose-shell))) - (setq py-force-local-shell-p t)) - (setq py-shell-name (default-value 'py-shell-name)) - (setq py-force-local-shell-p nil)) - (when (interactive-p) - (if py-force-local-shell-p - (when py-verbose-p (message "Enforce %s" py-shell-name)) - (when py-verbose-p (message "py-shell-name default restored to: %s" py-shell-name)))) - py-shell-name)) - -(defun py-force-local-shell-on () - "Make sure, `py-py-force-local-shell-p' is on. - -Returns value of `py-force-local-shell-p'. - -Kind of an option 'follow', local shell sets `py-shell-name', enforces its use afterwards " - (interactive) - (let* ((erg (toggle-force-local-shell 1))) - (when (or py-verbose-p (interactive-p)) - (message "Enforce %s" py-shell-name)))) - -(defun py-force-local-shell-off () - "Restore `py-shell-name' default value and `behaviour'. " - (interactive) - (let* ((erg (toggle-force-local-shell 1))) - (when (or py-verbose-p (interactive-p)) - (message "py-shell-name default restored to: %s" py-shell-name) - (message "Enforce %s" py-shell-name)))) - -;; toggle-force-py-shell-name-p forms -(defun toggle-force-py-shell-name-p (&optional arg) - "If customized default `py-shell-name' should be enforced upon execution. - -If `py-force-py-shell-name-p' should be on or off. -Returns value of `py-force-py-shell-name-p' switched to. - -See also commands -force-py-shell-name-p-on -force-py-shell-name-p-off - -Caveat: Completion might not work that way. -" - (interactive "p") - (let ((arg (or arg (if py-force-py-shell-name-p -1 1)))) - (if (< 0 arg) - (setq py-force-py-shell-name-p t) - (setq py-force-py-shell-name-p nil)) - (when (or py-verbose-p (interactive-p)) (message "py-force-py-shell-name-p: %s" py-force-py-shell-name-p)) - py-force-py-shell-name-p)) - -(defun force-py-shell-name-p-on (&optional arg) - "Switches `py-force-py-shell-name-p' on. - -Customized default `py-shell-name' will be enforced upon execution. -Returns value of `py-force-py-shell-name-p'. - -Caveat: Completion might not work that way. -" - (interactive "p") - (let ((arg (or arg 1))) - (toggle-force-py-shell-name-p arg)) - (when (or py-verbose-p (interactive-p)) (message "py-force-py-shell-name-p: %s" py-force-py-shell-name-p)) - py-force-py-shell-name-p) - -(defun force-py-shell-name-p-off () - "Make sure, `py-force-py-shell-name-p' is off. - -Function to use by executes will be guessed from environment. -Returns value of `py-force-py-shell-name-p'. " - (interactive) - (toggle-force-py-shell-name-p -1) - (when (or py-verbose-p (interactive-p)) (message "py-force-py-shell-name-p: %s" py-force-py-shell-name-p)) - py-force-py-shell-name-p) - -(defun py-toggle-indent-tabs-mode () - "Toggle `indent-tabs-mode'. - -Returns value of `indent-tabs-mode' switched to. " - (interactive) - (when - (setq indent-tabs-mode (not indent-tabs-mode)) - (setq tab-width py-indent-offset)) - (when (and py-verbose-p (interactive-p)) (message "indent-tabs-mode %s py-indent-offset %s" indent-tabs-mode py-indent-offset)) - indent-tabs-mode) - -(defun py-indent-tabs-mode (arg &optional iact) - "With positive ARG switch `indent-tabs-mode' on. - -With negative ARG switch `indent-tabs-mode' off. -Returns value of `indent-tabs-mode' switched to. " - (interactive "p") - (if (< 0 arg) - (progn - (setq indent-tabs-mode t) - (setq tab-width py-indent-offset)) - (setq indent-tabs-mode nil)) - (when (and py-verbose-p (or iact (interactive-p))) (message "indent-tabs-mode %s py-indent-offset %s" indent-tabs-mode py-indent-offset)) - indent-tabs-mode) - -(defun py-indent-tabs-mode-on (arg) - "Switch `indent-tabs-mode' on. " - (interactive "p") - (indent-tabs-mode (abs arg)(interactive-p))) - -(defun py-indent-tabs-mode-off (arg) - "Switch `indent-tabs-mode' on. " - (interactive "p") - (indent-tabs-mode (- (abs arg))(interactive-p))) - -;;; Guess indent offset -(defun py-guessed-sanity-check (guessed) - (and (>= guessed 2)(<= guessed 8)(eq 0 (% guessed 2)))) - -(defun py-guess-indent-offset (&optional global orig origline) - "Guess a value for, and change, `py-indent-offset'. - -By default, make a buffer-local copy of `py-indent-offset' with the -new value. -With optional argument GLOBAL change the global value of `py-indent-offset'. - -Indent might be guessed savely only from beginning of a block. -Returns `py-indent-offset'" - (interactive "P") - (save-excursion - (let* ((orig (or orig (point))) - (origline (or origline (py-count-lines))) - (firstindent - (if (eq origline (py-count-lines)) - (progn (py-beginning-of-statement) - (if (eq origline (py-count-lines)) - (progn (py-beginning-of-statement)(current-column)) (current-column))))) - (erg (when firstindent - (py-beginning-of-block) - (if - (< (current-column) firstindent) - (current-column) - (progn (goto-char orig) - ;; need a block-start - (when - (setq firstindent (progn (py-beginning-of-block)(current-indentation))) - (when (eq origline (py-count-lines)) - (setq firstindent (progn (py-beginning-of-block)(current-indentation)))) - (when (ignore-errors (< firstindent (py-down-statement))) - (current-indentation))))))) - (guessed (when erg (abs (- firstindent erg))))) - (if (and guessed (py-guessed-sanity-check guessed)) - (setq py-indent-offset guessed) - (setq py-indent-offset (default-value 'py-indent-offset))) - (funcall (if global 'kill-local-variable 'make-local-variable) - 'py-indent-offset) - (when (and py-verbose-p (interactive-p)) - (message "%s value of py-indent-offset: %d" - (if global "Global" "Local") - py-indent-offset)) - py-indent-offset))) - -;;; -(defun py-comment-indent-function () - "Python version of `comment-indent-function'." - ;; This is required when filladapt is turned off. Without it, when - ;; filladapt is not used, comments which start in column zero - ;; cascade one character to the right - (save-excursion - (beginning-of-line) - (let ((eol (line-end-position))) - (and comment-start-skip - (re-search-forward comment-start-skip eol t) - (setq eol (match-beginning 0))) - (goto-char eol) - (skip-chars-backward " \t") - (max comment-column (+ (current-column) (if (bolp) 0 1)))))) - -(defun py-narrow-to-defun () - "Make text outside current def or class invisible. - -The defun visible is the one that contains point or follows point. " - (interactive "P") - (save-excursion - (widen) - (py-end-of-def-or-class) - (let ((end (point))) - (py-beginning-of-def-or-class) - (narrow-to-region (point) end)))) - -;; make general form below work also in these cases -(defalias 'py-beginning-of-paragraph 'backward-paragraph) -(defalias 'py-end-of-paragraph 'forward-paragraph) - -;;; Shifting -(defalias 'py-shift-region-left 'py-shift-left) -(defun py-shift-left (&optional count start end) - "Dedent region according to `py-indent-offset' by COUNT times. - -If no region is active, current line is dedented. -Returns indentation reached. " - (interactive "p") - (let ((erg (py-shift-intern (- count) start end))) - (when (and (interactive-p) py-verbose-p) (message "%s" erg)) - erg)) - -(defalias 'py-shift-region-right 'py-shift-right) -(defun py-shift-right (&optional count beg end) - "Indent region according to `py-indent-offset' by COUNT times. - -If no region is active, current line is indented. -Returns indentation reached. " - (interactive "p") - (let ((erg (py-shift-intern count beg end))) - (when (and (interactive-p) py-verbose-p) (message "%s" erg)) - erg)) - -(defun py-shift-intern (count &optional start end) - (save-excursion - (let* ((inhibit-point-motion-hooks t) - deactivate-mark - (beg (cond (start) - ((region-active-p) - (save-excursion - (goto-char - (region-beginning)))) - (t (line-beginning-position)))) - (end (cond (end) - ((region-active-p) - (save-excursion - (goto-char - (region-end)))) - (t (line-end-position)))) - (orig end)) - (setq beg (copy-marker beg)) - (setq end (copy-marker end)) - ;; lp:962227 - ;; (dotimes (i (abs count)) - (if (< 0 count) - (indent-rigidly beg end py-indent-offset) - (indent-rigidly beg end (- py-indent-offset))) - ;; ) - (push-mark beg t) - (goto-char end) - (skip-chars-backward " \t\r\n\f")) - (py-indentation-of-statement))) - -(defun py-shift-forms-base (form arg &optional beg end) - (let* ((begform (intern-soft (concat "py-beginning-of-" form))) - (endform (intern-soft (concat "py-end-of-" form))) - (orig (copy-marker (point))) - (beg (cond (beg) - ((region-active-p) - (save-excursion - (goto-char (region-beginning)) - (line-beginning-position))) - (t (save-excursion - (funcall begform) - (line-beginning-position))))) - (end (cond (end) - ((region-active-p) - (region-end)) - (t (funcall endform)))) - (erg (py-shift-intern arg beg end))) - (goto-char orig) - erg)) - -(defun py-shift-paragraph-right (&optional arg) - "Indent paragraph by COUNT spaces. - -COUNT defaults to `py-indent-offset', -use \[universal-argument] to specify a different value. - -Returns outmost indentation reached. " - (interactive "*P") - (let ((erg (py-shift-forms-base "paragraph" (or arg py-indent-offset)))) - (when (and (interactive-p) py-verbose-p) (message "%s" erg)) - erg)) - -(defun py-shift-paragraph-left (&optional arg) - "Dedent paragraph by COUNT spaces. - -COUNT defaults to `py-indent-offset', -use \[universal-argument] to specify a different value. - -Returns outmost indentation reached. " - (interactive "*P") - (let ((erg (py-shift-forms-base "paragraph" (- (or arg py-indent-offset))))) - (when (and (interactive-p) py-verbose-p) (message "%s" erg)) - erg)) - -(defun py-shift-block-right (&optional arg) - "Indent block by COUNT spaces. - -COUNT defaults to `py-indent-offset', -use \[universal-argument] to specify a different value. - -Returns outmost indentation reached. " - (interactive "*P") - (let ((erg (py-shift-forms-base "block" (or arg py-indent-offset)))) - (when (and (interactive-p) py-verbose-p) (message "%s" erg)) - erg)) - -(defun py-shift-block-left (&optional arg) - "Dedent block by COUNT spaces. - -COUNT defaults to `py-indent-offset', -use \[universal-argument] to specify a different value. - -Returns outmost indentation reached. " - (interactive "*P") - (let ((erg (py-shift-forms-base "block" (- (or arg py-indent-offset))))) - (when (and (interactive-p) py-verbose-p) (message "%s" erg)) - erg)) - -(defun py-shift-clause-right (&optional arg) - "Indent clause by COUNT spaces. - -COUNT defaults to `py-indent-offset', -use \[universal-argument] to specify a different value. - -Returns outmost indentation reached. " - (interactive "*P") - (let ((erg (py-shift-forms-base "clause" (or arg py-indent-offset)))) - (when (and (interactive-p) py-verbose-p) (message "%s" erg)) - erg)) - -(defun py-shift-clause-left (&optional arg) - "Dedent clause by COUNT spaces. - -COUNT defaults to `py-indent-offset', -use \[universal-argument] to specify a different value. - -Returns outmost indentation reached. " - (interactive "*P") - (let ((erg (py-shift-forms-base "clause" (- (or arg py-indent-offset))))) - (when (and (interactive-p) py-verbose-p) (message "%s" erg)) - erg)) - -(defun py-shift-def-right (&optional arg) - "Indent def by COUNT spaces. - -COUNT defaults to `py-indent-offset', -use \[universal-argument] to specify a different value. - -Returns outmost indentation reached. " - (interactive "*P") - (let ((erg (py-shift-forms-base "def" (or arg py-indent-offset)))) - (when (and (interactive-p) py-verbose-p) (message "%s" erg)) - erg)) - -(defun py-shift-def-left (&optional arg) - "Dedent def by COUNT spaces. - -COUNT defaults to `py-indent-offset', -use \[universal-argument] to specify a different value. - -Returns outmost indentation reached. " - (interactive "*P") - (let ((erg (py-shift-forms-base "def" (- (or arg py-indent-offset))))) - (when (and (interactive-p) py-verbose-p) (message "%s" erg)) - erg)) - -(defun py-shift-class-right (&optional arg) - "Indent class by COUNT spaces. - -COUNT defaults to `py-indent-offset', -use \[universal-argument] to specify a different value. - -Returns outmost indentation reached. " - (interactive "*P") - (let ((erg (py-shift-forms-base "class" (or arg py-indent-offset)))) - (when (and (interactive-p) py-verbose-p) (message "%s" erg)) - erg)) - -(defun py-shift-class-left (&optional arg) - "Dedent class by COUNT spaces. - -COUNT defaults to `py-indent-offset', -use \[universal-argument] to specify a different value. - -Returns outmost indentation reached. " - (interactive "*P") - (let ((erg (py-shift-forms-base "class" (- (or arg py-indent-offset))))) - (when (and (interactive-p) py-verbose-p) (message "%s" erg)) - erg)) - -(defun py-shift-line-right (&optional arg) - "Indent line by COUNT spaces. - -COUNT defaults to `py-indent-offset', -use \[universal-argument] to specify a different value. - -Returns outmost indentation reached. " - (interactive "*P") - (let ((erg (py-shift-forms-base "line" (or arg py-indent-offset)))) - (when (and (interactive-p) py-verbose-p) (message "%s" erg)) - erg)) - -(defun py-shift-line-left (&optional arg) - "Dedent line by COUNT spaces. - -COUNT defaults to `py-indent-offset', -use \[universal-argument] to specify a different value. - -Returns outmost indentation reached. " - (interactive "*P") - (let ((erg (py-shift-forms-base "line" (- (or arg py-indent-offset))))) - (when (and (interactive-p) py-verbose-p) (message "%s" erg)) - erg)) - -(defun py-shift-statement-right (&optional arg) - "Indent statement by COUNT spaces. - -COUNT defaults to `py-indent-offset', -use \[universal-argument] to specify a different value. - -Returns outmost indentation reached. " - (interactive "*P") - (let ((erg (py-shift-forms-base "statement" (or arg py-indent-offset)))) - (when (and (interactive-p) py-verbose-p) (message "%s" erg)) - erg)) - -(defun py-shift-statement-left (&optional arg) - "Dedent statement by COUNT spaces. - -COUNT defaults to `py-indent-offset', -use \[universal-argument] to specify a different value. - -Returns outmost indentation reached. " - (interactive "*P") - (let ((erg (py-shift-forms-base "statement" (- (or arg py-indent-offset))))) - (when (and (interactive-p) py-verbose-p) (message "%s" erg)) - erg)) - -(defun py-indent-and-forward () - "Indent current line according to mode, move one line forward. " - (interactive "*") - (beginning-of-line) - (fixup-whitespace) - (indent-to (py-compute-indentation)) - (if (eobp) - (newline-and-indent) - (forward-line 1)) - (back-to-indentation)) - -(defun py-indent-region (start end &optional indent-offset) - "Reindent a region of Python code. - -With optional INDENT-OFFSET specify a different value than `py-indent-offset' at place. - -Guesses the outmost reasonable indent -Returns and keeps relative position " - (interactive "*r\nP") - (let ((orig (copy-marker (point))) - (beg start) - (end (copy-marker end)) - (py-indent-offset (prefix-numeric-value - (or indent-offset py-indent-offset)))) - (goto-char beg) - (while (< (line-end-position) end) - (py-indent-and-forward)) - (unless (empty-line-p) (py-indent-line)) - (goto-char orig))) - -;;; Positions -(defun py-beginning-of-paragraph-position () - "Returns beginning of paragraph position. " - (interactive) - (save-excursion - (let ((erg (py-beginning-of-paragraph))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg))) - -(defun py-end-of-paragraph-position () - "Returns end of paragraph position. " - (interactive) - (save-excursion - (let ((erg (py-end-of-paragraph))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg))) - -(defun py-beginning-of-block-position () - "Returns beginning of block position. " - (interactive) - (save-excursion - (let ((erg (py-beginning-of-block))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg))) - -(defun py-end-of-block-position () - "Returns end of block position. " - (interactive) - (save-excursion - (let ((erg (py-end-of-block))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg))) - -(defun py-beginning-of-clause-position () - "Returns beginning of clause position. " - (interactive) - (save-excursion - (let ((erg (py-beginning-of-clause))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg))) - -(defun py-end-of-clause-position () - "Returns end of clause position. " - (interactive) - (save-excursion - (let ((erg (py-end-of-clause))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg))) - -(defun py-beginning-of-block-or-clause-position () - "Returns beginning of block-or-clause position. " - (interactive) - (save-excursion - (let ((erg (py-beginning-of-block-or-clause))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg))) - -(defun py-end-of-block-or-clause-position () - "Returns end of block-or-clause position. " - (interactive) - (save-excursion - (let ((erg (py-end-of-block-or-clause))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg))) - -(defun py-beginning-of-def-position () - "Returns beginning of def position. " - (interactive) - (save-excursion - (let ((erg (py-beginning-of-def))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg))) - -(defun py-end-of-def-position () - "Returns end of def position. " - (interactive) - (save-excursion - (let ((erg (py-end-of-def))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg))) - -(defun py-beginning-of-class-position () - "Returns beginning of class position. " - (interactive) - (save-excursion - (let ((erg (py-beginning-of-class))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg))) - -(defun py-end-of-class-position () - "Returns end of class position. " - (interactive) - (save-excursion - (let ((erg (py-end-of-class))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg))) - -(defun py-beginning-of-def-or-class-position () - "Returns beginning of def-or-class position. " - (interactive) - (save-excursion - (let ((erg (py-beginning-of-def-or-class))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg))) - -(defun py-end-of-def-or-class-position () - "Returns end of def-or-class position. " - (interactive) - (save-excursion - (let ((erg (py-end-of-def-or-class))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg))) - -(defun py-beginning-of-line-position () - "Returns beginning of line position. " - (interactive) - (save-excursion - (let ((erg (py-beginning-of-line))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg))) - -(defun py-end-of-line-position () - "Returns end of line position. " - (interactive) - (save-excursion - (let ((erg (py-end-of-line))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg))) - -(defun py-beginning-of-statement-position () - "Returns beginning of statement position. " - (interactive) - (save-excursion - (let ((erg (py-beginning-of-statement))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg))) - -(defun py-end-of-statement-position () - "Returns end of statement position. " - (interactive) - (save-excursion - (let ((erg (py-end-of-statement))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg))) - -(defun py-beginning-of-expression-position () - "Returns beginning of expression position. " - (interactive) - (save-excursion - (let ((erg (py-beginning-of-expression))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg))) - -(defun py-end-of-expression-position () - "Returns end of expression position. " - (interactive) - (save-excursion - (let ((erg (py-end-of-expression))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg))) - -(defun py-beginning-of-partial-expression-position () - "Returns beginning of partial-expression position. " - (interactive) - (save-excursion - (let ((erg (py-beginning-of-partial-expression))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg))) - -(defun py-end-of-partial-expression-position () - "Returns end of partial-expression position. " - (interactive) - (save-excursion - (let ((erg (py-end-of-partial-expression))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg))) - -;;; Bounds -(defun py-bounds-of-statement (&optional position) - "Returns bounds of statement at point. - -With optional POSITION, a number, report bounds of statement at POSITION. -Returns a list, whose car is beg, cdr - end." - (interactive) - (save-excursion - (save-restriction - (widen) - (when position (goto-char position)) - (let ((beg (py-beginning-of-statement-position)) - (end (py-end-of-statement-position))) - (if (and beg end) - (when (and py-verbose-p (interactive-p)) (message "%s" (list beg end))) - (list beg end)))))) - -(defun py-bounds-of-block (&optional position) - "Returns bounds of block at point. - -With optional POSITION, a number, report bounds of block at POSITION. -Returns a list, whose car is beg, cdr - end." - (interactive) - (save-excursion - (save-restriction - (widen) - (when position (goto-char position)) - (let ((beg (py-beginning-of-block-position)) - (end (py-end-of-block-position))) - (if (and beg end) - (when (and py-verbose-p (interactive-p)) (message "%s" (list beg end))) - (list beg end)))))) - -(defun py-bounds-of-clause (&optional position) - "Returns bounds of clause at point. - -With optional POSITION, a number, report bounds of clause at POSITION. -Returns a list, whose car is beg, cdr - end." - (interactive) - (save-excursion - (save-restriction - (widen) - (when position (goto-char position)) - (let ((beg (py-beginning-of-clause-position)) - (end (py-end-of-clause-position))) - (if (and beg end) - (when (and py-verbose-p (interactive-p)) (message "%s" (list beg end))) - (list beg end)))))) - -(defun py-bounds-of-block-or-clause (&optional position) - "Returns bounds of block-or-clause at point. - -With optional POSITION, a number, report bounds of block-or-clause at POSITION. -Returns a list, whose car is beg, cdr - end." - (interactive) - (save-excursion - (save-restriction - (widen) - (when position (goto-char position)) - (let ((beg (py-beginning-of-block-or-clause-position)) - (end (py-end-of-block-or-clause-position))) - (if (and beg end) - (when (and py-verbose-p (interactive-p)) (message "%s" (list beg end))) - (list beg end)))))) - -(defun py-bounds-of-def (&optional position) - "Returns bounds of def at point. - -With optional POSITION, a number, report bounds of def at POSITION. -Returns a list, whose car is beg, cdr - end." - (interactive) - (save-excursion - (save-restriction - (widen) - (when position (goto-char position)) - (let ((beg (py-beginning-of-def-position)) - (end (py-end-of-def-position))) - (if (and beg end) - (when (and py-verbose-p (interactive-p)) (message "%s" (list beg end))) - (list beg end)))))) - -(defun py-bounds-of-class (&optional position) - "Returns bounds of class at point. - -With optional POSITION, a number, report bounds of class at POSITION. -Returns a list, whose car is beg, cdr - end." - (interactive) - (save-excursion - (save-restriction - (widen) - (when position (goto-char position)) - (let ((beg (py-beginning-of-class-position)) - (end (py-end-of-class-position))) - (if (and beg end) - (when (and py-verbose-p (interactive-p)) (message "%s" (list beg end))) - (list beg end)))))) - -(defun py-bounds-of-region () - "Returns bounds of region at point. - -Returns a list, whose car is beg, cdr - end." - (interactive) - (save-excursion - (save-restriction - (widen) - (let ((beg (region-beginning)) - (end (region-end))) - (if (and beg end) - (when (and py-verbose-p (interactive-p)) (message "%s" (list beg end))) - (list beg end)))))) - -(defun py-beginning-of-buffer-position () - (point-min)) - -(defun py-end-of-buffer-position () - (point-max)) - -(defun py-bounds-of-buffer (&optional position) - "Returns bounds of buffer at point. - -With optional POSITION, a number, report bounds of buffer at POSITION. -Returns a list, whose car is beg, cdr - end." - (interactive) - (save-excursion - (save-restriction - (widen) - (when position (goto-char position)) - (let ((beg (py-beginning-of-buffer-position)) - (end (py-end-of-buffer-position))) - (if (and beg end) - (when (and py-verbose-p (interactive-p)) (message "%s" (list beg end))) - (list beg end)))))) - -(defun py-bounds-of-expression (&optional position) - "Returns bounds of expression at point. - -With optional POSITION, a number, report bounds of expression at POSITION. -Returns a list, whose car is beg, cdr - end." - (interactive) - (save-excursion - (save-restriction - (widen) - (when position (goto-char position)) - (let ((beg (py-beginning-of-expression-position)) - (end (py-end-of-expression-position))) - (if (and beg end) - (when (and py-verbose-p (interactive-p)) (message "%s" (list beg end))) - (list beg end)))))) - -(defun py-bounds-of-partial-expression (&optional position) - "Returns bounds of partial-expression at point. - -With optional POSITION, a number, report bounds of partial-expression at POSITION. -Returns a list, whose car is beg, cdr - end." - (interactive) - (save-excursion - (save-restriction - (widen) - (when position (goto-char position)) - (let ((beg (py-beginning-of-partial-expression-position)) - (end (py-end-of-partial-expression-position))) - (if (and beg end) - (when (and py-verbose-p (interactive-p)) (message "%s" (list beg end))) - (list beg end)))))) - -;;; Declarations -(defun py-bounds-of-declarations () - "Bounds of consecutive multitude of assigments resp. statements around point. - -Indented same level, which don't open blocks. -Typically declarations resp. initialisations of variables following -a class or function definition. -See also py-bounds-of-statements " - (interactive) - (let* ((orig-indent (progn - (back-to-indentation) - (unless (py-beginning-of-statement-p) - (py-beginning-of-statement)) - (unless (py-beginning-of-block-p) - (current-indentation)))) - (orig (point)) - last beg end) - (when orig-indent - (setq beg (line-beginning-position)) - ;; look upward first - (while (and - (progn - (unless (py-beginning-of-statement-p) - (py-beginning-of-statement)) - (line-beginning-position)) - (py-beginning-of-statement) - (not (py-beginning-of-block-p)) - (eq (current-indentation) orig-indent)) - (setq beg (line-beginning-position))) - (goto-char orig) - (while (and (setq last (line-end-position)) - (setq end (py-down-statement)) - (not (py-beginning-of-block-p)) - (eq (py-indentation-of-statement) orig-indent))) - (setq end last) - (goto-char beg) - (if (and beg end) - (progn - (when (and py-verbose-p (interactive-p)) (message "%s %s" beg end)) - (cons beg end)) - (when (and py-verbose-p (interactive-p)) (message "%s" nil)) - nil)))) - -(defalias 'py-backward-declarations 'py-beginning-of-declarations) -(defun py-beginning-of-declarations () - "Got to the beginning of assigments resp. statements in current level which don't open blocks. -" - (interactive) - (let* ((bounds (py-bounds-of-declarations)) - (erg (car bounds))) - (when erg (goto-char erg)) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg)) - -(defalias 'py-forward-of-declarations 'py-end-of-declarations) -(defun py-end-of-declarations () - "Got to the end of assigments resp. statements in current level which don't open blocks. " - (interactive) - (let* ((bounds (py-bounds-of-declarations)) - (erg (cdr bounds))) - (when erg (goto-char erg)) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg)) - -(defalias 'py-copy-declarations 'py-declarations) -(defun py-declarations () - "Copy and mark assigments resp. statements in current level which don't open blocks or start with a keyword. - -See also `py-statements', which is more general, taking also simple statements starting with a keyword. " - (interactive) - (let* ((bounds (py-bounds-of-declarations)) - (beg (car bounds)) - (end (cdr bounds))) - (when (and beg end) - (goto-char beg) - (push-mark) - (goto-char end) - (kill-new (buffer-substring-no-properties beg end)) - (exchange-point-and-mark)))) - -(defun py-kill-declarations () - "Delete variables declared in current level. - -Store deleted variables in kill-ring " - (interactive "*") - (let* ((bounds (py-bounds-of-declarations)) - (beg (car bounds)) - (end (cdr bounds))) - (when (and beg end) - (goto-char beg) - (push-mark) - (goto-char end) - (kill-new (buffer-substring-no-properties beg end)) - (delete-region beg end)))) - -;;; Statements -(defun py-bounds-of-statements () - "Bounds of consecutive multitude of statements around point. - -Indented same level, which don't open blocks. " - (interactive) - (let* ((orig-indent (progn - (back-to-indentation) - (unless (py-beginning-of-statement-p) - (py-beginning-of-statement)) - (unless (py-beginning-of-block-p) - (current-indentation)))) - (orig (point)) - last beg end) - (when orig-indent - (setq beg (point)) - (while (and (setq last beg) - (setq beg - (when (py-beginning-of-statement) - (line-beginning-position))) - (not (py-in-string-p)) - (not (py-beginning-of-block-p)) - (eq (current-indentation) orig-indent))) - (setq beg last) - (goto-char orig) - (setq end (line-end-position)) - (while (and (setq last (line-end-position)) - (setq end (py-down-statement)) - (not (py-beginning-of-block-p)) - ;; (not (looking-at py-keywords)) - ;; (not (looking-at "pdb\.")) - (not (py-in-string-p)) - (eq (py-indentation-of-statement) orig-indent))) - (setq end last) - (goto-char orig) - (if (and beg end) - (progn - (when (and py-verbose-p (interactive-p)) (message "%s %s" beg end)) - (cons beg end)) - (when (and py-verbose-p (interactive-p)) (message "%s" nil)) - nil)))) - -(defalias 'py-backward-statements 'py-beginning-of-statements) -(defun py-beginning-of-statements () - "Got to the beginning of statements in current level which don't open blocks. " - (interactive) - (let* ((bounds (py-bounds-of-statements)) - (erg (car bounds))) - (when erg (goto-char erg)) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg)) - -(defalias 'py-forward-of-statements 'py-end-of-statements) -(defun py-end-of-statements () - "Got to the end of statements in current level which don't open blocks. " - (interactive) - (let* ((bounds (py-bounds-of-statements)) - (erg (cdr bounds))) - (when erg (goto-char erg)) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg)) - -(defalias 'py-copy-statements 'py-statements) -(defun py-statements () - "Copy and mark simple statements in current level which don't open blocks. - -More general than py-declarations, which would stop at keywords like a print-statement. " - (interactive) - (let* ((bounds (py-bounds-of-statements)) - (beg (car bounds)) - (end (cdr bounds))) - (when (and beg end) - (goto-char beg) - (push-mark) - (goto-char end) - (kill-new (buffer-substring-no-properties beg end)) - (exchange-point-and-mark)))) - -(defun py-kill-statements () - "Delete statements declared in current level. - -Store deleted statements in kill-ring " - (interactive "*") - (let* ((bounds (py-bounds-of-statements)) - (beg (car bounds)) - (end (cdr bounds))) - (when (and beg end) - (goto-char beg) - (push-mark) - (goto-char end) - (kill-new (buffer-substring-no-properties beg end)) - (delete-region beg end)))) - -;;; Comments, Filling -(defun py-comment-region (beg end &optional arg) - "Like `comment-region' but uses double hash (`#') comment starter." - (interactive "r\nP") - (let ((comment-start py-block-comment-prefix)) - (comment-region beg end arg))) - -(defun py-join-words-wrapping (words separator line-prefix line-length) - (let ((lines ()) - (current-line line-prefix)) - (while words - (let* ((word (car words)) - (maybe-line (concat current-line word separator))) - (if (> (length maybe-line) line-length) - (setq lines (cons (substring current-line 0 -1) lines) - current-line (concat line-prefix word separator " ")) - (setq current-line (concat maybe-line " ")))) - (setq words (cdr words))) - (setq lines (cons (substring - current-line 0 (- 0 (length separator) 1)) lines)) - (mapconcat 'identity (nreverse lines) "\n"))) - -(defun py-fill-comment (&optional justify) - "Fill the comment paragraph at point" - (let (;; Non-nil if the current line contains a comment. - has-comment - - ;; If has-comment, the appropriate fill-prefix for the comment. - comment-fill-prefix) - - ;; Figure out what kind of comment we are looking at. - (save-excursion - (beginning-of-line) - (cond - ;; A line with nothing but a comment on it? - ((looking-at "[ \t]*#[# \t]*") - (setq has-comment t - comment-fill-prefix (buffer-substring (match-beginning 0) - (match-end 0)))) - - ;; A line with some code, followed by a comment? Remember that the hash - ;; which starts the comment shouldn't be part of a string or character. - ((progn - (while (not (looking-at "#\\|$")) - (skip-chars-forward "^#\n\"'\\") - (cond - ((eq (char-after (point)) ?\\) (forward-char 2)) - ((memq (char-after (point)) '(?\" ?')) (forward-sexp 1)))) - (looking-at "#+[\t ]*")) - (setq has-comment t) - (setq comment-fill-prefix - (concat (make-string (current-column) ? ) - (buffer-substring (match-beginning 0) (match-end 0))))))) - - (if (not has-comment) - (fill-paragraph justify) - - ;; Narrow to include only the comment, and then fill the region. - (save-restriction - (narrow-to-region - - ;; Find the first line we should include in the region to fill. - (save-excursion - (while (and (zerop (forward-line -1)) - (looking-at "^[ \t]*#"))) - - ;; We may have gone to far. Go forward again. - (or (looking-at "^[ \t]*#") - (forward-line 1)) - (point)) - - ;; Find the beginning of the first line past the region to fill. - (save-excursion - (while (progn (forward-line 1) - (looking-at "^[ \t]*#"))) - (point))) - - ;; Lines with only hashes on them can be paragraph boundaries. - (let ((paragraph-start (concat paragraph-start "\\|[ \t#]*$")) - (paragraph-separate (concat paragraph-separate "\\|[ \t#]*$")) - (fill-prefix comment-fill-prefix)) - ;;(message "paragraph-start %S paragraph-separate %S" - ;;paragraph-start paragraph-separate) - (fill-paragraph justify)))) - t)) - -(defun py-fix-this-indent (indent) - (unless (and (eq (current-indentation) (current-column)) - (eq (current-column) indent)) - (beginning-of-line) - (indent-to-column indent) - (delete-region - (point) - (progn (skip-chars-forward " \t") (point))))) - -(defun py-fill-string (start &optional justify) - "Fill the paragraph around (point) in the string starting at start" - ;; basic strategy: narrow to the string and call the default - ;; implementation - (let (;; the start of the string's contents - string-start - ;; the end of the string's contents - string-end - ;; length of the string's delimiter - delim-length - ;; The string delimiter - delim) - - (save-excursion - (goto-char start) - (if (looking-at "\\([urbURB]*\\(?:'''\\|\"\"\"\\|'\\|\"\\)\\)\\\\?\n?") - (setq string-start (match-end 0) - delim-length (- (match-end 1) (match-beginning 1)) - delim (buffer-substring-no-properties (match-beginning 1) - (match-end 1))) - (error "The parameter start is not the beginning of a python string")) - - ;; if the string is the first token on a line and doesn't start with - ;; a newline, fill as if the string starts at the beginning of the - ;; line. this helps with one line docstrings - (save-excursion - (beginning-of-line) - (and (/= (char-before string-start) ?\n) - (looking-at (concat "[ \t]*" delim)) - (setq string-start (point)))) - - ;; move until after end of string, then the end of the string's contents - ;; is delim-length characters before that - (forward-sexp) - (setq string-end (- (point) delim-length))) - - ;; Narrow to the string's contents and fill the current paragraph - (save-restriction - (narrow-to-region string-start string-end) - (let ((ends-with-newline (= (char-before (point-max)) ?\n))) - (fill-paragraph justify) - (if (and (not ends-with-newline) - (= (char-before (point-max)) ?\n)) - ;; the default fill-paragraph implementation has inserted a - ;; newline at the end. Remove it again. - (save-excursion - (goto-char (point-max)) - (delete-char -1))))) - - ;; return t to indicate that we've done our work - t)) - -(defun py-fill-paragraph (&optional justify) - "Like \\[fill-paragraph], but handle Python comments and strings. - -If any of the current line is a comment, fill the comment or the -paragraph of it that point is in, preserving the comment's indentation -and initial `#'s. -If point is inside a string, narrow to that string and fill. -" - (interactive "P") - (save-excursion - (save-restriction - (widen) - (let ((pps - (if (featurep 'xemacs) - (parse-partial-sexp (point-min) (point)) - (syntax-ppss)))) - (cond - ;; inside a comment - ((nth 4 pps) - (py-fill-comment justify)) - ;; only whitespace before the comment start - ((save-excursion (beginning-of-line) (looking-at "[ \t]*#")) - (py-fill-comment justify)) - ;; inside a string - ((nth 3 pps) - (py-fill-string (nth 8 pps))) - ;; opening quote of a string - ((progn (save-excursion (forward-char 1)(nth 3 pps))) - (save-excursion - (forward-char 1) - (py-fill-string (nth 8 pps))))))))) - -(defun py-insert-super () - "Insert a function \"super()\" from current environment. - -As example given in Python v3.1 documentation Ā» The Python Standard Library Ā» - -class C(B): - def method(self, arg): - super().method(arg) # This does the same thing as: - # super(C, self).method(arg) - -Returns the string inserted. " - (interactive "*") - (let* ((orig (point)) - (funcname (progn - (py-beginning-of-def) - (when (looking-at (concat py-def-re " *\\([^(]+\\) *(\\(?:[^),]*\\),? *\\([^)]*\\))")) - (match-string-no-properties 2)))) - (args (match-string-no-properties 3)) - (ver (py-which-python)) - classname erg) - (if (< ver 3) - (progn - (py-beginning-of-class) - (when (looking-at (concat py-class-re " *\\([^( ]+\\)")) - (setq classname (match-string-no-properties 2))) - (goto-char orig) - (setq erg (concat "super(" classname ", self)." funcname "(" args ")")) - ;; super(C, self).method(arg)" - (insert erg)) - (goto-char orig) - (setq erg (concat "super()." funcname "(" args ")")) - (insert erg)) - erg)) - -(defun py-nesting-level (&optional pps) - "Accepts the output of `parse-partial-sexp'. " - (interactive) - (let* ((pps (or (ignore-errors (nth 0 pps)) - (if (featurep 'xemacs) - (parse-partial-sexp (point-min) (point)) - (syntax-ppss)))) - (erg (nth 0 pps))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg)) - -(defalias 'py-count-indentation 'py-compute-indentation) -(defun py-compute-indentation (&optional orig origline closing line inside repeat) - "Compute Python indentation. - -When HONOR-BLOCK-CLOSE-P is non-nil, statements such as `return', -`raise', `break', `continue', and `pass' force one level of dedenting." - (interactive "P") - (save-excursion - (save-restriction - (widen) - (let* ((orig (or orig (point))) - (origline (or origline (py-count-lines))) - ;; closing indicates: when started, looked - ;; at a single closing parenthesis - (closing closing) - ;; line: moved already a line backward - (line line) - (pps (syntax-ppss)) - ;; in a recursive call already - (repeat repeat) - ;; inside: started inside a list - (inside inside) - erg indent this-line) - (unless repeat (setq inside (nth 1 pps)) - (setq repeat t)) - (setq indent - (cond - ((and (bobp) - (eq origline (py-count-lines))) - (current-indentation)) - ((and (bobp)(py-statement-opens-block-p)) - (+ (if py-smart-indentation (py-guess-indent-offset nil orig origline) py-indent-offset) (current-indentation))) - ((and (bobp)(not (py-statement-opens-block-p))) - (current-indentation)) - ;; (py-in-triplequoted-string-p) - ((and (nth 3 pps)(nth 8 pps)) - (if (eq origline (py-count-lines)) - (progn - (forward-line -1) - (end-of-line) - (skip-chars-backward " \t\r\n\f") - (if (ignore-errors (< (nth 2 (syntax-ppss)) (line-beginning-position))) - (current-indentation) - (ignore-errors (goto-char (nth 2 pps))) - (py-line-backward-maybe) - (back-to-indentation) - (py-compute-indentation orig origline closing line inside repeat))) - (current-indentation))) - ((and (looking-at "\"\"\"\\|'''")(not (bobp))) - (py-beginning-of-statement) - (py-compute-indentation orig origline closing line inside repeat)) - ;; comments - ((nth 8 pps) - (if (eq origline (py-count-lines)) - (progn - (goto-char (nth 8 pps)) - (py-line-backward-maybe) - (skip-chars-backward " \t") - (py-compute-indentation orig origline closing line inside repeat)) - (goto-char (nth 8 pps)) - (if (and line (or py-indent-honors-inline-comment (looking-back "^[ \t]*"))) - (current-column) - (forward-char -1) - (py-compute-indentation orig origline closing line inside repeat)))) - ((and (looking-at "[ \t]*#") (looking-back "^[ \t]*")(not py-indent-comments)(eq origline (py-count-lines))) - 0) - ((and (looking-at "[ \t]*#") (looking-back "^[ \t]*")(not (eq (line-beginning-position) (point-min)))) - (forward-line -1) - (end-of-line) - (setq line t) - (py-compute-indentation orig origline closing line inside repeat)) - ;; lists - ((nth 1 pps) - (cond ((and inside (not line)) - (when (and (eq (point) orig) (looking-at "[ \t]*\\()\\)[ \t]*$")) - (setq closing (match-beginning 0))) - (save-excursion - (goto-char (nth 1 pps)) - (setq this-line (py-count-lines)) - (cond - ((< 0 (- origline this-line)) - (if (< 1 (- origline this-line)) - (if closing - (if py-closing-list-dedents-bos - (current-indentation) - (+ (current-indentation) py-indent-offset)) - (py-fetch-previous-indent orig)) - (cond ((looking-at "\\s([ \t]*$") - (if - (progn - (save-excursion - (back-to-indentation) - (looking-at py-block-or-clause-re))) - (progn - (back-to-indentation) - (+ (current-column) (* 2 py-indent-offset))) - (back-to-indentation) - (+ (current-column) py-indent-offset))) - ((looking-at "\\s([ \t]*\\([^ \t]+.*\\)$") - (goto-char (match-beginning 1)) - (current-column)) - (t (+ (current-column) (* (nth 0 pps))))))) - (t (back-to-indentation) - (py-beginning-of-statement) - (py-compute-indentation orig origline closing line inside repeat))))) - ((and (not inside) line) - (py-beginning-of-statement) - (py-compute-indentation orig origline closing line inside repeat)) - ((not inside) - (progn (goto-char (+ py-lhs-inbound-indent (nth 1 pps))) - (when (looking-at "[ \t]+") - (goto-char (match-end 0))) - (current-column))) - (t - (goto-char (nth 1 pps)) - (py-compute-indentation orig origline closing line inside repeat)))) - ((py-preceding-line-backslashed-p) - (progn - (py-beginning-of-statement) - (setq this-line (py-count-lines)) - (if (< 1 (- origline this-line)) - (py-fetch-previous-indent orig) - (if (looking-at "from +\\([^ \t\n]+\\) +import") - 5 - (+ (current-indentation) py-continuation-offset))))) - ((looking-at py-no-outdent-re) - (if (eq (py-count-lines) origline) - (progn - (back-to-indentation) - (py-line-backward-maybe) - (py-compute-indentation orig origline closing line inside repeat)) - (current-indentation))) - ((and (looking-at py-block-closing-keywords-re)(eq (py-count-lines) origline)) - (py-beginning-of-block-or-clause) - (+ - (if py-smart-indentation (py-guess-indent-offset nil orig origline) py-indent-offset) - ;; py-indent-offset - (current-indentation))) - ((looking-at py-block-closing-keywords-re) - (py-beginning-of-block-or-clause (current-indentation)) - (current-indentation)) - ((and (looking-at py-elif-re) (eq (py-count-lines) origline)) - (py-line-backward-maybe) - (car (py-clause-lookup-keyword py-elif-re -1 nil orig origline))) - ((and (looking-at py-clause-re)(eq origline (py-count-lines))) - (cond ((looking-at py-finally-re) - (car (py-clause-lookup-keyword py-finally-re -1 nil orig origline))) - ((looking-at py-except-re) - (car (py-clause-lookup-keyword py-except-re -1 nil orig origline))) - ((looking-at py-else-re) - ;; (car (py-clause-lookup-keyword py-else-re -1 (current-indentation)))) - (car (py-clause-lookup-keyword py-else-re -1 nil orig origline))) - ((looking-at py-elif-re) - (car (py-clause-lookup-keyword py-elif-re -1 nil orig origline))) - ;; maybe at if, try, with - (t (car (py-clause-lookup-keyword py-block-or-clause-re -1 nil orig origline))))) - ((looking-at py-block-or-clause-re) - (cond ((eq origline (py-count-lines)) - (py-line-backward-maybe) - (py-compute-indentation orig origline closing line inside t)) - (t (+ (if py-smart-indentation (py-guess-indent-offset nil orig origline) py-indent-offset)(current-indentation))))) - ((looking-at py-block-closing-keywords-re) - (py-beginning-of-block) - (current-indentation)) - ((and (< (current-indentation) (current-column))) - (back-to-indentation) - (unless line - (setq inside (nth 1 (syntax-ppss)))) - (py-compute-indentation orig origline closing line inside repeat)) - ((not (py-beginning-of-statement-p)) - (if (bobp) - (current-column) - (if (eq (point) orig) - (progn - (py-line-backward-maybe) - (py-compute-indentation orig origline closing line inside repeat)) - (py-beginning-of-statement) - (py-compute-indentation orig origline closing line inside repeat)))) - ((py-statement-opens-block-p) - (if (< (py-count-lines) origline) - (+ (if py-smart-indentation (py-guess-indent-offset nil orig origline) py-indent-offset) (current-indentation)) - (py-compute-indentation orig origline closing line inside t))) - ((and (< (py-count-lines) origline)(looking-at py-assignment-re)) - (current-indentation)) - ((looking-at py-assignment-re) - (py-beginning-of-statement) - (py-compute-indentation orig origline closing line inside repeat)) - ((and (eq origline (py-count-lines)) - (save-excursion (and (setq erg (py-go-to-keyword py-block-or-clause-re)) - (ignore-errors (< orig (py-end-of-block-or-clause)))))) - (+ (car erg) (if py-smart-indentation (py-guess-indent-offset nil orig origline) py-indent-offset))) - ((and (eq origline (py-count-lines)) - (py-beginning-of-statement-p)) - (py-beginning-of-statement) - (py-compute-indentation orig origline closing line inside repeat)) - (t (current-indentation)))) - (when (and py-verbose-p (interactive-p)) (message "%s" indent)) - indent)))) - -(defun py-line-backward-maybe () - (skip-chars-backward " \t\f" (line-beginning-position)) - (when (< 0 (abs (skip-chars-backward " \t\r\n\f"))) - (setq line t))) - -(defun py-fetch-previous-indent (orig) - "Report the preceding indent. " - (save-excursion - (goto-char orig) - (forward-line -1) - (end-of-line) - (skip-chars-backward " \t\r\n\f") - (current-indentation))) - -(defun py-continuation-offset (&optional arg) - "With numeric ARG different from 1 py-continuation-offset is set to that value; returns py-continuation-offset. " - (interactive "p") - (let ((erg (if (eq 1 arg) - py-continuation-offset - (when (numberp arg) - (prog1 - arg - (setq py-continuation-offset arg)))))) - (when (and py-verbose-p (interactive-p)) (message "%s" py-continuation-offset)) - py-continuation-offset)) - -(defalias 'pios 'py-indentation-of-statement) -(defalias 'ios 'py-indentation-of-statement) -(defun py-indentation-of-statement () - "Returns the indenation of the statement at point. " - (interactive) - (let ((erg (save-excursion - (back-to-indentation) - (or (py-beginning-of-statement-p) - (py-beginning-of-statement)) - (current-indentation)))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg)) - -(defalias 'py-in-list-p 'py-list-beginning-position) -(defun py-list-beginning-position (&optional start) - "Return lists beginning position, nil if not inside. - -Optional ARG indicates a start-position for `parse-partial-sexp'." - (interactive) - (let* ((ppstart (or start (point-min))) - (erg (nth 1 (syntax-ppss)))) - (when (interactive-p) (message "%s" erg)) - erg)) - -(defun py-end-of-list-position (&optional arg) - "Return end position, nil if not inside. - -Optional ARG indicates a start-position for `parse-partial-sexp'." - (interactive) - (let* ((ppstart (or arg (point-min))) - (erg (syntax-ppss)) - (beg (nth 1 erg)) - end) - (when beg - (save-excursion - (goto-char beg) - (forward-list 1) - (setq end (point)))) - (when (and py-verbose-p (interactive-p)) (message "%s" end)) - end)) - -(defun py-in-comment-p () - "Return the beginning of current line's comment, if inside. " - (save-restriction - (widen) - (let* ((pps (syntax-ppss)) - (erg (when (nth 4 pps) (nth 8 pps)))) - (unless erg - (when (looking-at (concat "^[ \t]*" comment-start-skip)) - (setq erg (point)))) - erg))) - -(defun py-in-triplequoted-string-p () - "Returns character address of start tqs-string, nil if not inside. " - (interactive) - (let* ((pps (syntax-ppss)) - (erg (when (and (nth 3 pps) (nth 8 pps))(nth 2 pps)))) - (save-excursion - (unless erg (setq erg - (progn - (when (looking-at "\"\"\"\\|''''") - (goto-char (match-end 0)) - (setq pps (syntax-ppss)) - (when (and (nth 3 pps) (nth 8 pps)) (nth 2 pps))))))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg)) - -(defun py-in-string-p () - "Returns character address of start of string, nil if not inside. " - (interactive) - (let* ((pps (syntax-ppss)) - (erg (when (nth 3 pps) (nth 8 pps)))) - (save-excursion - (unless erg (setq erg - (progn - (when (looking-at "\"\\|'") - (forward-char 1) - (setq pps (syntax-ppss)) - (when (nth 3 pps) (nth 8 pps))))))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg)) - -(defun py-in-statement-p () - "Returns list of beginning and end-position if inside. - -Result is useful for booleans too: (when (py-in-statement-p)...) -will work. -" - (interactive) - (let ((orig (point)) - beg end erg) - (save-excursion - (setq end (py-end-of-statement)) - (setq beg (py-beginning-of-statement)) - (when (and (<= beg orig)(<= orig end)) - (setq erg (cons beg end)) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg)))) - -;;; Beginning-of- p -(defun py-beginning-of-line-p () - "Returns position, if cursor is at the beginning of a line, nil otherwise. " - (when (bolp)(point))) - -(defun py-beginning-of-buffer-p () - "Returns position, if cursor is at the beginning of buffer, nil otherwise. " - (when (bobp)(point))) - -(defun py-beginning-of-paragraph-p () - "Returns position, if cursor is at the beginning of a paragraph, nil otherwise. " - (let ((orig (point)) - erg) - (if (and (bolp) (looking-at paragraph-separate)) - (setq erg (point)) - (save-excursion - (py-end-of-paragraph) - (py-beginning-of-paragraph) - (when (eq orig (point)) - (setq erg orig))) - erg))) - -(defun py-beginning-of-statement-p () - "Returns position, if cursor is at the beginning of a statement, nil otherwise. " - (let ((orig (point)) - erg) - (save-excursion - (py-end-of-statement) - (py-beginning-of-statement) - (when (eq orig (point)) - (setq erg orig)) - erg))) - -(defun py-beginning-of-expression-p () - "Returns position, if cursor is at the beginning of a expression, nil otherwise. " - (let ((orig (point)) - erg) - (save-excursion - (py-end-of-expression) - (py-beginning-of-expression) - (when (eq orig (point)) - (setq erg orig)) - erg))) - -(defun py-beginning-of-partial-expression-p () - "Returns position, if cursor is at the beginning of a partial-expression, nil otherwise. " - (let ((orig (point)) - erg) - (save-excursion - (py-end-of-partial-expression) - (py-beginning-of-partial-expression) - (when (eq orig (point)) - (setq erg orig)) - erg))) - -(defun py-beginning-of-block-p () - "Returns position, if cursor is at the beginning of a block, nil otherwise. " - (when (and (looking-at py-block-re) - (not (py-in-string-or-comment-p))) - (point))) - -(defun py-beginning-of-clause-p () - "Returns position, if cursor is at the beginning of a clause, nil otherwise. " - (when (and (looking-at py-clause-re) - (not (py-in-string-or-comment-p))) - (point))) - -(defun py-beginning-of-block-or-clause-p () - "Returns position, if cursor is at the beginning of a block-or-clause, nil otherwise. " - (when (and (looking-at py-block-or-clause-re) - (not (py-in-string-or-comment-p))) - (point))) - -(defun py-beginning-of-def-p () - "Returns position, if cursor is at the beginning of a def, nil otherwise. " - (when (and (looking-at py-def-re) - (not (py-in-string-or-comment-p))) - (point))) - -(defun py-beginning-of-class-p () - "Returns position, if cursor is at the beginning of a class, nil otherwise. " - (when (and (looking-at py-class-re) - (not (py-in-string-or-comment-p))) - (point))) - -(defun py-beginning-of-def-or-class-p () - "Returns position, if cursor is at the beginning of a def-or-class, nil otherwise. " - (when (and (looking-at py-def-or-class-re) - (not (py-in-string-or-comment-p))) - (point))) - -;;; Opens- p -(defun py-statement-opens-block-p (&optional regexp) - "Return position if the current statement opens a block -in stricter or wider sense. - -For stricter sense specify regexp. " - (interactive) - (let* ((regexp (or regexp py-block-re)) - (erg (py-statement-opens-base regexp))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg)) - -(defun py-statement-opens-base (regexp) - (let ((orig (point)) - erg) - (save-excursion - (back-to-indentation) - (py-end-of-statement) - (py-beginning-of-statement) - (when (and - (looking-back "^[ \t]*") (<= (line-beginning-position)(point))(looking-at regexp)) - (setq erg (point)))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg)) - -(defun py-statement-opens-clause-p () - "Return position if the current statement opens block or clause. " - (interactive) - (py-statement-opens-base py-clause-re)) - -(defun py-statement-opens-block-or-clause-p () - "Return position if the current statement opens block or clause. " - (interactive) - (py-statement-opens-base py-block-or-clause-re)) - -(defun py-statement-opens-class-p () - "Return `t' if the statement opens a functions or class definition, nil otherwise. " - (interactive) - (py-statement-opens-base py-class-re)) - -(defun py-statement-opens-def-p () - "Return `t' if the statement opens a functions or class definition, nil otherwise. " - (interactive) - (py-statement-opens-base py-def-re)) - -(defun py-statement-opens-def-or-class-p () - "Return `t' if the statement opens a functions or class definition, nil otherwise. " - (interactive) - (py-statement-opens-base py-def-or-class-re)) - -(defun py-statement-closes-block-p () - "Return t iff the current statement closes a block. -I.e., if the line starts with `return', `raise', `break', `continue', -and `pass'. This doesn't catch embedded statements." - (let ((here (point))) - (unless (py-beginning-of-statement-p) (py-beginning-of-statement)) - (prog1 - (looking-at py-block-closing-keywords-re) - (goto-char here)))) - -(defun py-end-base (regexp &optional orig) - "Used internal by functions going to the end forms. " - (let ((orig (or orig (point))) - (erg (if (py-statement-opens-block-p regexp) - (point) - (py-go-to-keyword regexp) - (when (py-statement-opens-block-p regexp) - (point)))) - ind) - (if erg - (progn - (setq ind (+ py-indent-offset (current-indentation))) - (py-end-of-statement) - (forward-line 1) - (setq erg (py-travel-current-indent ind))) - (py-look-downward-for-beginning regexp) - (unless (eobp)(py-end-base regexp orig))) - (if (< orig (point)) - (setq erg (point)) - (setq erg (py-look-downward-for-beginning regexp)) - (when erg (py-end-base regexp orig))) - erg)) - -(defun py-look-downward-for-beginning (regexp) - "When above any beginning of FORM, search downward. " - (let ((erg (re-search-forward regexp nil (quote move) 1))) - (if (and erg (not (py-in-string-or-comment-p)) - (not (py-in-list-p))) - erg - (unless (eobp) - (py-look-downward-for-beginning regexp))))) - -(defun py-current-defun (&optional iact) - "Go to the outermost method or class definition in current scope. - -Python value for `add-log-current-defun-function'. -This tells add-log.el how to find the current function/method/variable. -Returns name of class or methods definition, if found, nil otherwise. - -See customizable variables `py-current-defun-show' and `py-current-defun-delay'." - (interactive "p") - (save-restriction - (widen) - (save-excursion - (let ((erg (when (py-beginning-of-def-or-class) - (forward-word 1) - (skip-chars-forward " \t") - (prin1-to-string (symbol-at-point))))) - (when (and erg py-current-defun-show (push-mark (point) t t) (skip-chars-forward "^ (") - (exchange-point-and-mark) - (sit-for py-current-defun-delay))) - (when iact (message (prin1-to-string erg))) - erg)))) - -(defun py-outdent-p () - "Returns non-nil if the current line should dedent one level." - (save-excursion - (and (progn (back-to-indentation) - (looking-at py-clause-re)) - ;; short circuit infloop on illegal construct - (not (bobp)) - (progn (forward-line -1) - (py-beginning-of-statement) - (back-to-indentation) - (when (looking-at py-blank-or-comment-re) - (backward-to-indentation 1)) - (not (looking-at py-no-outdent-re)))))) - -(defun py-sort-imports () - "Sort multiline imports. - -Put point inside the parentheses of a multiline import and hit -\\[py-sort-imports] to sort the imports lexicographically" - (interactive) - (save-excursion - (let ((open-paren (save-excursion (progn (up-list -1) (point)))) - (close-paren (save-excursion (progn (up-list 1) (point)))) - sorted-imports) - (goto-char (1+ open-paren)) - (skip-chars-forward " \n\t") - (setq sorted-imports - (sort - (delete-dups - (split-string (buffer-substring - (point) - (save-excursion (goto-char (1- close-paren)) - (skip-chars-backward " \n\t") - (point))) - ", *\\(\n *\\)?")) - ;; XXX Should this sort case insensitively? - 'string-lessp)) - ;; Remove empty strings. - (delete-region open-paren close-paren) - (goto-char open-paren) - (insert "(\n") - (insert (py-join-words-wrapping (remove "" sorted-imports) "," " " 78)) - (insert ")")))) - -(defun py-in-literal (&optional lim) - "Return non-nil if point is in a Python literal (a comment or string). -Optional argument LIM indicates the beginning of the containing form, -i.e. the limit on how far back to scan." - (let* ((lim (or lim (point-min))) - (state (syntax-ppss))) - (cond - ((nth 3 state) 'string) - ((nth 4 state) 'comment)))) - -(defun py-which-function () - "Return the name of the function or class, if curser is in, return nil otherwise. " - (interactive) - (save-excursion - (save-restriction - (widen) - (let ((orig (point)) - (erg (if (and (looking-at (concat py-def-or-class-re " +\\([^(]+\\)(.+")) (not (py-in-string-or-comment-p))) - (match-string-no-properties 2) - (progn - (py-beginning-of-def-or-class) - (when (looking-at (concat py-def-or-class-re " +\\([^(]+\\)(.+")) - (match-string-no-properties 2)))))) - (if (and erg (< orig (py-end-of-def-or-class))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - (setq erg nil) - (when (and py-verbose-p (interactive-p)) (message "%s" "Not inside a function or class")) - erg))))) - -(defconst py-help-address "python-mode@python.org" - "List dealing with usage and developing python-mode. - -Also accepts submission of bug reports, whilst a ticket at -http://launchpad.net/python-mode -is preferable for that. ") - -;;; Beg-end forms -(defun py-beginning-of-block (&optional indent) - "Returns beginning of block if successful, nil otherwise. - -Referring python program structures see for example: -http://docs.python.org/reference/compound_stmts.html" - (interactive) - (let ((erg (ignore-errors (cdr (py-go-to-keyword py-block-re indent))))) - erg)) - -(defun py-end-of-block () - "Go to the end of block. - -Returns position reached, if any, nil otherwise. - -Referring python program structures see for example: -http://docs.python.org/reference/compound_stmts.html" - (interactive) - (let* ((orig (point)) - (erg (py-end-base py-block-re orig))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg)) - -(defun py-beginning-of-clause (&optional indent) - "Returns beginning of clause if successful, nil otherwise. - -Referring python program structures see for example: -http://docs.python.org/reference/compound_stmts.html" - (interactive) - (let ((erg (ignore-errors (cdr (py-go-to-keyword py-clause-re indent))))) - erg)) - -(defun py-end-of-clause () - "Go to the end of clause. - -Returns position reached, if any, nil otherwise. - -Referring python program structures see for example: -http://docs.python.org/reference/compound_stmts.html" - (interactive) - (let* ((orig (point)) - (erg (py-end-base py-clause-re orig))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg)) - -(defun py-beginning-of-block-or-clause (&optional indent) - "Returns beginning of block-or-clause if successful, nil otherwise. - -Referring python program structures see for example: -http://docs.python.org/reference/compound_stmts.html" - (interactive) - (let ((erg (ignore-errors (cdr (py-go-to-keyword py-block-or-clause-re indent))))) - erg)) - -(defun py-end-of-block-or-clause () - "Go to the end of block-or-clause. - -Returns position reached, if any, nil otherwise. - -Referring python program structures see for example: -http://docs.python.org/reference/compound_stmts.html" - (interactive) - (let* ((orig (point)) - (erg (py-end-base py-block-or-clause-re orig))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg)) - -(defun py-beginning-of-def (&optional indent) - "Returns beginning of def if successful, nil otherwise. - -Referring python program structures see for example: -http://docs.python.org/reference/compound_stmts.html" - (interactive) - (let ((erg (ignore-errors (cdr (py-go-to-keyword py-def-re indent))))) - erg)) - -(defun py-end-of-def () - "Go to the end of def. - -Returns position reached, if any, nil otherwise. - -Referring python program structures see for example: -http://docs.python.org/reference/compound_stmts.html" - (interactive) - (let* ((orig (point)) - (erg (py-end-base py-def-re orig))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg)) - -(defun py-beginning-of-class (&optional indent) - "Returns beginning of class if successful, nil otherwise. - -Referring python program structures see for example: -http://docs.python.org/reference/compound_stmts.html" - (interactive) - (let ((erg (ignore-errors (cdr (py-go-to-keyword py-class-re indent))))) - erg)) - -(defun py-end-of-class () - "Go to the end of class. - -Returns position reached, if any, nil otherwise. - -Referring python program structures see for example: -http://docs.python.org/reference/compound_stmts.html" - (interactive) - (let* ((orig (point)) - (erg (py-end-base py-class-re orig))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg)) - -(defun py-beginning-of-def-or-class (&optional indent) - "Returns beginning of def-or-class if successful, nil otherwise. - -Referring python program structures see for example: -http://docs.python.org/reference/compound_stmts.html" - (interactive) - (let ((erg (ignore-errors (cdr (py-go-to-keyword py-def-or-class-re indent))))) - erg)) - -(defun py-end-of-def-or-class () - "Go to the end of def-or-class. - -Returns position reached, if any, nil otherwise. - -Referring python program structures see for example: -http://docs.python.org/reference/compound_stmts.html" - (interactive) - (save-restriction - (widen) - (let* ((orig (point)) - (pps (syntax-ppss)) - ;; (origline (py-count-lines)) - (erg (if (and (not (nth 8 pps)) (looking-at py-def-or-class-re)) - (point) - (py-go-to-keyword py-def-or-class-re) - (when (and (not (nth 8 pps)) (looking-at py-def-or-class-re)) (point)))) - ind) - (if erg - (progn - (setq ind - (+ (if py-smart-indentation - (save-excursion - (goto-char orig) - ;; (setq origline (py-count-lines)) - (py-end-of-statement) - (py-end-of-statement) - ;; (when (eq origline (py-count-lines)) (py-end-of-statement)) - (py-guess-indent-offset nil (point))) - py-indent-offset) - (current-indentation))) - (py-end-of-statement) - (forward-line 1) - (setq erg (py-travel-current-indent ind))) - (py-look-downward-for-beginning py-def-or-class-re) - (unless (eobp) - ;; (py-end-base py-def-or-class-re orig) - (progn - (setq ind - (+ (if py-smart-indentation - (save-excursion - (goto-char orig) - ;; (setq origline (py-count-lines)) - (py-end-of-statement) - (py-end-of-statement) - ;; (when (eq origline (py-count-lines)) (py-end-of-statement)) - (py-guess-indent-offset nil (point))) - py-indent-offset) - (current-indentation))) - (py-end-of-statement) - (forward-line 1) - (setq erg (py-travel-current-indent ind))) - )) - (if (< orig (point)) - (setq erg (point)) - (setq erg (py-look-downward-for-beginning py-def-or-class-re)) - (when erg - (progn - (setq ind (+ py-indent-offset (current-indentation))) - (py-end-of-statement) - (forward-line 1) - (setq erg (py-travel-current-indent ind))) - ;; (py-end-base py-def-or-class-re orig) - )) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg))) - -(defun py-beginning-of-if-block (&optional indent) - "Returns beginning of if-block if successful, nil otherwise. - -Referring python program structures see for example: -http://docs.python.org/reference/compound_stmts.html" - (interactive) - (let ((erg (ignore-errors (cdr (py-go-to-keyword py-if-re indent))))) - erg)) - -(defun py-end-of-if-block () - "Go to the end of if-block. - -Returns position reached, if any, nil otherwise. - -Referring python program structures see for example: -http://docs.python.org/reference/compound_stmts.html" - (interactive) - (let* ((orig (point)) - (erg (py-end-base py-if-re orig))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg)) - -(defun py-beginning-of-try-block (&optional indent) - "Returns beginning of try-block if successful, nil otherwise. - -Referring python program structures see for example: -http://docs.python.org/reference/compound_stmts.html" - (interactive) - (let ((erg (ignore-errors (cdr (py-go-to-keyword py-try-block-re indent))))) - erg)) - -(defun py-end-of-try-block () - "Go to the end of try-block. - -Returns position reached, if any, nil otherwise. - -Referring python program structures see for example: -http://docs.python.org/reference/compound_stmts.html" - (interactive) - (let* ((orig (point)) - (erg (py-end-base py-try-block-re orig))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg)) - -(defun py-beginning-of-minor-block (&optional indent) - "Returns beginning of minor-block if successful, nil otherwise. - -Referring python program structures see for example: -http://docs.python.org/reference/compound_stmts.html" - (interactive) - (let ((erg (ignore-errors (cdr (py-go-to-keyword py-minor-block-re indent))))) - erg)) - -(defun py-end-of-minor-block () - "Go to the end of minor-block. - -Returns position reached, if any, nil otherwise. - -Referring python program structures see for example: -http://docs.python.org/reference/compound_stmts.html" - (interactive) - (let* ((orig (point)) - (erg (py-end-base py-minor-block-re orig))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg)) - -;; Buffer -(defun py-beginning-of-buffer () - "Go to beginning-of-buffer, return position. " - (let ((erg (unless (bobp) - (goto-char (point-min))))) - erg)) - -(defun py-end-of-buffer () - "Go to end-of-buffer, return position. - -If already at end-of-buffer and not at EOB, go to end of next line. " - (let ((erg (unless (eobp) - (goto-char (point-max))))) - erg)) - -(defalias 'py-forward-block 'py-end-of-block) -(defalias 'py-forward-block-or-clause 'py-end-of-block-or-clause) -(defalias 'py-forward-class 'py-end-of-class) -(defalias 'py-forward-clause 'py-end-of-clause) -(defalias 'end-of-def-or-class 'py-end-of-def-or-class) -(defalias 'py-forward-def-or-class 'py-end-of-def-or-class) -(defalias 'py-previous-block 'py-beginning-of-block) -(defalias 'py-goto-block-up 'py-beginning-of-block) -(defalias 'py-backward-block 'py-beginning-of-block) -(defalias 'py-previous-block-or-clause 'py-beginning-of-block-or-clause) -(defalias 'py-goto-block-or-clause-up 'py-beginning-of-block-or-clause) -(defalias 'py-backward-block-or-clause 'py-beginning-of-block-or-clause) -(defalias 'beginning-of-class 'py-beginning-of-class) -(defalias 'py-backward-class 'py-beginning-of-class) -(defalias 'py-previous-class 'py-beginning-of-class) -(defalias 'py-previous-clause 'py-beginning-of-clause) -(defalias 'py-goto-clause-up 'py-beginning-of-clause) -(defalias 'py-backward-clause 'py-beginning-of-clause) -(defalias 'py-backward-def-or-class 'py-beginning-of-def-or-class) -(defalias 'py-previous-def-or-class 'py-beginning-of-def-or-class) - -;;; Expression -(defalias 'py-backward-expression 'py-beginning-of-expression) -(defun py-beginning-of-expression (&optional orig done) - "Go to the beginning of a compound python expression. - -A a compound python expression might be concatenated by \".\" operator, thus composed by minor python expressions. - -If already at the beginning or before a expression, go to next expression in buffer upwards - -Expression here is conceived as the syntactical component of a statement in Python. See http://docs.python.org/reference -Operators however are left aside resp. limit py-expression designed for edit-purposes. -" - (interactive) - (save-restriction - (widen) - (unless (bobp) - (let ((orig (or orig (point))) - (cui (current-indentation)) - (pps (syntax-ppss)) - erg) - (cond - ;; if in string - ((and (nth 3 pps)(nth 8 pps) - (goto-char (nth 8 pps))) - (setq done t) - (unless (looking-back "\\(=\\|:\\|+\\|-\\|*\\|/\\|//\\|&\\|%\\||\\|\^\\|>>\\|<<\\)[ \t]*") - (when (nth 2 pps) - (goto-char (nth 2 pps)))) - (py-beginning-of-expression orig done)) - ;; comments left, as strings are done - ((nth 8 pps) - (goto-char (1- (nth 8 pps))) - (py-beginning-of-expression orig done)) - ((and (looking-at "[ \t]*#") (looking-back "^[ \t]*")) - (forward-line -1) - (unless (bobp) - (end-of-line) - (py-beginning-of-expression orig done))) - ;; character address of start of innermost containing list; nil if none. - ((nth 1 pps) - (goto-char (nth 1 pps)) - (when - (not (looking-back "[ \t]+")) - (when (< 0 (abs (skip-chars-backward py-expression-skip-regexp))) - (setq done t))) - (py-beginning-of-expression orig done)) - ((looking-at "\\(=\\|:\\|+\\|-\\|*\\|/\\|//\\|&\\|%\\||\\|\^\\|>>\\|<<\\)") - (goto-char (1- (match-beginning 0))) - (skip-chars-backward " \t\r\n\f") - (forward-char -1) - (py-beginning-of-expression orig done)) - ((looking-back "[\])}]") - (forward-char -1) - (py-beginning-of-expression orig done)) - - ;; inside expression - ((and (eq (point) orig) (not (bobp)) (looking-back py-expression-looking-regexp)) - (skip-chars-backward py-expression-skip-regexp) - (setq done t) - (py-beginning-of-expression orig done)) - ((looking-at "[ \t\r\n\f]") - (skip-chars-backward " \t\r\n\f") - (unless (bobp) (forward-char -1)) - (unless (eq (abs (skip-chars-backward "^ \t\r\n\f")) 0) - (py-beginning-of-expression orig done))) - ((and (eq (point) orig) (not (bobp))(looking-back "[ \.\t\r\n\f]")) - (skip-chars-backward "=:+-*/&%^><. \t\r\n\f") - (unless (bobp) (forward-char -1)) - (unless (eq (abs (skip-chars-backward "^=:+-*/&%^>< \t\r\n\f")) 0) - (setq done t) - (py-beginning-of-expression orig done))) - ((and (eq (point) orig) (not (bobp)) (looking-back py-expression-looking-regexp)) - (forward-char -1) - (when (< 0 (abs (skip-chars-backward py-expression-skip-regexp))) - (setq done t)) - (py-beginning-of-expression orig done)) - ((looking-at py-expression-looking-regexp) - (setq done t))) - (unless (or (eq (point) orig)(looking-at "[ \t]*#")) - (setq erg (point))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg)))) - -(defun py-end-of-expression (&optional orig done) - "Go to the end of a compound python expression. - -A a compound python expression might be concatenated by \".\" operator, thus composed by minor python expressions. - -Expression here is conceived as the syntactical component of a statement in Python. See http://docs.python.org/reference - -Operators however are left aside resp. limit py-expression designed for edit-purposes. " - (interactive) - (save-restriction - (widen) - (unless (eobp) - (let* - ((orig (or orig (point))) - (pps (syntax-ppss)) - (done done) - erg - ;; use by scan-lists - parse-sexp-ignore-comments) - (cond - ;; start of innermost containing list; nil if none. - ((nth 1 pps) - (goto-char (nth 1 pps)) - (let ((parse-sexp-ignore-comments t)) - (forward-list) - (py-end-of-expression orig done))) - ;; in comment - ((nth 4 pps) - (or (< (point) (progn (forward-comment 1)(point)))(forward-line 1)) - (py-end-of-expression orig done)) - ((and (empty-line-p)(not done)(not (eobp))) - (while - (and (empty-line-p)(not done)(not (eobp))) - (forward-line 1)) - (py-end-of-expression orig done)) - ;; inside string - ((py-in-string-p) - (when (looking-at "\"\"\"\\|'''\\|\"\\|'") - (goto-char (match-end 0))) - (while - (nth 3 (syntax-ppss)) - (forward-char 1)) - (when (looking-at "[ \t]*$") - (setq done t)) - (py-end-of-expression orig done)) - ((and (looking-at "[ \t]*#")(looking-back "^[ \t]*")(not done)) - (while (and (looking-at "[ \t]*#") (forward-line 1)(not (eobp)) - (beginning-of-line))) - (end-of-line) - (skip-chars-backward " \t\r\n\f") - (unless (bolp) (setq done t)) - (py-end-of-expression orig done)) - ((and (not done)(looking-at py-not-expression-regexp)(not (eobp))) - (goto-char (match-end 0)) - (skip-chars-forward " \t\r\n\f") - (py-end-of-expression orig done)) - ((and (not done)(looking-at py-expression-skip-regexp)(not (eobp))) - (skip-chars-forward py-not-expression-regexp) - (forward-char -1) - (py-end-of-expression orig done)) - ((and - ;; (not done) - (not (eobp))(looking-at py-expression-looking-regexp)) - (goto-char (match-end 0)) - (setq done t) - (unless (< 0 (skip-chars-forward py-expression-skip-regexp)) - (unless (looking-at "[ \t\r\n\f]") (forward-char 1))) - (py-end-of-expression orig done)) - ((looking-at "\\(+\\|-\\|*\\|/\\|//\\|&\\|%\\||\\|\^\\|>>\\|<<\\)[ \t]*") - (setq done t) - (goto-char (match-end 0)) - (py-end-of-expression orig done))) - (unless (eq (point) orig) - (setq erg (point))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg)))) - -;;; Partial- or Minor Expression -(defalias 'py-backward-partial-expression 'py-beginning-of-partial-expression) -(defun py-beginning-of-partial-expression (&optional orig erg) - "Go to the beginning of a minor python expression. - -\".\" operators delimit a minor expression on their level. -Expression here is conceived as the syntactical component of a statement in Python. See http://docs.python.org/reference -Operators however are left aside resp. limit py-expression designed for edit-purposes. - -If already at the beginning or before a partial-expression, go to next partial-expression in buffer upwards " - (interactive) - (save-restriction - (widen) - (unless (bobp) - (let ((orig (or orig (point))) - (cui (current-indentation)) - ;; (origline (or origline (py-count-lines))) - (pps (syntax-ppss)) - (erg erg)) - (cond - ((nth 1 pps) - (goto-char (nth 1 pps)) - ;; (skip-chars-backward py-partial-expression-backward-regexp) - (setq erg (point))) - ((nth 8 pps) - (when (nth 2 pps) - (goto-char (nth 2 pps))) - (goto-char (1- (nth 8 pps))) - (setq erg (point)) - (py-beginning-of-partial-expression orig erg)) - ((and (looking-at "[ \t]*#") (looking-back "^[ \t]*")) - (forward-line -1) - (unless (bobp) - (end-of-line) - (setq erg (point)) - (py-beginning-of-partial-expression orig erg))) - - ((looking-at "\\(=\\|:\\|+\\|-\\|*\\|/\\|//\\|&\\|%\\||\\|\^\\|>>\\|<<\\)") - (goto-char (1- (match-beginning 0))) - (skip-chars-backward " \t\r\n\f") - (unless (bobp) (forward-char -1)) - (py-beginning-of-partial-expression orig erg)) - ((looking-at "[ \t\r\n\f]") - (skip-chars-backward " \t\r\n\f") - (unless (bobp) (forward-char -1)) - (unless (eq (abs (skip-chars-backward "^ .\t\r\n\f")) 0) - (py-beginning-of-partial-expression orig erg))) - ((and (eq (point) orig) (not (bobp))(looking-back "[ \.\t\r\n\f]")) - (skip-chars-backward "=:+-*/&%^><. \t\r\n\f") - (unless (bobp) (forward-char -1)) - (unless (eq (abs (skip-chars-backward "^=:+-*/&%^><. \t\r\n\f")) 0) - (py-beginning-of-partial-expression orig erg))) - ((and (eq (point) orig) (not (bobp)) (looking-back py-partial-expression-looking-regexp)) - (forward-char -1) - (when (< 0 (abs (skip-chars-backward py-partial-expression-skip-regexp))) - (setq erg (point))) - (py-beginning-of-partial-expression orig erg)) - ((looking-at py-partial-expression-looking-regexp) - (setq erg (point))) - ((and (eq (point) orig)(not (bobp))) - (skip-chars-backward " \t\r\n\f") - (py-beginning-of-partial-expression orig erg)) - (t (unless (and (looking-at "[ \t]*#") (looking-back "^[ \t]*"))(setq erg (point))))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg)))) - -(defalias 'py-forward-partial-expression 'py-end-of-partial-expression) -(defun py-end-of-partial-expression (&optional orig origline done) - "Go to the end of a minor python expression. - -\".\" operators delimit a minor expression on their level. -Expression here is conceived as the syntactical component of a statement in Python. See http://docs.python.org/reference -Operators however are left aside resp. limit py-expression designed for edit-purposes. " - (interactive) - (save-restriction - (widen) - (unless (eobp) - (let* - ((orig (or orig (point))) - (origline (or origline (py-count-lines))) - (pps (if (featurep 'xemacs) - (parse-partial-sexp (point-min) (point)) - (syntax-ppss))) - (done done) - erg - ;; use by scan-lists - parse-sexp-ignore-comments) - (cond - ((and (empty-line-p)(not done)(not (eobp))) - (while - (and (empty-line-p)(not done)(not (eobp))) - (forward-line 1)) - (py-end-of-partial-expression orig origline done)) - ;; inside string - ((nth 3 pps) - (when (looking-at "\"\"\"\\|'''\\|\"\\|'") - (goto-char (match-end 0))) - (while - (and (re-search-forward "[^\\]\"\"\"\\|[^\\]'''\\|[^\\]\"\\|[^\\]'" nil (quote move) 1) - (nth 3 - (if (featurep 'xemacs) - (parse-partial-sexp (point-min) (point)) - (syntax-ppss))))) - (py-end-of-partial-expression orig origline done)) - ;; in comment - ((nth 4 pps) - (forward-line 1) - (py-end-of-partial-expression orig origline done)) - ((and (looking-at "[ \t]*#")(looking-back "^[ \t]*")(not done)) - (while (and (looking-at "[ \t]*#") (forward-line 1)(not (eobp)) - (beginning-of-line))) - (end-of-line) - ;; (setq done t) - (skip-chars-backward " \t\r\n\f") - (py-end-of-partial-expression orig origline done)) - ((and (nth 1 pps) (<= orig (nth 1 pps))) - (goto-char (nth 1 pps))(forward-list) - (point)) - ((and (not done)(ignore-errors (<= orig (nth 2 pps)))) - (goto-char (nth 2 pps)) - (setq done t) - (skip-chars-forward py-partial-expression-forward-regexp) - (py-end-of-partial-expression orig origline done)) - ((and (looking-at "\\.")(< orig (point))) - (point)) - ((and (not done)(looking-at "\\.\\|=\\|:\\|+\\|-\\|*\\|/\\|//\\|&\\|%\\||\\|\^\\|>>\\|<<\\|<\\|<=\\|>\\|>=\\|==\\|!=")) - (goto-char (match-end 0)) - (when (< 0 (skip-chars-forward " \t\r\n\f")) - (forward-char 1)) - (skip-chars-forward py-partial-expression-forward-regexp) - (setq done t) - (py-end-of-partial-expression orig origline done)) - ((and (not done)(looking-at py-partial-expression-looking-regexp)(not (eobp))) - (skip-chars-forward py-partial-expression-forward-regexp) - (setq done t) - (py-end-of-partial-expression orig origline done)) - ((and (not done)(looking-at py-not-partial-expression-regexp)(not (eobp))) - (skip-chars-forward py-not-partial-expression-skip-regexp) - (skip-chars-forward py-partial-expression-forward-regexp) - (setq done t) - (py-end-of-partial-expression orig origline done)) - ((and (eq (point) orig) (not (eobp))) - (forward-char 1) - (py-end-of-partial-expression orig origline done))) - (unless (eq (point) orig) - (setq erg (point))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg)))) - -;;; Line -(defun py-beginning-of-line () - "Go to beginning-of-line, return position. - -If already at beginning-of-line and not at BOB, go to beginning of previous line. " - (interactive) - (let ((erg (unless (bobp) - (if (bolp) - (progn - (forward-line -1) - (progn (beginning-of-line)(point))) - (progn (beginning-of-line)(point)))))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg)) - -(defun py-end-of-line () - "Go to end-of-line, return position. - -If already at end-of-line and not at EOB, go to end of next line. " - (interactive) - (let ((erg (unless (eobp) - (if (eolp) - (progn - (forward-line 1) - (progn (end-of-line)(point))) - (progn (end-of-line)(point)))))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg)) - -;;; Statement -(defalias 'py-backward-statement 'py-beginning-of-statement) -(defalias 'py-previous-statement 'py-beginning-of-statement) -(defalias 'py-statement-backward 'py-beginning-of-statement) -(defun py-beginning-of-statement (&optional orig done) - "Go to the initial line of a simple statement. - -For beginning of compound statement use py-beginning-of-block. -For beginning of clause py-beginning-of-clause. - -Referring python program structures see for example: -http://docs.python.org/reference/compound_stmts.html -" - (interactive) - (unless (bobp) - (let ((orig (or orig (point))) - (cui (current-indentation)) - (pps (syntax-ppss)) - (done done) - erg) - (cond - ((empty-line-p) - (skip-chars-backward " \t\r\n\f") - (py-beginning-of-statement orig done)) - ((nth 8 pps) - (goto-char (1- (nth 8 pps))) - (setq done t) - (py-beginning-of-statement orig done)) - ((nth 1 pps) - (goto-char (1- (nth 1 pps))) - (setq done t) - (py-beginning-of-statement orig done)) - ((and (not done) (not (eq 0 (skip-chars-backward " \t\r\n\f")))) - (setq done t) - (py-beginning-of-statement orig done)) - ((not (eq (current-column) (current-indentation))) - (back-to-indentation) - (setq done t) - (py-beginning-of-statement orig done)) - ((looking-at "[ \t]*#") - (skip-chars-backward " \t\r\n\f") - (setq done t) - (py-beginning-of-statement orig done)) - ((py-continuation-line-p) - (forward-line -1) - (setq done t) - (py-beginning-of-statement orig done))) - (unless (and (looking-at "[ \t]*#") (looking-back "^[ \t]*")) - (when (< (point) orig)(setq erg (point)))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg))) - -(defun py-go-to-keyword (regexp &optional maxindent) - "Returns a list, whose car is indentation, cdr position. " - (let ((orig (point)) - (origline (py-count-lines)) - (maxindent maxindent) - done erg cui) - (while (and (not done) (not (bobp))) - (py-beginning-of-statement) - (when (and (looking-at regexp)(if maxindent - (< (current-indentation) maxindent)t)) - (setq erg (point)) - (setq done t))) - (when erg (setq erg (cons (current-indentation) erg))) - erg)) - -;; (defmacro py-go-to-keyword (regexp &optional maxindent) -;; "Returns a list, whose car is indentation, cdr position. " -;; `(let ((orig (point)) -;; (origline (py-count-lines)) -;; (maxindent maxindent) -;; done erg) -;; (while (and (not done) (not (bobp))) -;; (py-beginning-of-statement) -;; (when (and (looking-at ,regexp)(if maxindent -;; (< (current-indentation) maxindent)t)) -;; (setq erg (point)) -;; (setq done t))) -;; (when erg (cons (current-indentation) erg)))) - -(defalias 'py-statement-forward 'py-end-of-statement) -(defalias 'py-next-statement 'py-end-of-statement) -(defalias 'py-forward-statement 'py-end-of-statement) -(defun py-end-of-statement (&optional orig done) - "Go to the last char of current statement. - -To go just beyond the final line of the current statement, use `py-down-statement-lc'. " - (interactive) - (unless (eobp) - (let ((pps (syntax-ppss)) - (orig (point)) - ;; use by scan-lists - parse-sexp-ignore-comments erg) - (cond - ((and (not done) (< 0 (skip-chars-forward " \t\r\n\f"))) - (end-of-line) - (py-beginning-of-comment) - (skip-chars-backward " \t\r\n\f" (line-beginning-position)) - (if (eq (point) orig) - (progn - (end-of-line) - (forward-comment 99999) - (py-end-of-statement orig done)) - (setq done t) - (py-end-of-statement orig done))) - ((nth 1 pps) - (when (< orig (point)) - (setq orig (point))) - (goto-char (nth 1 pps)) - (let ((parse-sexp-ignore-comments t)) - (if (ignore-errors (forward-list)) - (progn - (when (looking-at ":[ \t]*$") - (forward-char 1)) - (setq done t) - (end-of-line) - (skip-chars-backward " \t\r\n\f") - (py-end-of-statement orig done)) - (goto-char orig)))) - ((and (nth 8 pps)(nth 3 pps)) - (goto-char (nth 8 pps)) - (if (looking-at "\"\"\"\\|'''") - (goto-char (match-end 0)) - (forward-char 1)) - (while (and (re-search-forward (match-string-no-properties 0) nil (quote move) 1) - (nth 3 (syntax-ppss)))) - (setq done t) - (end-of-line) - (skip-chars-backward " \t\r\n\f" (line-beginning-position)) - (py-end-of-statement orig done)) - ;; in comment - ((nth 4 pps) - (if (eobp) - nil - (setq done t) - (forward-comment 99999) - (end-of-line) - (skip-chars-backward " \t\r\n\f" (line-beginning-position)) - (py-beginning-of-comment) - (skip-chars-backward " \t\r\n\f") - (py-end-of-statement orig done))) - ((looking-at "#") - ;; (skip-chars-forward "#") - (end-of-line) - (forward-comment 99999) - (setq done t) - (end-of-line) - (skip-chars-backward " \t\r\n\f") - (py-beginning-of-comment) - (skip-chars-backward " \t\r\n\f") - (py-end-of-statement orig done)) - ((py-current-line-backslashed-p) - (skip-chars-forward " \t\r\n\f") - (end-of-line) - (skip-chars-backward " \t\r\n\f") - (py-beginning-of-comment) - (skip-chars-backward " \t\r\n\f") - (setq done t) - (py-end-of-statement orig done)) - ((and (not done) (eq (point) orig)) - (end-of-line) - (skip-chars-backward " \t\r\n\f") - (py-beginning-of-comment) - (skip-chars-backward " \t\r\n\f") - (setq done t) - (py-end-of-statement orig done))) - (unless - (or - (eq (point) orig) - (eq 0 (current-column))) - (setq erg (point))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg))) - -(defun py-goto-statement-below () - "Goto beginning of next statement. " - (interactive) - (let ((orig (point)) - (erg (py-end-of-statement))) - (py-beginning-of-statement) - (when (< (point) orig) - (goto-char erg) - (py-end-of-statement) - (py-beginning-of-statement)))) - -;;; Mark forms -(defun py-mark-base (form &optional py-mark-decorators) - (let* ((begform (intern-soft (concat "py-beginning-of-" form))) - (endform (intern-soft (concat "py-end-of-" form))) - (begcheckform (intern-soft (concat "py-beginning-of-" form "-p"))) - (orig (point)) - beg end erg) - (setq beg (if - (setq beg (funcall begcheckform)) - beg - (funcall begform))) - (when py-mark-decorators - (save-excursion - (when (setq erg (py-beginning-of-decorator)) - (setq beg erg)))) - (setq end (funcall endform)) - (push-mark beg t t) - (unless end (when (< beg (point)) - (setq end (point)))) - (when (interactive-p) (message "%s %s" beg end)) - (cons beg end))) - -(defun py-mark-paragraph () - "Mark paragraph at point. - -Returns beginning and end positions of marked area, a cons. " - (interactive) - (let (erg) - (setq erg (py-mark-base "paragraph")) - (exchange-point-and-mark) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg)) - -(defun py-mark-block () - "Mark block at point. - -Returns beginning and end positions of marked area, a cons. " - (interactive) - (let (erg) - (setq erg (py-mark-base "block")) - (exchange-point-and-mark) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg)) - -(defun py-mark-clause () - "Mark clause at point. - -Returns beginning and end positions of marked area, a cons. " - (interactive) - (let (erg) - (setq erg (py-mark-base "clause")) - (exchange-point-and-mark) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg)) - -(defun py-mark-block-or-clause () - "Mark block-or-clause at point. - -Returns beginning and end positions of marked area, a cons. " - (interactive) - (let (erg) - (setq erg (py-mark-base "block-or-clause")) - (exchange-point-and-mark) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg)) - -(defun py-mark-def (&optional arg) - "Mark def at point. - -With \\[universal argument] or `py-mark-decorators' set to `t', decorators are marked too. -Returns beginning and end positions of marked area, a cons. " - (interactive "P") - (let ((py-mark-decorators (or arg py-mark-decorators)) - erg) - (py-mark-base "def" py-mark-decorators) - (exchange-point-and-mark) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg)) - -(defun py-mark-class (&optional arg) - "Mark class at point. - -With \\[universal argument] or `py-mark-decorators' set to `t', decorators are marked too. -Returns beginning and end positions of marked area, a cons. " - (interactive "P") - (let ((py-mark-decorators (or arg py-mark-decorators)) - erg) - (py-mark-base "class" py-mark-decorators) - (exchange-point-and-mark) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg)) - -(defun py-mark-def-or-class (&optional arg) - "Mark def-or-class at point. - -With \\[universal argument] or `py-mark-decorators' set to `t', decorators are marked too. -Returns beginning and end positions of marked area, a cons. " - (interactive "P") - (let ((py-mark-decorators (or arg py-mark-decorators)) - erg) - (py-mark-base "def-or-class" py-mark-decorators) - (exchange-point-and-mark) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg)) - -(defun py-mark-line () - "Mark line at point. - -Returns beginning and end positions of marked area, a cons. " - (interactive) - (let (erg) - (setq erg (py-mark-base "line")) - (exchange-point-and-mark) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg)) - -(defun py-mark-statement () - "Mark statement at point. - -Returns beginning and end positions of marked area, a cons. " - (interactive) - (let (erg) - (setq erg (py-mark-base "statement")) - (exchange-point-and-mark) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg)) - -(defun py-mark-expression () - "Mark expression at point. - -Returns beginning and end positions of marked area, a cons. " - (interactive) - (let (erg) - (setq erg (py-mark-base "expression")) - (exchange-point-and-mark) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg)) - -(defun py-mark-partial-expression () - "Mark partial-expression at point. - -Returns beginning and end positions of marked area, a cons. " - (interactive) - (let (erg) - (setq erg (py-mark-base "partial-expression")) - (exchange-point-and-mark) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg)) - -;;; Decorator -(defun py-beginning-of-decorator () - "Go to the beginning of a decorator. - -Returns position if succesful " - (interactive) - (back-to-indentation) - (while (and (not (looking-at "@\\w+"))(not (empty-line-p))(not (bobp))(forward-line -1)) - (back-to-indentation)) - (let ((erg (when (looking-at "@\\w+")(match-beginning 0)))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg)) - -(defun py-end-of-decorator () - "Go to the end of a decorator. - -Returns position if succesful " - (interactive) - (let ((orig (point)) erg) - (unless (looking-at "@\\w+") - (setq erg (py-beginning-of-decorator))) - (when erg - (if - (re-search-forward py-def-or-class-re nil t) - (progn - (back-to-indentation) - (skip-chars-backward " \t\r\n\f") - (py-leave-comment-or-string-backward) - (skip-chars-backward " \t\r\n\f") - (setq erg (point))) - (goto-char orig) - (end-of-line) - (skip-chars-backward " \t\r\n\f") - (when (ignore-errors (goto-char (py-in-list-p))) - (forward-list)) - (when (< orig (point)) - (setq erg (point)))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg))) - -;;; Copying -(defalias 'py-expression 'py-copy-expression) -(defun py-copy-expression () - "Mark expression at point. - -Returns beginning and end positions of marked area, a cons. " - (interactive) - (let ((erg (py-mark-base "expression"))) - (kill-new (buffer-substring-no-properties (car erg) (cdr erg))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg)) - -(defalias 'py-partial-expression 'py-copy-partial-expression) -(defun py-copy-partial-expression () - "Mark partial-expression at point. - -Returns beginning and end positions of marked area, a cons. - -\".\" operators delimit a partial-expression expression on it's level, that's the difference to compound expressions. - -Given the function below, `py-partial-expression' -called at pipe symbol would copy and return: - -def usage(): - print \"\"\"Usage: %s - ....\"\"\" % ( - os.path.basename(sys.argv[0])) -------------|------------------------- -==> path - - os.path.basename(sys.argv[0])) -------------------|------------------- -==> basename(sys.argv[0])) - - os.path.basename(sys.argv[0])) ---------------------------|----------- -==> sys - - os.path.basename(sys.argv[0])) -------------------------------|------- -==> argv[0] - -while `py-expression' would copy and return - -\( - os.path.basename(sys.argv[0])) - -\;;;;; - -Also for existing commands a shorthand is defined: - -\(defalias 'py-statement 'py-copy-statement)" - - (interactive) - (let ((erg (py-mark-base "partial-expression"))) - (kill-new (buffer-substring-no-properties (car erg) (cdr erg))))) - -(defalias 'py-statement 'py-copy-statement) -(defun py-copy-statement () - "Mark statement at point. - -Returns beginning and end positions of marked area, a cons. " - (interactive) - (let ((erg (py-mark-base "statement"))) - (kill-new (buffer-substring-no-properties (car erg) (cdr erg))))) - -(defalias 'py-block 'py-copy-block) -(defun py-copy-block () - "Mark block at point. - -Returns beginning and end positions of marked area, a cons. " - (interactive) - (let ((erg (py-mark-base "block"))) - (kill-new (buffer-substring-no-properties (car erg) (cdr erg))))) - -(defalias 'py-block-or-clause 'py-copy-block-or-clause) -(defun py-copy-block-or-clause () - "Mark block-or-clause at point. - -Returns beginning and end positions of marked area, a cons. " - (interactive) - (let ((erg (py-mark-base "block-or-clause"))) - (kill-new (buffer-substring-no-properties (car erg) (cdr erg))))) - -(defalias 'py-def 'py-copy-def) -(defun py-copy-def (&optional arg) - "Mark def at point. - -With universal argument or `py-mark-decorators' set to `t' decorators are copied too. -Returns beginning and end positions of marked area, a cons." - - (interactive "P") - (let ((py-mark-decorators (or arg py-mark-decorators)) - (erg (py-mark-base "def" py-mark-decorators))) - (kill-new (buffer-substring-no-properties (car erg) (cdr erg))))) - -(defun py-copy-def-or-class (&optional arg) - "Mark def-or-class at point. - -With universal argument or `py-mark-decorators' set to `t' decorators are copied too. -Returns beginning and end positions of marked area, a cons." - (interactive "P") - (let ((py-mark-decorators (or arg py-mark-decorators)) - (erg (py-mark-base "def-or-class" py-mark-decorators))) - (kill-new (buffer-substring-no-properties (car erg) (cdr erg))))) - -(defalias 'py-class 'py-copy-class) -(defun py-copy-class (&optional arg) - "Mark class at point. - -With universal argument or `py-mark-decorators' set to `t' decorators are copied too. -Returns beginning and end positions of marked area, a cons." - - (interactive "P") - (let ((py-mark-decorators (or arg py-mark-decorators)) - (erg (py-mark-base "class" py-mark-decorators))) - (kill-new (buffer-substring-no-properties (car erg) (cdr erg))))) - -(defalias 'py-clause 'py-copy-clause) -(defun py-copy-clause () - "Mark clause at point. - Returns beginning and end positions of marked area, a cons. " - (interactive) - (let ((erg (py-mark-base "clause"))) - (kill-new (buffer-substring-no-properties (car erg) (cdr erg))))) - -;;; Deleting -(defun py-kill-expression () - "Delete expression at point. - Stores data in kill ring. Might be yanked back using `C-y'. " - (interactive) - (let ((erg (py-mark-base "expression"))) - (kill-region (car erg) (cdr erg)))) - -(defun py-kill-partial-expression () - "Delete partial-expression at point. - Stores data in kill ring. Might be yanked back using `C-y'. - -\".\" operators delimit a partial-expression expression on it's level, that's the difference to compound expressions." - (interactive) - (let ((erg (py-mark-base "partial-expression"))) - (kill-region (car erg) (cdr erg)))) - -(defun py-kill-statement () - "Delete statement at point. - -Stores data in kill ring. Might be yanked back using `C-y'. " - (interactive "*") - (let ((erg (py-mark-base "statement"))) - (kill-region (car erg) (cdr erg)))) - -(defun py-kill-block () - "Delete block at point. - -Stores data in kill ring. Might be yanked back using `C-y'. " - (interactive "*") - (let ((erg (py-mark-base "block"))) - (kill-region (car erg) (cdr erg)))) - -(defun py-kill-block-or-clause () - "Delete block-or-clause at point. - -Stores data in kill ring. Might be yanked back using `C-y'. " - (interactive "*") - (let ((erg (py-mark-base "block-or-clause"))) - (kill-region (region-beginning) (region-end)))) - -(defun py-kill-def-or-class () - "Delete def-or-class at point. - -Stores data in kill ring. Might be yanked back using `C-y'. " - (interactive "*") - (let ((erg (py-mark-base "def-or-class"))) - (kill-region (car erg) (cdr erg)))) - -(defun py-kill-class () - "Delete class at point. - -Stores data in kill ring. Might be yanked back using `C-y'. " - (interactive "*") - (let ((erg (py-mark-base "class"))) - (kill-region (car erg) (cdr erg)))) - -(defun py-kill-def () - "Delete def at point. - -Stores data in kill ring. Might be yanked back using `C-y'. " - (interactive "*") - (let ((erg (py-mark-base "def"))) - (kill-region (car erg) (cdr erg)))) - -(defun py-kill-clause () - "Delete clause at point. - -Stores data in kill ring. Might be yanked back using `C-y'. " - (interactive "*") - (let ((erg (py-mark-base "clause"))) - (kill-region (car erg) (cdr erg)))) - -;;; Helper functions -(defun py-warn-tmp-files-left () - "Detect and warn about file of form \"py11046IoE\" in py-temp-directory. " - (let ((erg1 (file-readable-p (concat py-temp-directory (char-to-string py-separator-char) (car (directory-files py-temp-directory nil "py[[:alnum:]]+$")))))) - (when (and py-verbose-p erg1) - (message "py-warn-tmp-files-left: %s ?" (concat py-temp-directory (char-to-string py-separator-char) (car (directory-files py-temp-directory nil "py[[:alnum:]]*$"))))))) - -(defun py-forward-line (&optional arg) - "Goes to end of line after forward move. - -Travels right-margin comments. " - (interactive "p") - (let ((arg (or arg 1))) - (forward-line arg) - (end-of-line) - (skip-chars-backward " \t") - (py-beginning-of-comment) - (skip-chars-backward " \t"))) - -(defun py-go-to-beginning-of-comment () - "Go to the beginning of current line's comment, if any. - -From a programm use `py-beginning-of-comment' instead " - (interactive) - (let ((erg (py-beginning-of-comment))) - (when (and py-verbose-p (interactive-p)) - (message "%s" erg)))) - -(defun py-beginning-of-comment () - "Go to the beginning of current line's comment, if any. - -Returns position if succesful. " - (save-restriction - (widen) - (let ((pps - (if (featurep 'xemacs) - (parse-partial-sexp (line-beginning-position) (point)) - (syntax-ppss)))) - (when (nth 4 pps) - (goto-char - (nth 8 pps)))))) - -(defun py-clause-lookup-keyword (regexp arg &optional indent orig origline) - "Returns a list, whose car is indentation, cdr position. " - (let* ((orig (or orig (point))) - (origline (or origline (py-count-lines))) - (stop (if (< 0 arg)'(eobp)'(bobp))) - (function (if (< 0 arg) 'py-end-of-statement 'py-beginning-of-statement)) - (count 1) - (maxindent (cond (indent indent) - ((< (py-count-lines) origline) - (current-indentation)) - (t 0))) - (complement-re - (cond ((or (string-match "finally" regexp) - (string-match "except" regexp)) - py-try-re) - ((string-match "elif" regexp) - py-if-re) - ((string-match "else" regexp) - py-minor-block-re))) - (first t) - erg done strict) - (while (and (not (eval stop)) - (< 0 count) - (or done (setq erg (funcall function)))) - (setq done nil) - (when (and first (< maxindent (current-indentation))) - (setq maxindent (current-indentation)) - (setq first nil)) - (when (if strict - (< (current-indentation) maxindent) - (<= (current-indentation) maxindent)) - (unless (looking-at py-block-or-clause-re) - (setq maxindent (current-indentation))) - ;; (message "%s %s" count indent) - ;; nesting - (cond - ((and (looking-at "\\_<finally\\>[: \n\t]")(save-match-data (string-match regexp "finally"))) - (setq indent (current-indentation)) - (while - (and - (not (eval stop)) - (funcall function) - (setq done t) - (not (and (eq indent (current-indentation)) (looking-at "try")))))) - ;; ((and (looking-at "\\<except\\>[: \n\t]")(save-match-data (string-match "else" regexp))) - ;; (setq indent (current-indentation)) - ;; (setq count (1+ count)) - ;; (while - ;; (and - ;; (not (eval stop)) - ;; (funcall function) - ;; (setq done t) - ;; (not (and (eq indent (current-indentation)) (looking-at "try\\|if")))))) - ((and (looking-at "\\<else\\>[: \n\t]")(save-match-data (string-match "else" regexp))) - (setq indent (current-indentation)) - (setq count (1+ count)) - (while - (and - (not (eval stop)) - (funcall function) - (setq done t) - (not (and (eq indent (current-indentation)) (looking-at "try\\|if")))))) - ((and (looking-at "\\_<else\\>[: \n\t]")(save-match-data (string-match "else" regexp))) - (setq indent (current-indentation)) - (setq count (1+ count)) - (while - (and - (not (eval stop)) - (funcall function) - (setq done t) - (not (and (eq indent (current-indentation)) (looking-at "try\\|if")))))) - ((and (looking-at "\\_<elif\\>[ \n\t]")(save-match-data (string-match "elif" regexp))) - (setq indent (current-indentation)) - (while - (and - (not (eval stop)) - (funcall function) - (setq done t) - ;; doesn't mean nesting yet - (setq count (1- count)) - (not (and (eq indent (current-indentation)) (looking-at "if")))))) - ((and (looking-at complement-re)(<= (current-indentation) maxindent)) - (setq count (1- count))) - (t (cond ((and (string-match "except" regexp)(looking-at py-block-re)) - (setq count (1- count))) - ((and (string-match "else" regexp)(looking-at "except")) - (current-indentation)) - (t - (setq strict t) - )))))) - (when erg - (if (looking-at py-def-or-class-re) - (setq erg (cons (+ (current-indentation) py-indent-offset) erg)) - (setq erg (cons (current-indentation) erg)))) - erg)) - -(defun py-leave-comment-or-string-backward (&optional pos) - "If inside a comment or string, leave it backward. " - (interactive) - (let ((pps - (if (featurep 'xemacs) - (parse-partial-sexp (point-min) (point)) - (syntax-ppss)))) - (when (nth 8 pps) - (goto-char (1- (nth 8 pps)))))) - -(defun py-beginning-of-list-pps (&optional iact last ppstart orig done) - "Go to the beginning of a list. -Optional ARG indicates a start-position for `parse-partial-sexp'. -Return beginning position, nil if not inside." - (interactive "p") - (let* ((orig (or orig (point))) - (ppstart (or ppstart (re-search-backward "^[a-zA-Z]" nil t 1) (point-min))) - erg) - (unless done (goto-char orig)) - (setq done t) - (if - (setq erg (nth 1 (if (featurep 'xemacs) - (parse-partial-sexp ppstart (point)) - (syntax-ppss)))) - (progn - (setq last erg) - (goto-char erg) - (py-beginning-of-list-pps iact last ppstart orig done)) - (when iact (message "%s" last)) - last))) - -(when (featurep 'thing-at-point-utils) - (defun py-beginning-of-list (&optional iact orig limit done last) - "Go to beginning of any parentized, braced or bracketed expression in statement. " - (interactive "p") - (save-restriction - (let ((orig (or orig (point))) - (done done) - (limit (or limit (re-search-backward "^[a-zA-Z]" nil t 1))) - (last last)) - (unless (or done (not limit)) (narrow-to-region limit (point-max))) - (setq done t) - (goto-char orig) - (let* ((pt (car-safe (ar-in-parentized-p-atpt))) - (br (car-safe (ar-in-braced-p-atpt))) - (bk (car-safe (ar-in-bracketed-p-atpt))) - (erg (car (sort (delq nil (list pt br bk)) '<)))) - (if erg - (progn - (goto-char (1- erg)) - (setq last erg) - (py-beginning-of-list iact (1- erg) limit done last)) - (when last - (goto-char last)) - (when iact (message "%s" last)) - last))))) - - (defun py-end-of-list (&optional iact orig limit done last) - "Go to end of any parentized, braced or bracketed expression in statement. " - (interactive "p") - (save-restriction - (let ((orig (or orig (point))) - (done done) - (limit (or limit (re-search-backward "^[a-zA-Z]" nil t 1))) - (last last)) - (unless (or done (not limit)) (narrow-to-region limit (point-max))) - (setq done t) - (goto-char orig) - (let* ((pt (car-safe (ar-in-parentized-p-atpt))) - (br (car-safe (ar-in-braced-p-atpt))) - (bk (car-safe (ar-in-bracketed-p-atpt))) - (erg (car (sort (delq nil (list pt br bk)) '<)))) - (if erg - (progn - (goto-char (1- erg)) - (setq last erg) - (py-end-of-list iact (1- erg) limit done last)) - (when last - (goto-char last) - (match-paren) - (setq last (1+ (point))) - (when iact (message "%s" last)) - last))))))) - -;;; Down -(defun py-down-block-lc () - "Goto beginning of line following end of block. - -Returns position reached, if successful, nil otherwise. - -\"-lc\" stands for \"left-corner\" - a complementary command travelling left, whilst `py-end-of-block' stops at right corner. - -See also `py-down-block': down from current definition to next beginning of block below. " - (interactive) - (let ((erg (py-end-of-block))) - (when erg - (unless (eobp) - (forward-line 1) - (beginning-of-line) - (setq erg (point)))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg)) - -(defun py-down-clause-lc () - "Goto beginning of line following end of clause. - -Returns position reached, if successful, nil otherwise. - -\"-lc\" stands for \"left-corner\" - a complementary command travelling left, whilst `py-end-of-clause' stops at right corner. - -See also `py-down-clause': down from current definition to next beginning of clause below. " - (interactive) - (let ((erg (py-end-of-clause))) - (when erg - (unless (eobp) - (forward-line 1) - (beginning-of-line) - (setq erg (point)))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg)) - -(defun py-down-def-lc () - "Goto beginning of line following end of def. - -Returns position reached, if successful, nil otherwise. - -\"-lc\" stands for \"left-corner\" - a complementary command travelling left, whilst `py-end-of-def' stops at right corner. - -See also `py-down-def': down from current definition to next beginning of def below. " - (interactive) - (let ((erg (py-end-of-def))) - (when erg - (unless (eobp) - (forward-line 1) - (beginning-of-line) - (setq erg (point)))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg)) - -(defun py-down-class-lc () - "Goto beginning of line following end of class. - -Returns position reached, if successful, nil otherwise. - -\"-lc\" stands for \"left-corner\" - a complementary command travelling left, whilst `py-end-of-class' stops at right corner. - -See also `py-down-class': down from current definition to next beginning of class below. " - (interactive) - (let ((erg (py-end-of-class))) - (when erg - (unless (eobp) - (forward-line 1) - (beginning-of-line) - (setq erg (point)))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg)) - -(defun py-down-statement-lc () - "Goto beginning of line following end of statement. - -Returns position reached, if successful, nil otherwise. - -\"-lc\" stands for \"left-corner\" - a complementary command travelling left, whilst `py-end-of-statement' stops at right corner. - -See also `py-down-statement': down from current definition to next beginning of statement below. " - (interactive) - (let ((erg (py-end-of-statement))) - (when erg - (unless (eobp) - (forward-line 1) - (beginning-of-line) - (setq erg (point)))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg)) - -(defun py-down-statement () - "Go to the beginning of next statement below in buffer. - -Returns indentation if statement found, nil otherwise. " - (interactive) - (let* ((orig (point)) - erg) - (if (eobp) - (setq erg nil) - (progn - (when (setq erg (py-end-of-statement)) - (if (< orig (setq erg (py-beginning-of-statement-position))) - (goto-char erg) - (setq erg (py-end-of-statement)) - (when erg - (py-beginning-of-statement)))) - (when erg - (setq erg (current-column))))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg)) - -(defun py-down-block () - "Go to the beginning of next block below in buffer. - -Returns indentation if block found, nil otherwise. " - (interactive) - (let* ((orig (point)) - erg) - (if (eobp) - (setq erg nil) - (while (and (re-search-forward py-block-re nil (quote move)) - (nth 8 (if (featurep 'xemacs) - (parse-partial-sexp ppstart (point)) - (syntax-ppss))))) - (back-to-indentation) - (when (looking-at py-block-re) (setq erg (current-indentation))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg))) - -(defun py-down-clause () - "Go to the beginning of next clause below in buffer. - -Returns indentation if clause found, nil otherwise. " - (interactive) - (let* ((orig (point)) - erg) - (if (eobp) - (setq erg nil) - (while (and (setq erg (py-down-statement))(not (looking-at py-clause-re))))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg)) - -(defun py-down-block-or-clause () - "Go to the beginning of next block-or-clause below in buffer. - -Returns indentation if block-or-clause found, nil otherwise. " - (interactive) - (let* ((orig (point)) - erg) - (if (eobp) - (setq erg nil) - (while (and (setq erg (py-down-statement))(not (looking-at py-block-or-clause-re))))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg)) - -(defun py-down-def () - "Go to the beginning of next def below in buffer. - -Returns indentation if def found, nil otherwise. " - (interactive) - (let* ((orig (point)) - erg) - (if (eobp) - (setq erg nil) - (while (and (setq erg (py-down-statement))(not (looking-at py-def-re))))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg)) - -(defun py-down-class () - "Go to the beginning of next class below in buffer. - -Returns indentation if class found, nil otherwise. " - (interactive) - (let* ((orig (point)) - erg) - (if (eobp) - (setq erg nil) - (while (and (setq erg (py-down-statement))(not (looking-at py-class-re))))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg)) - -(defun py-down-def-or-class () - "Go to the beginning of next def-or-class below in buffer. - -Returns indentation if def-or-class found, nil otherwise. " - (interactive) - (let* ((orig (point)) - erg) - (if (eobp) - (setq erg nil) - (while (and (setq erg (py-down-statement))(not (looking-at py-def-or-class-re))))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg)) -;; Py-down commands end - -;; ripped from cc-mode -(defun py-forward-into-nomenclature (&optional arg iact) - "Move forward to end of a nomenclature section or word. - -With \\[universal-argument] (programmatically, optional argument ARG), do it that many times. - -A `nomenclature' is a fancy way of saying AWordWithMixedCaseNotUnderscores." - (interactive "p") - (or arg (setq arg 1)) - (let ((case-fold-search nil) - (orig (point)) - erg) - (if (> arg 0) - (while (and (not (eobp)) (> arg 0)) - ;; (setq erg (re-search-forward "\\(\\W+[_[:lower:][:digit:]Ć]+\\)" nil t 1)) - (cond - ((or (not (eq 0 (skip-chars-forward "[[:blank:][:punct:]\n\r]"))) - (not (eq 0 (skip-chars-forward "_")))) - (when (or - (< 1 (skip-chars-forward "[:upper:]")) - (not (eq 0 (skip-chars-forward "[[:lower:][:digit:]Ć]"))) - (not (eq 0 (skip-chars-forward "[[:lower:][:digit:]]")))) - (setq arg (1- arg)))) - ((or - (< 1 (skip-chars-forward "[:upper:]")) - (not (eq 0 (skip-chars-forward "[[:lower:][:digit:]Ć]"))) - (not (eq 0 (skip-chars-forward "[[:lower:][:digit:]]")))) - (setq arg (1- arg))))) - (while (and (not (bobp)) (< arg 0)) - (when (not (eq 0 (skip-chars-backward "[[:blank:][:punct:]\n\r\f_]"))) - - (forward-char -1)) - (or - (not (eq 0 (skip-chars-backward "[:upper:]"))) - (not (eq 0 (skip-chars-backward "[[:lower:][:digit:]Ć]"))) - (skip-chars-backward "[[:lower:][:digit:]Ć]")) - (setq arg (1+ arg)))) - (if (< (point) orig) - (progn - (when (looking-back "[[:upper:]]") - ;; (looking-back "[[:blank:]]" - (forward-char -1)) - (if (looking-at "[[:alnum:]Ć]") - (setq erg (point)) - (setq erg nil))) - (if (and (< orig (point)) (not (eobp))) - (setq erg (point)) - (setq erg nil))) - (when (and py-report-position-p (or iact (interactive-p))) (message "%s" erg)) - erg)) - -(defun py-backward-into-nomenclature (&optional arg) - "Move backward to beginning of a nomenclature section or word. - -With optional ARG, move that many times. If ARG is negative, move -forward. - -A `nomenclature' is a fancy way of saying AWordWithMixedCaseNotUnderscores." - (interactive "p") - (setq arg (or arg 1)) - (py-forward-into-nomenclature (- arg) arg)) - -(defalias 'py-match-paren 'match-paren) - -(defun match-paren (&optional arg) - "Go to the matching brace, bracket or parenthesis if on its counterpart. - -Otherwise insert the character, the key is assigned to, here `%'. -With universal arg \C-u insert a `%'. " - (interactive "P") - (let ((parse-sexp-ignore-comments t)) - (if arg - (self-insert-command (if (numberp arg) arg 1)) - (cond - ((and (not match-paren-no-use-syntax-pps) (looking-at "\\s(")) - (forward-list 1) - (backward-char 1)) - ((and (not match-paren-no-use-syntax-pps)(looking-at "\\s)")) - (forward-char 1) (backward-list 1)) - ;; if match-paren-no-syntax-pps - ((looking-at "(") - (ar-parentized-end-atpt)) - ((looking-at ")") - (ar-parentized-beginning-atpt)) - ((looking-at "\\\[") - (ar-bracketed-end-atpt)) - ((looking-at "]") - (ar-bracketed-beginning-atpt)) - ((looking-at "{") - (ar-braced-end-atpt)) - ((looking-at "}") - (ar-braced-beginning-atpt)) - (t (self-insert-command 1)))))) - -(defun py-travel-current-indent (indent) - "Moves down until clause is closed, i.e. current indentation is reached. - -Takes a list, INDENT and START position. " - (let (last) - (while (and (setq last (point))(not (eobp))(py-end-of-statement) - (<= indent (progn (save-excursion (py-beginning-of-statement)(current-indentation)))))) - (when last (goto-char last)) - last)) - -;;; python-mode-execute.el -(defun py-toggle-execute-keep-temporary-file-p () - "Toggle py-execute-keep-temporary-file-p " - (interactive) - (setq py-execute-keep-temporary-file-p - (not py-execute-keep-temporary-file-p)) - (when (and py-verbose-p (interactive-p)) (message "py-execute-keep-temporary-file-p: %s" py-execute-keep-temporary-file-p))) - -(defun py-comint-output-filter-function (string) - "Watch output for Python prompt and exec next file waiting in queue. -This function is appropriate for `comint-output-filter-functions'." - ;; TBD: this should probably use split-string - (when (and (or (string-equal string ">>> ") - (and (>= (length string) 5) - (string-equal (substring string -5) "\n>>> "))) - (or (setq py-shell-input-lines nil) - py-file-queue)) - (pop-to-buffer (current-buffer)) - (ignore-errors (delete-file (car py-file-queue))) - (setq py-file-queue (cdr py-file-queue)) - (if py-file-queue - (let ((pyproc (get-buffer-process (current-buffer)))) - (py-execute-file pyproc (car py-file-queue)))))) - -(defun py-guess-default-python () - "Defaults to \"python\", if guessing didn't succeed. " - (interactive) - (let* ((cmd (or py-shell-name (py-choose-shell) "python")) - (erg (if py-edit-only-p cmd (executable-find cmd)))) - (when (interactive-p) - (if erg - (message "%s" cmd) - (message "%s" "Could not detect Python on your system"))))) - -(defun py-separator-char () - "Return the file-path separator char from current machine. - -When `py-separator-char' is customized, its taken. -Returns char found. " - (let ((erg (cond ((characterp py-separator-char) - (char-to-string py-separator-char)) - ;; epd hack - ((and - (string-match "[Ii][Pp]ython" py-shell-name) - (string-match "epd\\|EPD" py-shell-name)) - (setq erg (shell-command-to-string (concat py-shell-name " -c \"import os; print(os.sep)\""))) - (setq erg (replace-regexp-in-string "\n" "" erg)) - (when (string-match "^$" erg) - (setq erg (substring erg (string-match "^$" erg))))) - (t (setq erg (shell-command-to-string (concat py-shell-name " -W ignore" " -c \"import os; print(os.sep)\""))))))) - (replace-regexp-in-string "\n" "" erg))) - -(unless py-separator-char (setq py-separator-char (py-separator-char))) - -(defun py-process-name (&optional name dedicated nostars sepchar) - "Return the name of the running Python process, `get-process' willsee it. " - (let* ((sepchar (or sepchar (char-to-string py-separator-char))) - (thisname (if name - (if (string-match sepchar name) - (substring name (progn (string-match (concat "\\(.+\\)" sepchar "\\(.+\\)$") name) (match-beginning 2))) - - name) - (substring py-shell-name (or (string-match (concat sepchar ".+$") py-shell-name) 0)))) - (nname (cond (dedicated - (make-temp-name (concat thisname "-"))) - ;; ((string-match "\*" (buffer-name)) - ;; (replace-regexp-in-string "\*" "" (buffer-name))) - (t thisname))) - (erg (cond ((or (string-match "ipython" nname) - (string-match "IPython" nname)) - "IPython") - (nname)))) - (unless (or nostars (string-match "^\*" erg))(setq erg (concat "*" erg "*"))) - erg)) - - -(defvar ipython-completion-command-string nil - "Either ipython0.10-completion-command-string or ipython0.11-completion-command-string. - -ipython0.11-completion-command-string also covers version 0.12") -;; (make-variable-buffer-local 'ipython-completion-command-string) - -(defvar ipython0.10-completion-command-string - "print(';'.join(__IP.Completer.all_completions('%s'))) #PYTHON-MODE SILENT\n" - "The string send to ipython to query for all possible completions") - -;; (setq ipython0.10-completion-command-string "print(';'.join(__IP.Completer.all_completions('%s'))) #PYTHON-MODE SILENT\n") - -(defvar ipython0.11-completion-command-string - "print(';'.join(get_ipython().Completer.all_completions('%s'))) #PYTHON-MODE SILENT\n" - "The string send to ipython to query for all possible completions") - -;; from ipython.el -(defun py-dirstack-hook () - ;; the following is to synchronize dir-changes - (make-local-variable 'shell-dirstack) - (setq shell-dirstack nil) - (make-local-variable 'shell-last-dir) - (setq shell-last-dir nil) - (make-local-variable 'shell-dirtrackp) - (setq shell-dirtrackp t) - (add-hook 'comint-input-filter-functions 'shell-directory-tracker nil t)) - -(defun py-set-ipython-completion-command-string (&optional pyshellname) - "Set and return `ipython-completion-command-string'. " - (interactive) - (let* ((pyshellname (or pyshellname py-shell-name)) - (ipython-version - (when (string-match "ipython" pyshellname) - (string-to-number (substring (shell-command-to-string (concat pyshellname " -V")) 2 -1))))) - (when ipython-version - (setq ipython-completion-command-string (if (< ipython-version 11) ipython0.10-completion-command-string ipython0.11-completion-command-string)) - ipython-completion-command-string))) - -(defalias 'py-dedicated-shell 'py-shell-dedicated) -(defun py-shell-dedicated (&optional argprompt) - "Start an interactive Python interpreter in another window. - -With optional \\[universal-argument] user is prompted by -`py-choose-shell' for command and options to pass to the Python -interpreter. -" - (interactive "P") - (py-shell argprompt t)) - -(defun py-buffer-name-prepare (name &optional sepchar dedicated) - "Return an appropriate name to display in modeline. -SEPCHAR is the file-path separator of your system. " - (let ((sepchar (or sepchar (char-to-string py-separator-char))) - prefix erg suffix) - (when (string-match (regexp-quote sepchar) name) - (unless py-modeline-acronym-display-home-p - (when (string-match (concat "^" (expand-file-name "~")) name) - (setq name (replace-regexp-in-string (concat "^" (expand-file-name "~")) "" name)))) - (save-match-data - (setq liste (split-string name sepchar))) - (dolist (ele liste) - (unless (string= "" ele) - (setq prefix (concat prefix (char-to-string (aref ele 0)))))) - (unless py-modeline-display-full-path-p - - (setq name (substring name (1+ (string-match (concat sepchar "[^" sepchar "]+$") name)))))) - (setq erg - (cond ((string= "ipython" name) - (replace-regexp-in-string "ipython" "IPython" name)) - ((string= "jython" name) - (replace-regexp-in-string "jython" "Jython" name)) - ((string= "python" name) - (replace-regexp-in-string "python" "Python" name)) - ((string-match "python2" name) - (replace-regexp-in-string "python2" "Python2" name)) - ((string-match "python3" name) - (replace-regexp-in-string "python3" "Python3" name)) - (t name))) - (when dedicated - (setq erg (make-temp-name (concat erg "-")))) - (cond ((and prefix (string-match "^\*" erg)) - (setq erg (replace-regexp-in-string "^\*" (concat "*" prefix " ") erg))) - (prefix - (setq erg (concat "*" prefix " " erg "*"))) - - (t (setq erg (concat "*" erg "*")))) - erg)) - -(defun py-delete-numbers-and-stars-from-string (string) - "Delete numbering and star chars from string, return result. - -Needed when file-path names are contructed from maybe numbered buffer names like \"\*Python\*<2> \"" - (replace-regexp-in-string - "<\\([0-9]+\\)>" "" - (replace-regexp-in-string - "\*" "" - string))) - -(defun py-shell-manage-windows (switch py-split-windows-on-execute-p py-switch-buffers-on-execute-p oldbuf py-buffer-name) - (delete-other-windows) - (window-configuration-to-register 213465889) - (cond (;; split and switch - (unless (eq switch 'noswitch) - (and py-split-windows-on-execute-p - (or (eq switch 'switch) - py-switch-buffers-on-execute-p))) - (unless (string-match "[Ii][Pp]ython" py-buffer-name) (delete-other-windows)) - (when (< (count-windows) 2) - (funcall py-split-windows-on-execute-function)) - (pop-to-buffer py-buffer-name)) - ;; split, not switch - ((and py-split-windows-on-execute-p - (or (eq switch 'noswitch) - (not (eq switch 'switch)))) - (if (< (count-windows) 2) - (progn - (funcall py-split-windows-on-execute-function) - (display-buffer py-buffer-name) - ;; avoids windows flip top-down - by side-effect? - (window-configuration-to-register 213465889)) - (window-configuration-to-register 213465889)) - (jump-to-register 213465889) - (display-buffer oldbuf) - (pop-to-buffer oldbuf)) - ;; no split, switch - ((or (eq switch 'switch) - (and (not (eq switch 'noswitch)) - py-switch-buffers-on-execute-p)) - (pop-to-buffer py-buffer-name) - (goto-char (point-max))) - ;; no split, no switch - ((or (eq switch 'noswitch) - (not py-switch-buffers-on-execute-p)) - (set-buffer oldbuf) - (switch-to-buffer (current-buffer))))) - -(defun py-report-executable (py-buffer-name) - (let ((erg (downcase (replace-regexp-in-string - "<\\([0-9]+\\)>" "" - (replace-regexp-in-string - "\*" "" - (if - (string-match " " py-buffer-name) - (substring py-buffer-name (1+ (string-match " " py-buffer-name))) - py-buffer-name)))))) - (when (string-match "-" erg) - (setq erg (substring erg 0 (string-match "-" erg)))) - erg)) - -(defun py-shell-send-setup-code (process) - "Send all setup code for shell. -This function takes the list of setup code to send from the -`python-shell-setup-codes' list." - (accept-process-output process 1) - (dolist (code python-shell-setup-codes) - (python-shell-send-string-no-output - (symbol-value code) process) - (sit-for 0.1))) - -(defun py-shell (&optional argprompt dedicated pyshellname switch sepchar py-buffer-name done) - "Start an interactive Python interpreter in another window. - -Interactively, \\[universal-argument] 4 prompts for a buffer. -\\[universal-argument] 2 prompts for `py-python-command-args'. -If `default-directory' is a remote file name, it is also prompted -to change if called with a prefix arg. - -Returns py-shell's buffer-name. -Optional string PYSHELLNAME overrides default `py-shell-name'. -Optional symbol SWITCH ('switch/'noswitch) precedes `py-switch-buffers-on-execute-p' -When SEPCHAR is given, `py-shell' must not detect the file-separator. -BUFFER allows specifying a name, the Python process is connected to -When DONE is `t', `py-shell-manage-windows' is omitted -" - (interactive "P") - (if (or argprompt dedicated pyshellname switch sepchar py-buffer-name done (interactive-p)) - (let* ((sepchar (or sepchar (char-to-string py-separator-char))) - (args py-python-command-args) - (oldbuf (current-buffer)) - (path (getenv "PYTHONPATH")) - ;; make classic python.el forms usable, to import emacs.py - (process-environment - (cons (concat "PYTHONPATH=" - (if path (concat path path-separator)) - data-directory) - process-environment)) - ;; proc - (py-buffer-name - (or py-buffer-name - (when argprompt - (cond - ((eq 4 (prefix-numeric-value argprompt)) - (setq py-buffer-name - (prog1 - (read-buffer "Py-Shell buffer: " - (generate-new-buffer-name (py-buffer-name-prepare (or pyshellname py-shell-name) sepchar))) - (if (file-remote-p default-directory) - ;; It must be possible to declare a local default-directory. - (setq default-directory - (expand-file-name - (read-file-name - "Default directory: " default-directory default-directory - t nil 'file-directory-p))))))) - ((and (eq 2 (prefix-numeric-value argprompt)) - (fboundp 'split-string)) - (setq args (split-string - (read-string "Py-Shell arguments: " - (concat - (mapconcat 'identity py-python-command-args " ") " "))))))))) - (pyshellname (or pyshellname - (if (or (null py-shell-name)(string= "" py-shell-name)) - (py-choose-shell) - py-shell-name))) - ;; If we use a pipe, Unicode characters are not printed - ;; correctly (Bug#5794) and IPython does not work at - ;; all (Bug#5390). python.el - (process-connection-type t) - ;; already in py-choose-shell - (py-use-local-default - (if (not (string= "" py-shell-local-path)) - (expand-file-name py-shell-local-path) - (when py-use-local-default - (error "Abort: `py-use-local-default' is set to `t' but `py-shell-local-path' is empty. Maybe call `py-toggle-local-default-use'")))) - (py-buffer-name-prepare (unless py-buffer-name - (py-buffer-name-prepare (or pyshellname py-shell-name) sepchar dedicated))) - (py-buffer-name (or py-buffer-name py-buffer-name-prepare)) - (executable (cond (pyshellname) - (py-buffer-name - (py-report-executable py-buffer-name)))) - proc) - (set-buffer (apply 'make-comint-in-buffer executable py-buffer-name executable nil args)) - (set (make-local-variable 'comint-prompt-regexp) - (concat "\\(" - (mapconcat 'identity - (delq nil (list py-shell-input-prompt-1-regexp py-shell-input-prompt-2-regexp ipython-de-input-prompt-regexp ipython-de-output-prompt-regexp py-pdbtrack-input-prompt py-pydbtrack-input-prompt)) - "\\|") - "\\)")) - (set (make-local-variable 'comint-input-filter) 'py-history-input-filter) - - (set (make-local-variable 'comint-use-prompt-regexp) t) - (set (make-local-variable 'compilation-error-regexp-alist) - python-compilation-regexp-alist) - (setq completion-at-point-functions nil) - ;; (py-set-shell-complete-function) - ;; (if py-complete-function - ;; (add-hook 'completion-at-point-functions - ;; py-complete-function nil 'local) - ;; (add-hook 'completion-at-point-functions - ;; 'py-shell-complete nil 'local)) - (add-hook 'comint-preoutput-filter-functions #'python-preoutput-filter - nil t) - (if py-fontify-shell-buffer-p - (progn - (set (make-local-variable 'font-lock-defaults) - '(python-font-lock-keywords nil nil nil nil - (font-lock-syntactic-keywords - . python-font-lock-syntactic-keywords))) - (set (make-local-variable 'comment-start) "# ") - (set (make-local-variable 'comment-start-skip) "^[ \t]*#+ *") - (set (make-local-variable 'comment-column) 40) - (set (make-local-variable 'comment-indent-function) #'py-comment-indent-function) - (set (make-local-variable 'indent-region-function) 'py-indent-region) - (set (make-local-variable 'indent-line-function) 'py-indent-line) - (font-lock-fontify-buffer)) - (font-lock-unfontify-region (point-min) (line-beginning-position))) - (setq python-buffer (current-buffer)) - ;; (accept-process-output (get-buffer-process python-buffer) 5) - (setq proc (get-buffer-process (current-buffer))) - (goto-char (point-max)) - (move-marker (process-mark proc) (point-max)) - ;; (funcall (process-filter proc) proc "") - (py-shell-send-setup-code proc) - ;; (accept-process-output proc 1) - (compilation-shell-minor-mode 1) - ;; (sit-for 0.1) - (setq comint-input-sender 'py-shell-simple-send) - (setq comint-input-ring-file-name - (cond ((string-match "[iI][pP]ython[[:alnum:]]*$" py-buffer-name) - (if (getenv "IPYTHONDIR") - (concat (getenv "IPYTHONDIR") "/history") - "~/.ipython/history")) - ((getenv "PYTHONHISTORY") - (concat (getenv "PYTHONHISTORY") "/" (py-report-executable py-buffer-name) "_history")) - (dedicated - (concat "~/." (substring py-buffer-name 0 (string-match "-" py-buffer-name)) "_history")) - ;; .pyhistory might be locked from outside Emacs - ;; (t "~/.pyhistory") - (t (concat "~/." (py-report-executable py-buffer-name) "_history")))) - (comint-read-input-ring t) - (set-process-sentinel (get-buffer-process (current-buffer)) - #'shell-write-history-on-exit) - ;; pdbtrack - ;; (add-hook 'comint-output-filter-functions 'py-pdbtrack-track-stack-file) - (setq py-pdbtrack-do-tracking-p t) - ;; - (set-syntax-table python-mode-syntax-table) - (ansi-color-for-comint-mode-on) - (use-local-map py-shell-map) - ;; (add-hook 'py-shell-hook 'py-dirstack-hook) - (when py-shell-hook (run-hooks 'py-shell-hook)) - (if (and (interactive-p) py-shell-switch-buffers-on-execute-p) - (pop-to-buffer py-buffer-name) - (unless done (py-shell-manage-windows switch py-split-windows-on-execute-p py-switch-buffers-on-execute-p oldbuf py-buffer-name))) - py-buffer-name) - (cond ((comint-check-proc (current-buffer)) - (buffer-name (current-buffer))) - ((comint-check-proc py-buffer-name) - py-buffer-name)))) - -(defalias 'iyp 'ipython) -(defalias 'ipy 'ipython) -;;; Named shells -(defun python (&optional argprompt dedicated switch) - "Start an Python interpreter. - -Optional \\[universal-argument] prompts for options to pass to the Python interpreter. See `py-python-command-args'. - Optional DEDICATED SWITCH are provided for use from programs. " - (interactive "P") - (py-shell argprompt dedicated "python" switch)) - -(defalias 'ipyhton 'ipython) -(defalias 'iypthon 'ipython) -(defun ipython (&optional argprompt dedicated switch) - "Start an IPython interpreter. - -Optional \\[universal-argument] prompts for options to pass to the IPython interpreter. See `py-python-command-args'. - Optional DEDICATED SWITCH are provided for use from programs. " - (interactive "P") - (py-shell argprompt dedicated "ipython" switch)) - -(defun python3 (&optional argprompt dedicated switch) - "Start an Python3 interpreter. - -Optional \\[universal-argument] prompts for options to pass to the Python3 interpreter. See `py-python-command-args'. - Optional DEDICATED SWITCH are provided for use from programs. " - (interactive "P") - (py-shell argprompt dedicated "python3" switch)) - -(defun python2 (&optional argprompt dedicated switch) - "Start an Python2 interpreter. - -Optional \\[universal-argument] prompts for options to pass to the Python2 interpreter. See `py-python-command-args'. - Optional DEDICATED SWITCH are provided for use from programs. " - (interactive "P") - (py-shell argprompt dedicated "python2" switch)) - -(defun python2.7 (&optional argprompt dedicated switch) - "Start an Python2.7 interpreter. - -Optional \\[universal-argument] prompts for options to pass to the Python2.7 interpreter. See `py-python-command-args'. - Optional DEDICATED SWITCH are provided for use from programs. " - (interactive "P") - (py-shell argprompt dedicated "python2.7" switch)) - -(defun jython (&optional argprompt dedicated switch) - "Start an Jython interpreter. - -Optional \\[universal-argument] prompts for options to pass to the Jython interpreter. See `py-python-command-args'. - Optional DEDICATED SWITCH are provided for use from programs. " - (interactive "P") - (py-shell argprompt dedicated "jython" switch)) - -(defun bpython (&optional argprompt dedicated switch) - "Start an BPython interpreter. - -Optional \\[universal-argument] prompts for options to pass to the Jython interpreter. See `py-python-command-args'. - Optional DEDICATED SWITCH are provided for use from programs. " - (interactive "P") - (py-shell argprompt dedicated "bpython" switch)) - -(defun python3.2 (&optional argprompt dedicated switch) - "Start an Python3.2 interpreter. - -Optional \\[universal-argument] prompts for options to pass to the Python3.2 interpreter. See `py-python-command-args'. - Optional DEDICATED SWITCH are provided for use from programs. " - (interactive "P") - (py-shell argprompt dedicated "python3.2" switch)) - -;; dedicated -(defun python-dedicated (&optional argprompt switch) - "Start an unique Python interpreter in another window. - -Optional \\[universal-argument] prompts for options to pass to the Python interpreter. See `py-python-command-args'." - (interactive "P") - (py-shell argprompt t "python" switch)) - -(defun ipython-dedicated (&optional argprompt switch) - "Start an unique IPython interpreter in another window. - -Optional \\[universal-argument] prompts for options to pass to the IPython interpreter. See `py-python-command-args'." - (interactive "P") - (py-shell argprompt t "ipython" switch)) - -(defun python3-dedicated (&optional argprompt switch) - "Start an unique Python3 interpreter in another window. - -Optional \\[universal-argument] prompts for options to pass to the Python3 interpreter. See `py-python-command-args'." - (interactive "P") - (py-shell argprompt t "python3" switch)) - -(defun python2-dedicated (&optional argprompt switch) - "Start an unique Python2 interpreter in another window. - -Optional \\[universal-argument] prompts for options to pass to the Python2 interpreter. See `py-python-command-args'." - (interactive "P") - (py-shell argprompt t "python2" switch)) - -(defun python2.7-dedicated (&optional argprompt switch) - "Start an unique Python2.7 interpreter in another window. - -Optional \\[universal-argument] prompts for options to pass to the Python2.7 interpreter. See `py-python-command-args'." - (interactive "P") - (py-shell argprompt t "python2.7" switch)) - -(defun jython-dedicated (&optional argprompt switch) - "Start an unique Jython interpreter in another window. - -Optional \\[universal-argument] prompts for options to pass to the Jython interpreter. See `py-python-command-args'." - (interactive "P") - (py-shell argprompt t "jython" switch)) - -(defun python3.2-dedicated (&optional argprompt switch) - "Start an unique Python3.2 interpreter in another window. - -Optional \\[universal-argument] prompts for options to pass to the Python3.2 interpreter. See `py-python-command-args'." - (interactive "P") - (py-shell argprompt t "python3.2" switch)) - -;; switch -(defun python-switch (&optional argprompt dedicated) - "Switch to Python interpreter in another window. - -Optional \\[universal-argument] prompts for options to pass to the Python interpreter. See `py-python-command-args'." - (interactive "P") - (py-shell argprompt dedicated "python" 'switch)) - -(defun ipython-switch (&optional argprompt dedicated) - "Switch to IPython interpreter in another window. - -Optional \\[universal-argument] prompts for options to pass to the IPython interpreter. See `py-python-command-args'." - (interactive "P") - (py-shell argprompt dedicated "ipython" 'switch)) - -(defun python3-switch (&optional argprompt dedicated) - "Switch to Python3 interpreter in another window. - -Optional \\[universal-argument] prompts for options to pass to the Python3 interpreter. See `py-python-command-args'." - (interactive "P") - (py-shell argprompt dedicated "python3" 'switch)) - -(defun python2-switch (&optional argprompt dedicated) - "Switch to Python2 interpreter in another window. - -Optional \\[universal-argument] prompts for options to pass to the Python2 interpreter. See `py-python-command-args'." - (interactive "P") - (py-shell argprompt dedicated "python2" 'switch)) - -(defun python2.7-switch (&optional argprompt dedicated) - "Switch to Python2.7 interpreter in another window. - -Optional \\[universal-argument] prompts for options to pass to the Python2.7 interpreter. See `py-python-command-args'." - (interactive "P") - (py-shell argprompt dedicated "python2.7" 'switch)) - -(defun jython-switch (&optional argprompt dedicated) - "Switch to Jython interpreter in another window. - -Optional \\[universal-argument] prompts for options to pass to the Jython interpreter. See `py-python-command-args'." - (interactive "P") - (py-shell argprompt dedicated "jython" 'switch)) - -(defun python3.2-switch (&optional argprompt dedicated) - "Switch to Python3.2 interpreter in another window. - -Optional \\[universal-argument] prompts for options to pass to the Python3.2 interpreter. See `py-python-command-args'." - (interactive "P") - (py-shell argprompt dedicated "python3.2" 'switch)) - -(defun python-no-switch (&optional argprompt dedicated) - "Open an Python interpreter in another window, but do not switch to it. - -Optional \\[universal-argument] prompts for options to pass to the Python interpreter. See `py-python-command-args'." - (interactive "P") - (py-shell argprompt dedicated "python" 'noswitch)) - -(defun ipython-no-switch (&optional argprompt dedicated) - "Open an IPython interpreter in another window, but do not switch to it. - -Optional \\[universal-argument] prompts for options to pass to the IPython interpreter. See `py-python-command-args'." - (interactive "P") - (py-shell argprompt dedicated "ipython" 'noswitch)) - -(defun python3-no-switch (&optional argprompt dedicated) - "Open an Python3 interpreter in another window, but do not switch to it. - -Optional \\[universal-argument] prompts for options to pass to the Python3 interpreter. See `py-python-command-args'." - (interactive "P") - (py-shell argprompt dedicated "python3" 'noswitch)) - -(defun python2-no-switch (&optional argprompt dedicated) - "Open an Python2 interpreter in another window, but do not switch to it. - -Optional \\[universal-argument] prompts for options to pass to the Python2 interpreter. See `py-python-command-args'." - (interactive "P") - (py-shell argprompt dedicated "python2" 'noswitch)) - -(defun python2.7-no-switch (&optional argprompt dedicated) - "Open an Python2.7 interpreter in another window, but do not switch to it. - -Optional \\[universal-argument] prompts for options to pass to the Python2.7 interpreter. See `py-python-command-args'." - (interactive "P") - (py-shell argprompt dedicated "python2.7" 'noswitch)) - -(defun jython-no-switch (&optional argprompt dedicated) - "Open an Jython interpreter in another window, but do not switch to it. - -Optional \\[universal-argument] prompts for options to pass to the Jython interpreter. See `py-python-command-args'." - (interactive "P") - (py-shell argprompt dedicated "jython" 'noswitch)) - -(defun python3.2-no-switch (&optional argprompt dedicated) - "Open an Python3.2 interpreter in another window, but do not switch to it. - -Optional \\[universal-argument] prompts for options to pass to the Python3.2 interpreter. See `py-python-command-args'." - (interactive "P") - (py-shell argprompt dedicated "python3.2" 'noswitch)) - -(defalias 'python-dedicated-switch 'python-switch-dedicated) -(defun python-switch-dedicated (&optional argprompt) - "Switch to an unique Python interpreter in another window. - -Optional \\[universal-argument] prompts for options to pass to the Python interpreter. See `py-python-command-args'." - (interactive "P") - (py-shell argprompt t "python" 'switch)) - -(defalias 'ipython-dedicated-switch 'ipython-switch-dedicated) -(defun ipython-switch-dedicated (&optional argprompt) - "Switch to an unique IPython interpreter in another window. - -Optional \\[universal-argument] prompts for options to pass to the IPython interpreter. See `py-python-command-args'." - (interactive "P") - (py-shell argprompt t "ipython" 'switch)) - -(defalias 'python3-dedicated-switch 'python3-switch-dedicated) -(defun python3-switch-dedicated (&optional argprompt) - "Switch to an unique Python3 interpreter in another window. - -Optional \\[universal-argument] prompts for options to pass to the Python3 interpreter. See `py-python-command-args'." - (interactive "P") - (py-shell argprompt t "python3" 'switch)) - -(defalias 'python2-dedicated-switch 'python2-switch-dedicated) -(defun python2-switch-dedicated (&optional argprompt) - "Switch to an unique Python2 interpreter in another window. - -Optional \\[universal-argument] prompts for options to pass to the Python2 interpreter. See `py-python-command-args'." - (interactive "P") - (py-shell argprompt t "python2" 'switch)) - -(defalias 'python2.7-dedicated-switch 'python2.7-switch-dedicated) -(defun python2.7-switch-dedicated (&optional argprompt) - "Switch to an unique Python2.7 interpreter in another window. - -Optional \\[universal-argument] prompts for options to pass to the Python2.7 interpreter. See `py-python-command-args'." - (interactive "P") - (py-shell argprompt t "python2.7" 'switch)) - -(defalias 'jython-dedicated-switch 'jython-switch-dedicated) -(defun jython-switch-dedicated (&optional argprompt) - "Switch to an unique Jython interpreter in another window. - -Optional \\[universal-argument] prompts for options to pass to the Jython interpreter. See `py-python-command-args'." - (interactive "P") - (py-shell argprompt t "jython" 'switch)) - -(defalias 'python3.2-dedicated-switch 'python3.2-switch-dedicated) -(defun python3.2-switch-dedicated (&optional argprompt) - "Switch to an unique Python3.2 interpreter in another window. - -Optional \\[universal-argument] prompts for options to pass to the Python3.2 interpreter. See `py-python-command-args'." - (interactive "P") - (py-shell argprompt t "python3.2" 'switch)) - - -;;; Code execution commands -(declare-function compilation-shell-minor-mode "compile" (&optional arg)) - -(defun py-which-execute-file-command (filename) - "Return the command appropriate to Python version. - -Per default it's \"(format \"execfile(r'%s') # PYTHON-MODE\\n\" filename)\" for Python 2 series." - (interactive) - (let* ((erg (py-which-python)) - (cmd (if (< erg 3) - (format "execfile(r'%s') # PYTHON-MODE\n" filename) - (format "exec(compile(open('%s').read(), '%s', 'exec')) # PYTHON-MODE\n" filename filename)))) - (when (and py-verbose-p (interactive-p)) (message "%s" (prin1-to-string cmd))) - cmd)) - -(defun py-execute-region-no-switch (start end &optional shell dedicated) - "Send the region to a Python interpreter. - -Ignores setting of `py-switch-buffers-on-execute-p', buffer with region stays current. - " - (interactive "r\nP") - (py-execute-base start end py-shell-name dedicated 'noswitch)) - -(defun py-execute-region-switch (start end &optional shell dedicated) - "Send the region to a Python interpreter. - -Ignores setting of `py-switch-buffers-on-execute-p', output-buffer will being switched to. -" - (interactive "r\nP") - (py-execute-base start end py-shell-name dedicated 'switch)) - -(defun py-execute-region (start end &optional shell dedicated switch) - "Send the region to a Python interpreter. - -When called with \\[univeral-argument], execution through `default-value' of `py-shell-name' is forced. -When called with \\[univeral-argument] followed by a number different from 4 and 1, user is prompted to specify a shell. This might be the name of a system-wide shell or include the path to a virtual environment. - -When called from a programm, it accepts a string specifying a shell which will be forced upon execute as argument. - -Optional arguments DEDICATED (boolean) and SWITCH (symbols 'noswitch/'switch) -" - (interactive "r\nP") - (let ((shell (cond ((and py-force-local-shell-p py-force-py-shell-name-p) - py-shell-name) - ((or py-force-py-shell-name-p (eq 4 (prefix-numeric-value shell))) (default-value 'py-shell-name)) - ((and (numberp shell) (not (eq 1 (prefix-numeric-value shell)))) - (read-from-minibuffer "(path-to-)shell-name: " (default-value 'py-shell-name))) - (t shell)))) - (py-execute-base start end shell dedicated switch))) - -(defun py-execute-region-default (start end &optional dedicated) - "Send the region to the systems default Python interpreter. -See also `py-execute-region'. " - (interactive "r\nP") - (py-execute-base start end (default-value 'py-shell-name) dedicated)) - -(defun py-execute-region-dedicated (start end &optional shell) - "Get the region processed by an unique Python interpreter. - -When called with \\[univeral-argument], execution through `default-value' of `py-shell-name' is forced. -When called with \\[univeral-argument] followed by a number different from 4 and 1, user is prompted to specify a shell. This might be the name of a system-wide shell or include the path to a virtual environment. - -When called from a programm, it accepts a string specifying a shell which will be forced upon execute as argument. " - (interactive "r\nP") - (let ((shell (cond ((eq 4 (prefix-numeric-value shell)) (default-value 'py-shell-name)) - ((and (numberp shell) (not (eq 1 (prefix-numeric-value shell)))) - (read-from-minibuffer "(path-to-)shell-name: " (default-value 'py-shell-name))) - (t shell)))) - (py-execute-base start end shell t))) - -(defalias 'py-execute-region-dedicated-default 'py-execute-region-default-dedicated) -(defun py-execute-region-default-dedicated (start end) - "Send the region to an unique shell of systems default Python. " - (interactive "r") - (py-execute-base start end (default-value 'py-shell-name) t)) - -(defun py-execute-base (start end &optional pyshellname dedicated switch nostars sepchar) - "Adapt the variables used in the process. " - (let* ((oldbuf (current-buffer)) - (pyshellname (or pyshellname (py-choose-shell))) - (py-execute-directory (or (ignore-errors (file-name-directory (buffer-file-name)))(getenv "WORKON_HOME")(getenv "HOME"))) - (strg (buffer-substring-no-properties start end)) - (sepchar (or sepchar (char-to-string py-separator-char))) - (py-buffer-name (py-buffer-name-prepare pyshellname sepchar)) - (temp (make-temp-name - (concat (replace-regexp-in-string (regexp-quote sepchar) "-" (replace-regexp-in-string (concat "^" (regexp-quote sepchar)) "" (replace-regexp-in-string ":" "-" pyshellname))) "-"))) - (file (concat (expand-file-name py-temp-directory) sepchar (replace-regexp-in-string (regexp-quote sepchar) "-" temp) ".py")) - (filebuf (get-buffer-create file)) - (proc (if dedicated - (get-buffer-process (py-shell nil dedicated pyshellname switch sepchar py-buffer-name t)) - (or (get-buffer-process (py-buffer-name-prepare pyshellname)) - (get-buffer-process (py-shell nil dedicated pyshellname switch sepchar py-buffer-name t))))) - (procbuf (process-buffer proc)) - (pec (if (string-match "[pP]ython ?3" py-buffer-name) - (format "exec(compile(open('%s').read(), '%s', 'exec')) # PYTHON-MODE\n" file file) - (format "execfile(r'%s') # PYTHON-MODE\n" file))) - (wholebuf (when (boundp 'wholebuf) wholebuf)) - (comint-scroll-to-bottom-on-output t) - erg) - (set-buffer filebuf) - (erase-buffer) - (insert strg) - (py-fix-start (point-min)(point-max)) - (py-if-needed-insert-shell (prin1-to-string proc) sepchar) - (unless wholebuf (py-insert-coding)) - (unless (string-match "[jJ]ython" pyshellname) (py-insert-execute-directory)) - (cond (python-mode-v5-behavior-p - - (let ((cmd (concat pyshellname (if (string-equal py-which-bufname - "Jython") - " -" " -c ")))) - (save-excursion - (set-buffer filebuf) - (shell-command-on-region (point-min) (point-max) - cmd py-output-buffer)) - (if (not (get-buffer py-output-buffer)) - (message "No output.") - (setq py-exception-buffer (current-buffer)) - (let ((err-p (py-postprocess-output-buffer py-output-buffer))) - ;; (when py-switch-buffers-on-execute-p - (pop-to-buffer py-output-buffer) - ;; ) - (if err-p - (pop-to-buffer py-exception-buffer)))))) - (t (set-buffer filebuf) - (write-region (point-min) (point-max) file nil t nil 'ask) - (set-buffer-modified-p 'nil) - (kill-buffer filebuf) - (if (file-readable-p file) - (progn - (when (string-match "ipython" (process-name proc)) - (sit-for py-ipython-execute-delay)) - (setq erg (py-execute-file-base proc file pec procbuf)) - (setq py-exception-buffer (cons file (current-buffer))) - (py-shell-manage-windows switch py-split-windows-on-execute-p py-switch-buffers-on-execute-p oldbuf py-buffer-name) - (unless (string= (buffer-name (current-buffer)) (buffer-name procbuf)) - (when py-verbose-p (message "Output buffer: %s" procbuf))) - (sit-for 0.1) - (unless py-execute-keep-temporary-file-p - (delete-file file) - (when (buffer-live-p file) - (kill-buffer file))) - erg) - (message "%s not readable. %s" file "Do you have write permissions?")))))) - -(defun py-execute-string (&optional string shell dedicated) - "Send the argument STRING to a Python interpreter. - -See also `py-execute-region'. " - (interactive) - (let ((string (or string (read-from-minibuffer "String: "))) - (shell (or shell (default-value 'py-shell-name)))) - (with-temp-buffer - (insert string) - (py-execute-region (point-min) (point-max) shell dedicated)))) - -(defun py-execute-string-dedicated (&optional string shell) - "Send the argument STRING to an unique Python interpreter. - -See also `py-execute-region'. " - (interactive) - (let ((string (or string (read-from-minibuffer "String: "))) - (shell (or shell (default-value 'py-shell-name)))) - (with-temp-buffer - (insert string) - (py-execute-region (point-min) (point-max) shell t)))) - -(defun py-if-needed-insert-shell (&optional name sepchar) - (let ((erg (or name - (py-choose-shell-by-shebang) - (py-choose-shell-by-import) - py-shell-name)) - (sepchar (or sepchar (char-to-string py-separator-char)))) - (when (string-match " " erg) (setq erg (substring erg (1+ (string-match " " erg)))) - ;; closing ">" - (setq erg (substring erg 0 (1- (length erg))))) - (goto-char (point-min)) - (while (empty-line-p) (delete-region (point) (1+ (line-end-position)))) - (unless (looking-at py-shebang-regexp) - (if (string-match (concat "^" erg) "ipython") - (progn - (shell-command "type ipython" t) - (switch-to-buffer (current-buffer)) - (when (looking-at "[^/\n\r]+") - (replace-match "#! "))) - (if (string-match (regexp-quote sepchar) erg) - (insert (concat "#! " erg "\n\n")) - (insert (concat py-shebang-startstring " " erg "\n\n"))))))) - -(defun py-insert-execute-directory () - (goto-char (point-min)) - (if (re-search-forward py-encoding-string-re nil (quote move)) - (progn - (newline) - (insert (concat "import os; os.chdir(\"" py-execute-directory "\")\n"))) - (goto-char (point-min)) - (forward-line 2) - (newline) - (insert (concat "import os; os.chdir(\"" py-execute-directory "\")\n")))) - -(defun py-insert-coding () - ;; (switch-to-buffer (current-buffer)) - (goto-char (point-min)) - (unless (re-search-forward py-encoding-string-re nil t) - (goto-char (point-min)) - (if (re-search-forward py-shebang-regexp nil t 1) - (progn - (newline) - (insert (concat py-encoding-string "\n"))) - (insert (concat py-encoding-string "\n"))))) - -(defun py-if-needed-insert-if () - "Internal use by py-execute... functions. -Inserts an incentive true form \"if 1:\\n.\" " - (let ((needs-if (/= (py-point 'bol) (py-point 'boi)))) - (when needs-if - (insert "if 1:\n") - (setq py-line-number-offset (- py-line-number-offset 1))))) - -(defun py-fix-start (start end) - "Internal use by py-execute... functions. -Avoid empty lines at the beginning. " - (goto-char start) - (let ((beg (copy-marker start))) - (while (empty-line-p) - (delete-region (line-beginning-position) (1+ (line-end-position)))) - (back-to-indentation) - (unless (eq (current-indentation) 0) - (py-shift-left (current-indentation) start end)) - (setq py-line-number-offset (count-lines 1 start)) - beg)) - -(defun py-fetch-py-master-file () - "Lookup if a `py-master-file' is specified. - -See also doku of variable `py-master-file' " - (interactive) - (save-excursion - (save-restriction - (widen) - (goto-char (point-min)) - (when (re-search-forward "^ *# Local Variables:" nil (quote move) 1) - (when - (re-search-forward (concat "^\\( *# py-master-file: *\\)\"\\([^ \t]+\\)\" *$") nil t 1) - (setq py-master-file (match-string-no-properties 2)))))) - (when (and py-verbose-p (interactive-p)) (message "%s" py-master-file))) - -(defun py-execute-import-or-reload (&optional argprompt shell dedicated) - "Import the current buffer's file in a Python interpreter. - -If the file has already been imported, then do reload instead to get -the latest version. - -If the file's name does not end in \".py\", then do execfile instead. - -If the current buffer is not visiting a file, do `py-execute-buffer' -instead. - -If the file local variable `py-master-file' is non-nil, import or -reload the named file instead of the buffer's file. The file may be -saved based on the value of `py-execute-import-or-reload-save-p'. - -See also `\\[py-execute-region]'. - -This may be preferable to `\\[py-execute-buffer]' because: - - - Definitions stay in their module rather than appearing at top - level, where they would clutter the global namespace and not affect - uses of qualified names (MODULE.NAME). - - - The Python debugger gets line number information about the functions." - (interactive "P") - ;; Check file local variable py-master-file - (if py-master-file - (let* ((filename (expand-file-name py-master-file)) - (buffer (or (get-file-buffer filename) - (find-file-noselect filename)))) - (set-buffer buffer))) - (let ((shell (or shell (py-choose-shell argprompt shell dedicated))) - (file (buffer-file-name (current-buffer)))) - (if file - (let ((proc (or - (ignore-errors (get-process (file-name-directory shell))) - (get-buffer-process (py-shell argprompt dedicated (or shell (default-value 'py-shell-name))))))) - ;; Maybe save some buffers - (save-some-buffers (not py-ask-about-save) nil) - (py-execute-file-base proc file - (if (string-match "\\.py$" file) - (let ((m (py-qualified-module-name (expand-file-name file)))) - (if (string-match "python2" (file-name-nondirectory shell)) - (format "import sys\nif sys.modules.has_key('%s'):\n reload(%s)\nelse:\n import %s\n" m m m) - (format "import sys,imp\nif'%s' in sys.modules:\n imp.reload(%s)\nelse:\n import %s\n" m m m))) - ;; (format "execfile(r'%s')\n" file) - (py-which-execute-file-command file)))) - (py-execute-buffer py-shell-name)))) - -(defun py-qualified-module-name (file) - "Find the qualified module name for filename FILE. - -Basically, this goes down the directory tree as long as there are __init__.py files there." - (let ((rec #'(lambda (d f) - (let* ((dir (file-name-directory d)) - (initpy (concat dir "__init__.py"))) - (if (file-exists-p initpy) - (let ((d2 (directory-file-name d))) - (funcall rec (file-name-directory d2) - (concat (file-name-nondirectory d2) "." f))) - f))))) - (funcall rec (file-name-directory file) - (file-name-sans-extension (file-name-nondirectory file))))) - -(defun py-execute-buffer-dedicated (&optional shell) - "Send the contents of the buffer to a unique Python interpreter. - -If the file local variable `py-master-file' is non-nil, execute the -named file instead of the buffer's file. - -If a clipping restriction is in effect, only the accessible portion of the buffer is sent. A trailing newline will be supplied if needed. - -With \\[univeral-argument] user is prompted to specify another then default shell. -See also `\\[py-execute-region]'. " - (interactive "P") - (py-execute-buffer-base shell t)) - -(defun py-execute-buffer-switch (&optional shell dedicated) - "Send the contents of the buffer to a Python interpreter and switches to output. - -If the file local variable `py-master-file' is non-nil, execute the -named file instead of the buffer's file. -If there is a *Python* process buffer, it is used. -If a clipping restriction is in effect, only the accessible portion of the buffer is sent. A trailing newline will be supplied if needed. - -With \\[univeral-argument] user is prompted to specify another then default shell. -See also `\\[py-execute-region]'. " - (interactive "P") - (py-execute-buffer-base shell dedicated 'switch)) - -(defalias 'py-execute-buffer-switch-dedicated 'py-execute-buffer-dedicated-switch) -(defun py-execute-buffer-dedicated-switch (&optional shell) - "Send the contents of the buffer to an unique Python interpreter. - -Ignores setting of `py-switch-buffers-on-execute-p'. -If the file local variable `py-master-file' is non-nil, execute the -named file instead of the buffer's file. - -If a clipping restriction is in effect, only the accessible portion of the buffer is sent. A trailing newline will be supplied if needed. - -With \\[univeral-argument] user is prompted to specify another then default shell. -See also `\\[py-execute-region]'. " - (interactive "P") - (py-execute-buffer-base shell t 'switch)) - -(defun py-execute-buffer (&optional shell dedicated switch) - "Send the contents of the buffer to a Python interpreter. - -When called with \\[univeral-argument], execution through `default-value' of `py-shell-name' is forced. -When called with \\[univeral-argument] followed by a number different from 4 and 1, user is prompted to specify a shell. This might be the name of a system-wide shell or include the path to a virtual environment. - -If the file local variable `py-master-file' is non-nil, execute the -named file instead of the buffer's file. - -When called from a programm, it accepts a string specifying a shell which will be forced upon execute as argument. - -When called from a programm, it accepts a string specifying a shell which will be forced upon execute as argument. - -Optional arguments DEDICATED (boolean) and SWITCH (symbols 'noswitch/'switch) " - (interactive "P") - (save-excursion - (let ((wholebuf t) - (py-master-file (or py-master-file (py-fetch-py-master-file))) - beg end) - (when py-master-file - (let* ((filename (expand-file-name py-master-file)) - (buffer (or (get-file-buffer filename) - (find-file-noselect filename)))) - (set-buffer buffer))) - (setq beg (point-min)) - (setq end (point-max)) - (py-execute-region beg end shell dedicated switch)))) - -(defun py-execute-buffer-base (&optional shell dedicated switch) - "Honor `py-master-file'. " - (save-excursion - (let ((py-master-file (or py-master-file (py-fetch-py-master-file)))) - (if py-master-file - (let* ((filename (expand-file-name py-master-file)) - (buffer (or (get-file-buffer filename) - (find-file-noselect filename)))) - (set-buffer buffer))) - (py-execute-region (point-min) (point-max) shell dedicated switch)))) - -(defun py-execute-buffer-no-switch (&optional shell dedicated) - "Send the contents of the buffer to a Python interpreter but don't switch to output. - -If the file local variable `py-master-file' is non-nil, execute the -named file instead of the buffer's file. -If there is a *Python* process buffer, it is used. -If a clipping restriction is in effect, only the accessible portion of the buffer is sent. A trailing newline will be supplied if needed. - -With \\[univeral-argument] user is prompted to specify another then default shell. -See also `\\[py-execute-region]'. " - (interactive "P") - (py-execute-buffer-base shell dedicated 'noswitch)) - -;; Fixme: Try to define the function or class within the relevant -;; module, not just at top level. -(defun py-execute-defun () - "Send the current defun (class or method) to the inferior Python process." - (interactive) - (save-excursion (py-execute-region (progn (beginning-of-defun) (point)) - (progn (end-of-defun) (point))))) - -(defun py-process-file (filename &optional output-buffer error-buffer) - "Process \"python filename\". - -Optional OUTPUT-BUFFER and ERROR-BUFFER might be given. " - (interactive "fDatei:") - (let ((coding-system-for-read 'utf-8) - (coding-system-for-write 'utf-8) - (output-buffer (or output-buffer (make-temp-name "py-process-file-output"))) - (cmd (py-choose-shell))) - (unless (buffer-live-p output-buffer) - (set-buffer (get-buffer-create output-buffer))) - (shell-command (concat cmd " " filename) output-buffer error-buffer) - (when (interactive-p) (switch-to-buffer output-buffer)))) - -;;; -(defun py-exec-execfile-region (start end &optional shell) - "Execute the region in a Python interpreter. " - (interactive "r\nP") - (let ((shell (if (eq 4 (prefix-numeric-value shell)) - (read-from-minibuffer "Shell: " (default-value 'py-shell-name)) - py-shell-name))) - (let ((strg (buffer-substring-no-properties start end))) - (py-exec-execfile-base strg shell (interactive-p))))) - -(defun py-exec-execfile-base (strg shell iact) - (let* ((temp (make-temp-name (concat (buffer-name) "-"))) - (file (concat (expand-file-name temp) py-temp-directory ".py")) - (imports (py-find-imports)) - (shell shell) - cmd header) - (with-temp-buffer - (insert imports) - (insert strg) - ;; (py-if-needed-insert-if) - (or shell (setq shell (py-choose-shell))) - (py-insert-coding) - (py-if-needed-insert-shell shell) - (setq header (buffer-substring-no-properties (point-min) (point))) - (switch-to-buffer (current-buffer)) - (setq cmd (py-which-execute-file-command file)) - (write-file file)) - (py-exec-execfile file cmd header (concat temp "-output")) - (set-buffer (concat temp "-output")) - (when iact (switch-to-buffer (current-buffer))) - (when (file-readable-p file) - (delete-file file)) - (when iact (message "Output goes to buffer: %s" temp)) - (concat temp "-output"))) - -(defun py-exec-execfile (filename cmd header &optional output-buffer error-buffer) - "Process \"python filename\", -Optional OUTPUT-BUFFER and ERROR-BUFFER might be given.') -" - (interactive "fDatei:") - (let* ((coding-system-for-read 'utf-8) - (coding-system-for-write 'utf-8) - (exec-execfile (concat (make-temp-name (concat filename "-exec-execfile.py"))))) - (set-buffer (get-buffer-create exec-execfile)) - (insert header) - (insert cmd) - (write-file exec-execfile) - (if output-buffer - (progn - (set-buffer (get-buffer-create output-buffer)) - (erase-buffer) - (switch-to-buffer (current-buffer)) - (shell-command (concat "python " exec-execfile) output-buffer error-buffer)) - (with-temp-buffer - (shell-command (concat "python " exec-execfile) output-buffer error-buffer))))) - -;;; Execute forms -(defun py-execute-statement (&optional shell dedicated switch) - "Send statement at point to a Python interpreter. - -When called with \\[univeral-argument], execution through `default-value' of `py-shell-name' is forced. -See also `py-force-py-shell-name-p'. - -When called with \\[univeral-argument] followed by a number different from 4 and 1, user is prompted to specify a shell. This might be the name of a system-wide shell or include the path to a virtual environment. - -When called from a programm, it accepts a string specifying a shell which will be forced upon execute as argument. - -Optional arguments DEDICATED (boolean) and SWITCH (symbols 'noswitch/'switch)" - (interactive "P") - (save-excursion - (let ((beg (prog1 - (or (py-beginning-of-statement-p) - (py-beginning-of-statement)))) - (end (py-end-of-statement))) - (py-execute-region beg end shell dedicated switch)))) - -(defun py-execute-block (&optional shell dedicated switch) - "Send block at point to a Python interpreter. - -When called with \\[univeral-argument], execution through `default-value' of `py-shell-name' is forced. -See also `py-force-py-shell-name-p'. - -When called with \\[univeral-argument] followed by a number different from 4 and 1, user is prompted to specify a shell. This might be the name of a system-wide shell or include the path to a virtual environment. - -When called from a programm, it accepts a string specifying a shell which will be forced upon execute as argument. - -Optional arguments DEDICATED (boolean) and SWITCH (symbols 'noswitch/'switch)" - (interactive "P") - (save-excursion - (let ((beg (or (py-beginning-of-block-p) - (py-beginning-of-block))) - (end (py-end-of-block))) - (py-execute-region beg end shell dedicated switch)))) - -(defun py-execute-block-or-clause (&optional shell dedicated switch) - "Send block-or-clause at point to a Python interpreter. - -When called with \\[univeral-argument], execution through `default-value' of `py-shell-name' is forced. -See also `py-force-py-shell-name-p'. - -When called with \\[univeral-argument] followed by a number different from 4 and 1, user is prompted to specify a shell. This might be the name of a system-wide shell or include the path to a virtual environment. - -When called from a programm, it accepts a string specifying a shell which will be forced upon execute as argument. - -Optional arguments DEDICATED (boolean) and SWITCH (symbols 'noswitch/'switch)" - (interactive "P") - (save-excursion - (let ((beg (or (py-beginning-of-block-or-clause-p) - (py-beginning-of-block-or-clause))) - (end (py-end-of-block-or-clause))) - (py-execute-region beg end shell dedicated switch)))) - -(defun py-execute-def (&optional shell dedicated switch) - "Send def at point to a Python interpreter. - -When called with \\[univeral-argument], execution through `default-value' of `py-shell-name' is forced. -See also `py-force-py-shell-name-p'. - -When called with \\[univeral-argument] followed by a number different from 4 and 1, user is prompted to specify a shell. This might be the name of a system-wide shell or include the path to a virtual environment. - -When called from a programm, it accepts a string specifying a shell which will be forced upon execute as argument. - -Optional arguments DEDICATED (boolean) and SWITCH (symbols 'noswitch/'switch)" - (interactive "P") - (save-excursion - (let ((beg (or (py-beginning-of-def-p) - (py-beginning-of-def))) - (end (py-end-of-def))) - (py-execute-region beg end shell dedicated switch)))) - -(defun py-execute-class (&optional shell dedicated switch) - "Send class at point to a Python interpreter. - -When called with \\[univeral-argument], execution through `default-value' of `py-shell-name' is forced. -See also `py-force-py-shell-name-p'. - -When called with \\[univeral-argument] followed by a number different from 4 and 1, user is prompted to specify a shell. This might be the name of a system-wide shell or include the path to a virtual environment. - -When called from a programm, it accepts a string specifying a shell which will be forced upon execute as argument. - -Optional arguments DEDICATED (boolean) and SWITCH (symbols 'noswitch/'switch)" - (interactive "P") - (save-excursion - (let ((beg (or (py-beginning-of-class-p) - (py-beginning-of-class))) - (end (py-end-of-class))) - (py-execute-region beg end shell dedicated switch)))) - -(defun py-execute-def-or-class (&optional shell dedicated switch) - "Send def-or-class at point to a Python interpreter. - -When called with \\[univeral-argument], execution through `default-value' of `py-shell-name' is forced. -See also `py-force-py-shell-name-p'. - -When called with \\[univeral-argument] followed by a number different from 4 and 1, user is prompted to specify a shell. This might be the name of a system-wide shell or include the path to a virtual environment. - -When called from a programm, it accepts a string specifying a shell which will be forced upon execute as argument. - -Optional arguments DEDICATED (boolean) and SWITCH (symbols 'noswitch/'switch)" - (interactive "P") - (save-excursion - (let ((beg (or (py-beginning-of-def-or-class-p) - (py-beginning-of-def-or-class))) - (end (py-end-of-def-or-class))) - (py-execute-region beg end shell dedicated switch)))) - -(defun py-execute-expression (&optional shell dedicated switch) - "Send expression at point to a Python interpreter. - -When called with \\[univeral-argument], execution through `default-value' of `py-shell-name' is forced. -See also `py-force-py-shell-name-p'. - -When called with \\[univeral-argument] followed by a number different from 4 and 1, user is prompted to specify a shell. This might be the name of a system-wide shell or include the path to a virtual environment. - -When called from a programm, it accepts a string specifying a shell which will be forced upon execute as argument. - -Optional arguments DEDICATED (boolean) and SWITCH (symbols 'noswitch/'switch)" - (interactive "P") - (save-excursion - (let ((beg (or (py-beginning-of-expression-p) - (py-beginning-of-expression))) - (end (py-end-of-expression))) - (py-execute-region beg end shell dedicated switch)))) - -(defun py-execute-partial-expression (&optional shell dedicated switch) - "Send partial-expression at point to a Python interpreter. - -When called with \\[univeral-argument], execution through `default-value' of `py-shell-name' is forced. -See also `py-force-py-shell-name-p'. - -When called with \\[univeral-argument] followed by a number different from 4 and 1, user is prompted to specify a shell. This might be the name of a system-wide shell or include the path to a virtual environment. - -When called from a programm, it accepts a string specifying a shell which will be forced upon execute as argument. - -Optional arguments DEDICATED (boolean) and SWITCH (symbols 'noswitch/'switch)" - (interactive "P") - (save-excursion - (let ((beg (or (py-beginning-of-partial-expression-p) - (py-beginning-of-partial-expression))) - (end (py-end-of-partial-expression))) - (py-execute-region beg end shell dedicated switch)))) - -;;; -(defun py-execute-line () - "Send current line from beginning of indent to Python interpreter. " - (interactive) - (save-excursion - (let ((beg (progn (back-to-indentation) - (point)))) - (py-execute-region beg (line-end-position))))) - -(defun py-execute-file (&optional filename shell dedicated switch) - "When called interactively, user is prompted for filename. " - (interactive "fFile: ") - (let* ((regbuf (current-buffer)) - (file (or (expand-file-name filename) (when (ignore-errors (file-readable-p (buffer-file-name))) (buffer-file-name)))) - (shell (or shell (progn (with-temp-buffer (insert-file-contents file)(py-choose-shell))))) - (name (py-process-name shell dedicated)) - (proc (get-buffer-process (py-shell nil dedicated (or shell (downcase name))))) - (procbuf (if dedicated - (buffer-name (get-buffer (current-buffer))) - (buffer-name (get-buffer (concat "*" name "*"))))) - (pec (if (string-match "Python3" name) - (format "exec(compile(open('%s').read(), '%s', 'exec')) # PYTHON-MODE\n" file file) - (format "execfile(r'%s') # PYTHON-MODE\n" file))) - (comint-scroll-to-bottom-on-output t)) - (if (file-readable-p file) - (progn - (setq erg (py-execute-file-base proc file pec)) - (setq py-exception-buffer (cons file (current-buffer))) - (if (or (eq switch 'switch) - (and (not (eq switch 'noswitch)) py-switch-buffers-on-execute-p)) - (progn - (pop-to-buffer procbuf) - (goto-char (point-max))) - (when (buffer-live-p regbuf) (pop-to-buffer regbuf)) - (when py-verbose-p (message "Output buffer: %s" procbuf))) - (sit-for 0.1) - erg) - (message "File not readable: %s" "Do you have write permissions?")))) - -(defun py-execute-file-base (proc filename &optional cmd procbuf) - "Send to Python interpreter process PROC, in Python version 2.. \"execfile('FILENAME')\". - -Make that process's buffer visible and force display. Also make -comint believe the user typed this string so that -`kill-output-from-shell' does The Right Thing. -Returns position where output starts. " - (let ((procbuf (or procbuf (process-buffer proc))) - (comint-scroll-to-bottom-on-output t) - (msg (format "## executing %s...\n" filename)) - (cmd (cond (cmd) - (py-exec-command) - (t (py-which-execute-file-command filename)))) - erg) - (when py-verbose-p - (unwind-protect - (save-excursion - (set-buffer procbuf) - (funcall (process-filter proc) proc msg)))) - (set-buffer procbuf) - (process-send-string proc cmd) - (setq erg (goto-char (process-mark proc))) - erg)) - -;;: Subprocess utilities and filters -(defvar py-last-exeption-buffer nil - "Internal use only - when `py-up-exception' is called in -source-buffer, this will deliver the exception-buffer again. ") - -(defun py-postprocess-output-buffer (buf) - "Highlight exceptions found in BUF. -If an exception occurred return t, otherwise return nil. BUF must exist." - (let (line file bol err-p) - (save-excursion - (set-buffer buf) - (goto-char (point-min)) - (while (re-search-forward py-traceback-line-re nil t) - (setq file (match-string 1) - line (string-to-number (match-string 2)) - bol (py-point 'bol)) - (overlay-put (make-overlay (match-beginning 0) (match-end 0)) - 'face 'highlight))) - (when (and py-jump-on-exception line) - (beep) - (py-jump-to-exception file line py-line-number-offset) - (setq err-p t)) - err-p)) - -(defun py-jump-to-exception (file line py-line-number-offset) - "Jump to the Python code in FILE at LINE." - (let ((buffer (cond ((string-equal file "<stdin>") - (if (consp py-exception-buffer) - (cdr py-exception-buffer) - py-exception-buffer)) - ((and (consp py-exception-buffer) - (string-equal file (car py-exception-buffer))) - (cdr py-exception-buffer)) - ((ignore-errors (find-file-noselect file))) - ;; could not figure out what file the exception - ;; is pointing to, so prompt for it - (t (find-file (read-file-name "Exception file: " - nil - file t)))))) - ;; Fiddle about with line number - (setq line (+ py-line-number-offset line)) - - (pop-to-buffer buffer) - ;; Force Python mode - (unless(eq major-mode 'python-mode) - (python-mode)) - (goto-char (point-min)) - (forward-line (1- line)) - (message "Jumping to exception in file %s on line %d" file line))) - -(defun py-down-exception (&optional bottom) - "Go to the next line down in the traceback. - -With \\[univeral-argument] (programmatically, optional argument -BOTTOM), jump to the bottom (innermost) exception in the exception -stack." - (interactive "P") - (py-find-next-exception-prepare 'down (when (eq 4 (prefix-numeric-value bottom)) "BOTTOM"))) - -(defun py-up-exception (&optional top) - "Go to the previous line up in the traceback. - -With \\[universal-argument] (programmatically, optional argument TOP) -jump to the top (outermost) exception in the exception stack." - (interactive "P") - (unless py-last-exeption-buffer (setq py-last-exeption-buffer (current-buffer))) - (py-find-next-exception-prepare 'up (when (eq 4 (prefix-numeric-value top)) "TOP"))) - -(defun py-find-next-exception-prepare (direction start) - "Setup exception regexps depending from kind of Python shell. " - (let* ((name (get-process (substring (buffer-name (current-buffer)) 1 -1))) - (buffer (cond (name (buffer-name (current-buffer))) - ((buffer-live-p (get-buffer py-output-buffer)) - py-output-buffer) - (py-last-exeption-buffer (buffer-name py-last-exeption-buffer)) - (t (error "Don't see exeption buffer"))))) - (when buffer (set-buffer (get-buffer buffer))) - (switch-to-buffer (current-buffer)) - (if (eq direction 'up) - (if (string= start "TOP") - (py-find-next-exception 'bob buffer 're-search-forward "Top") - (py-find-next-exception 'bol buffer 're-search-backward "Top")) - (if (string= start "BOTTOM") - (py-find-next-exception 'eob buffer 're-search-backward "Bottom") - (py-find-next-exception 'eol buffer 're-search-forward "Bottom"))))) - -(defun py-find-next-exception (start buffer searchdir errwhere) - "Find the next Python exception and jump to the code that caused it. -START is the buffer position in BUFFER from which to begin searching -for an exception. SEARCHDIR is a function, either -`re-search-backward' or `re-search-forward' indicating the direction -to search. ERRWHERE is used in an error message if the limit (top or -bottom) of the trackback stack is encountered." - (let ((orig (point)) - (origline (py-count-lines)) - file line pos) - (goto-char (py-point start)) - (if (funcall searchdir py-traceback-line-re nil t) - (if (save-match-data (eq (py-count-lines) origline)) - (progn - (forward-line (if (string= errwhere "Top") -1 1)) - (py-find-next-exception start buffer searchdir errwhere)) - (if (not (save-match-data (string-match "^IPython\\|^In \\[[0-9]+\\]: *\\|^>>>" (match-string-no-properties 0)))) - (progn - (setq py-last-exeption-buffer (current-buffer)) - (if (save-match-data (string-match "File" (match-string-no-properties 0))) - (progn - (setq file (match-string-no-properties 2) - pos (point) - line (string-to-number (match-string-no-properties 3)))) - (save-excursion - ;; file and line-number are in different lines - (setq line (string-to-number (match-string-no-properties 1)) - pos (point) - file (progn - (when (and (re-search-backward "\\(^IPython\\|^In \\[[0-9]+\\]: *\\|^>>>\\|^[^\t >]+\\)>?[ \t]+in[ \t]+\\([^ \t\n]+\\)" nil t 1) - (not (save-match-data (string-match "<\\|^IPython\\|^In \\[[0-9]+\\]: *\\|^>>>" (match-string-no-properties 1))))) - (match-string-no-properties 1)))))) - (if file - (when (string-match ".+\.pyc" file) - (setq file (substring file 0 -1))) - (error "%s of traceback" errwhere)) - (if (and file line) - (if - (and (string= "<stdin>" file) (eq 1 line)) - (error "%s of traceback" errwhere) - (py-jump-to-exception file line py-line-number-offset)) - (error "%s of traceback" errwhere))) - (goto-char orig) - (error "%s of traceback" errwhere)))))) - -;;; python-mode-send.el - -(defun py-output-buffer-filter (&optional beg end) - "Clear output buffer from py-shell-input prompt etc. " - (interactive "*") - (let ((beg (cond (beg) - ((region-active-p) - (region-beginning)) - (t (point-min)))) - (end (cond (end (copy-marker end)) - ((region-active-p) - (copy-marker (region-end))) - (t (copy-marker (point-max)))))) - (goto-char beg) - (while (re-search-forward (concat "\\(" py-shell-input-prompt-1-regexp "\\|" py-shell-input-prompt-2-regexp "\\|" "^In \\[[0-9]+\\]: *" "\\)") nil (quote move) 1) - (replace-match "")) - (goto-char beg))) - -(defun py-send-string (string &optional process) - "Evaluate STRING in inferior Python process." - (interactive "sPython command: ") - (let ((proc (or process (py-shell)))) - (comint-send-string proc string) - (unless (string-match "\n\\'" string) - ;; Make sure the text is properly LF-terminated. - (comint-send-string proc "\n")) - (when (string-match "\n[ \t].*\n?\\'" string) - ;; If the string contains a final indented line, add a second newline so - ;; as to make sure we terminate the multiline instruction. - (comint-send-string proc "\n")))) - -;;; python-components-pdb.el - -;;; Pdbtrack - -(defun py-pdbtrack-overlay-arrow (activation) - "Activate or de arrow at beginning-of-line in current buffer." - ;; This was derived/simplified from edebug-overlay-arrow - (cond (activation - (setq overlay-arrow-position (make-marker)) - (setq overlay-arrow-string "=>") - (set-marker overlay-arrow-position (line-beginning-position) (current-buffer)) - (setq py-pdbtrack-is-tracking-p t)) - (overlay-arrow-position - (setq overlay-arrow-position nil) - (setq py-pdbtrack-is-tracking-p nil)))) - -(defun py-pdbtrack-track-stack-file (text) - "Show the file indicated by the pdb stack entry line, in a separate window. - -Activity is disabled if the buffer-local variable -`py-pdbtrack-do-tracking-p' is nil. - -We depend on the pdb input prompt matching `py-pdbtrack-input-prompt' -at the beginning of the line. - -If the traceback target file path is invalid, we look for the most -recently visited python-mode buffer which either has the name of the -current function \(or class) or which defines the function \(or -class). This is to provide for remote scripts, eg, Zope's 'Script -\(Python)' - put a _copy_ of the script in a buffer named for the -script, and set to python-mode, and pdbtrack will find it.)" - ;; Instead of trying to piece things together from partial text - ;; (which can be almost useless depending on Emacs version), we - ;; monitor to the point where we have the next pdb prompt, and then - ;; check all text from comint-last-input-end to process-mark. - ;; - ;; Also, we're very conservative about clearing the overlay arrow, - ;; to minimize residue. This means, for instance, that executing - ;; other pdb commands wipe out the highlight. You can always do a - ;; 'where' (aka 'w') command to reveal the overlay arrow. - (let* ((origbuf (current-buffer)) - (currproc (get-buffer-process origbuf))) - - (if (not (and currproc py-pdbtrack-do-tracking-p)) - (py-pdbtrack-overlay-arrow nil) - - (let* ((procmark (process-mark currproc)) - (block (buffer-substring (max comint-last-input-end - (- procmark - py-pdbtrack-track-range)) - procmark)) - target target_fname target_lineno target_buffer) - - (if (not (string-match (concat py-pdbtrack-input-prompt "$") block)) - (py-pdbtrack-overlay-arrow nil) - - (setq target (py-pdbtrack-get-source-buffer block)) - - (if (stringp target) - (message "pdbtrack: %s" target) - - (setq target_lineno (car target)) - (setq target_buffer (cadr target)) - (setq target_fname (buffer-file-name target_buffer)) - (switch-to-buffer-other-window target_buffer) - (goto-char (point-min)) - (forward-line (1- target_lineno)) - (message "pdbtrack: line %s, file %s" target_lineno target_fname) - (py-pdbtrack-overlay-arrow t) - (pop-to-buffer origbuf t))))))) - -(defun py-pdbtrack-map-filename (filename) - - (let - ((replacement-val (assoc-default - filename py-pdbtrack-filename-mapping - (lambda (mapkey path) - (string-match - (concat "^" (regexp-quote mapkey)) - path))) - )) - (if (not (eq replacement-val nil)) - (replace-match replacement-val 't 't filename) - filename))) - -(defun py-pdbtrack-get-source-buffer (block) - "Return line number and buffer of code indicated by block's traceback text. - -We look first to visit the file indicated in the trace. - -Failing that, we look for the most recently visited python-mode buffer -with the same name or having the named function. - -If we're unable find the source code we return a string describing the -problem as best as we can determine." - - (if (and (not (string-match py-pdbtrack-stack-entry-regexp block)) - ;; pydb integration still to be done - ;; (not (string-match py-pydbtrack-stack-entry-regexp block)) - ) - "Traceback cue not found" - (let* ((filename (match-string - py-pdbtrack-marker-regexp-file-group block)) - (lineno (string-to-number (match-string - py-pdbtrack-marker-regexp-line-group - block))) - (funcname (match-string py-pdbtrack-marker-regexp-funcname-group - block)) - funcbuffer) - - (cond ((file-exists-p filename) - (list lineno (find-file-noselect filename))) - - ((file-exists-p (py-pdbtrack-map-filename filename)) - (list lineno (find-file-noselect (py-pdbtrack-map-filename filename)))) - - ((setq funcbuffer (py-pdbtrack-grub-for-buffer funcname lineno)) - (if (string-match "/Script (Python)$" filename) - ;; Add in number of lines for leading '##' comments: - (setq lineno - (+ lineno - (save-excursion - (set-buffer funcbuffer) - (count-lines - (point-min) - (max (point-min) - (string-match "^\\([^#]\\|#[^#]\\|#$\\)" - (buffer-substring (point-min) - (point-max))))))))) - (list lineno funcbuffer)) - - ((= (elt filename 0) ?\<) - (format "(Non-file source: '%s')" filename)) - - (t (format "Not found: %s(), %s" funcname filename)))))) - -(defun py-pdbtrack-grub-for-buffer (funcname lineno) - "Find most recent buffer itself named or having function funcname. - -We walk the buffer-list history for python-mode buffers that are -named for funcname or define a function funcname." - (let ((buffers (buffer-list)) - buf - got) - (while (and buffers (not got)) - (setq buf (car buffers) - buffers (cdr buffers)) - (if (and (save-excursion (set-buffer buf) - (string= major-mode "python-mode")) - (or (string-match funcname (buffer-name buf)) - (string-match (concat "^\\s-*\\(def\\|class\\)\\s-+" - funcname "\\s-*(") - (save-excursion - (set-buffer buf) - (buffer-substring (point-min) - (point-max)))))) - (setq got buf))) - got)) - - -;; pdbtrack functions -(defun py-pdbtrack-toggle-stack-tracking (arg) - "Set variable `py-pdbtrack-do-tracking-p'. " - (interactive "P") - (if (not (get-buffer-process (current-buffer))) - (error "No process associated with buffer '%s'" (current-buffer))) - ;; missing or 0 is toggle, >0 turn on, <0 turn off - (if (or (not arg) - (zerop (setq arg (prefix-numeric-value arg)))) - (setq py-pdbtrack-do-tracking-p (not py-pdbtrack-do-tracking-p)) - (setq py-pdbtrack-do-tracking-p (> arg 0))) - (message "%sabled Python's pdbtrack" - (if py-pdbtrack-do-tracking-p "En" "Dis"))) - -(defun turn-on-pdbtrack () - (interactive) - (py-pdbtrack-toggle-stack-tracking 1)) - -(defun turn-off-pdbtrack () - (interactive) - (py-pdbtrack-toggle-stack-tracking 0)) - -;;; python-components-help.el - -(defun py-fetch-docu () - "Lookup in current buffer for the doku for the symbol at point. - -Useful for newly defined symbol, not known to python yet. " - (interactive) - (let* ((symb (prin1-to-string (symbol-at-point))) - (args (py-expression)) - erg) - (save-restriction - (widen) - (goto-char (point-min)) - (when (re-search-forward (concat py-def-or-class-re " *" symb) nil (quote move) 1) - (forward-line 1) - (when (looking-at "[ \t]*\"\"\"\\|[ \t]*'''\\|[ \t]*'[^]+\\|[ \t]*\"[^\"]+") - (goto-char (match-end 0)) - (setq erg (buffer-substring-no-properties (match-beginning 0) (re-search-forward "\"\"\"\\|'''" nil 'move))) - (when erg - (set-buffer (get-buffer-create "*Python-Help*")) - (erase-buffer) - (when (and py-verbose-p (interactive-p)) (switch-to-buffer (current-buffer))) - (insert erg))))))) - -(defun py-find-imports () - "Find top-level imports, updating `python-imports'." - (interactive) - (let* (imports) - (save-excursion - (goto-char (point-min)) - (while (re-search-forward - "^import *[A-Za-z_][A-Za-z_0-9].*\\|^from +[A-Za-z_][A-Za-z_0-9]+ +import .*" nil t) - (setq imports - (concat - imports - (buffer-substring-no-properties (match-beginning 0) (match-end 0)) ";")))) - (when (and py-verbose-p (interactive-p)) (message "%s" imports)) - imports)) - -(defun py-eldoc-function () - "Print help on symbol at point. " - (interactive) - (if (unless (looking-at " ") - (or - - (eq (get-char-property (point) 'face) 'font-lock-keyword-face) - (eq (get-char-property (point) 'face) 'py-builtins-face) - (eq (get-char-property (point) 'face) 'py-exception-name-face) - (eq (get-char-property (point) 'face) 'py-class-name-face) - - )) - - (lexical-let* ((sym (prin1-to-string (symbol-at-point))) - (origfile (buffer-file-name)) - (temp (make-temp-name (buffer-name))) - (file (concat (expand-file-name temp py-temp-directory) ".py")) - (cmd (py-find-imports)) - (no-quotes (save-excursion - (skip-chars-backward "A-Za-z_0-9.") - (and (looking-at "[A-Za-z_0-9.]+") - (string-match "\\." (match-string-no-properties 0)))))) - (setq cmd (concat "import pydoc\n" - cmd)) - (if no-quotes - (setq cmd (concat cmd - "try: pydoc.help(" sym ")\n")) - (setq cmd (concat cmd "try: pydoc.help('" sym "')\n"))) - (setq cmd (concat cmd - "except: - print 'No help available on:', \"" sym "\"")) - (with-temp-buffer - (insert cmd) - (write-file file)) - (py-process-file file "*Python-Help*") - (when (file-readable-p file) - (delete-file file))) - (delete-other-windows))) - -(defalias 'py-help-at-point 'py-describe-symbol) -(defun py-describe-symbol (&optional arg) - "Print help on symbol at point. - -Optional \\[universal-argument] used for debugging, will prevent deletion of temp file. " - (interactive "P") - (let* ((orig (point)) - (beg (progn (when (and (looking-back "(")(not (looking-at "\\sw"))) (forward-char -1)) (skip-chars-backward "a-zA-Z0-9_." (line-beginning-position))(point))) - (end (progn (skip-chars-forward "a-zA-Z0-9_." (line-end-position))(point))) - (sym (buffer-substring-no-properties beg end)) - (origfile (buffer-file-name)) - (temp (make-temp-name (buffer-name))) - (file (concat (expand-file-name temp py-temp-directory) ".py")) - (cmd (py-find-imports))) - (goto-char orig) - (setq cmd (concat "import pydoc\n" - cmd)) - (setq cmd (concat cmd "pydoc.help('" sym "')\n")) - (with-temp-buffer - (insert cmd) - (write-file file)) - (py-process-file file "*Python-Help*") - (when (file-readable-p file) - (unless (eq 4 (prefix-numeric-value arg)) (delete-file file))))) - - -;;; Documentation -(defun py-dump-help-string (str) - (with-output-to-temp-buffer "*Help*" - (let ((locals (buffer-local-variables)) - funckind funcname func funcdoc - (start 0) mstart end - keys) - (while (string-match "^%\\([vc]\\):\\(.+\\)\n" str start) - (setq mstart (match-beginning 0) end (match-end 0) - funckind (substring str (match-beginning 1) (match-end 1)) - funcname (substring str (match-beginning 2) (match-end 2)) - func (intern funcname)) - (princ (substitute-command-keys (substring str start mstart))) - (cond - ((equal funckind "c") ; command - (setq funcdoc (documentation func) - keys (concat - "Key(s): " - (mapconcat 'key-description - (where-is-internal func python-mode-map) - ", ")))) - ((equal funckind "v") ; variable - (setq funcdoc (documentation-property func 'variable-documentation) - keys (if (assq func locals) - (concat - "Local/Global values: " - (prin1-to-string (symbol-value func)) - " / " - (prin1-to-string (default-value func))) - (concat - "Value: " - (prin1-to-string (symbol-value func)))))) - (t ; unexpected - (error "Error in py-dump-help-string, tag `%s'" funckind))) - (princ (format "\n-> %s:\t%s\t%s\n\n" - (if (equal funckind "c") "Command" "Variable") - funcname keys)) - (princ funcdoc) - (terpri) - (setq start end)) - (princ (substitute-command-keys (substring str start)))) - (if (featurep 'xemacs) (print-help-return-message) - (help-print-return-message)))) - -(add-hook 'python-mode-hook - (lambda () - (setq indent-tabs-mode py-indent-tabs-mode) - (set (make-local-variable 'beginning-of-defun-function) 'py-beginning-of-def-or-class) - (set (make-local-variable 'end-of-defun-function) 'py-end-of-def-or-class) - ;; (orgstruct-mode 1) - )) - -(defun py-describe-mode () - "Dump long form of `python-mode' docs." - (interactive) - (py-dump-help-string "Major mode for editing Python files. -Knows about Python indentation, tokens, comments and continuation lines. -Paragraphs are separated by blank lines only. - -Major sections below begin with the string `@'; specific function and -variable docs begin with `->'. - -@EXECUTING PYTHON CODE - -\\[py-execute-import-or-reload]\timports or reloads the file in the Python interpreter -\\[py-execute-buffer]\tsends the entire buffer to the Python interpreter -\\[py-execute-region]\tsends the current region -\\[py-execute-def-or-class]\tsends the current function or class definition -\\[py-execute-string]\tsends an arbitrary string -\\[py-shell]\tstarts a Python interpreter window; this will be used by -\tsubsequent Python execution commands -%c:py-execute-import-or-reload -%c:py-execute-buffer -%c:py-execute-region -%c:py-execute-def-or-class -%c:py-execute-string -%c:py-shell - -@VARIABLES - -py-install-directory\twherefrom `python-mode' looks for extensions -py-indent-offset\tindentation increment -py-block-comment-prefix\tcomment string used by comment-region - -py-shell-name\tshell command to invoke Python interpreter -py-temp-directory\tdirectory used for temp files (if needed) - -py-beep-if-tab-change\tring the bell if tab-width is changed -%v:py-install-directory -%v:py-indent-offset -%v:py-block-comment-prefix -%v:py-shell-name -%v:py-temp-directory -%v:py-beep-if-tab-change - -@KINDS OF LINES - -Each physical line in the file is either a `continuation line' (the -preceding line ends with a backslash that's not part of a comment, or -the paren/bracket/brace nesting level at the start of the line is -non-zero, or both) or an `initial line' (everything else). - -An initial line is in turn a `blank line' (contains nothing except -possibly blanks or tabs), a `comment line' (leftmost non-blank -character is `#'), or a `code line' (everything else). - -Comment Lines - -Although all comment lines are treated alike by Python, Python mode -recognizes two kinds that act differently with respect to indentation. - -An `indenting comment line' is a comment line with a blank, tab or -nothing after the initial `#'. The indentation commands (see below) -treat these exactly as if they were code lines: a line following an -indenting comment line will be indented like the comment line. All -other comment lines (those with a non-whitespace character immediately -following the initial `#') are `non-indenting comment lines', and -their indentation is ignored by the indentation commands. - -Indenting comment lines are by far the usual case, and should be used -whenever possible. Non-indenting comment lines are useful in cases -like these: - -\ta = b # a very wordy single-line comment that ends up being -\t #... continued onto another line - -\tif a == b: -##\t\tprint 'panic!' # old code we've `commented out' -\t\treturn a - -Since the `#...' and `##' comment lines have a non-whitespace -character following the initial `#', Python mode ignores them when -computing the proper indentation for the next line. - -Continuation Lines and Statements - -The `python-mode' commands generally work on statements instead of on -individual lines, where a `statement' is a comment or blank line, or a -code line and all of its following continuation lines (if any) -considered as a single logical unit. The commands in this mode -generally (when it makes sense) automatically move to the start of the -statement containing point, even if point happens to be in the middle -of some continuation line. - -@INDENTATION - -Primarily for entering new code: -\t\\[indent-for-tab-command]\t indent line appropriately -\t\\[py-newline-and-indent]\t insert newline, then indent -\t\\[py-electric-backspace]\t reduce indentation, or delete single character - -Primarily for reindenting existing code: -\t\\[py-guess-indent-offset]\t guess py-indent-offset from file content; change locally -\t\\[universal-argument] \\[py-guess-indent-offset]\t ditto, but change globally - -\t\\[py-indent-region]\t reindent region to match its context -\t\\[py-shift-left]\t shift line or region left by py-indent-offset -\t\\[py-shift-right]\t shift line or region right by py-indent-offset - -Unlike most programming languages, Python uses indentation, and only -indentation, to specify block structure. Hence the indentation supplied -automatically by `python-mode' is just an educated guess: only you know -the block structure you intend, so only you can supply correct -indentation. - -The \\[indent-for-tab-command] and \\[py-newline-and-indent] keys try to suggest plausible indentation, based on -the indentation of preceding statements. E.g., assuming -py-indent-offset is 4, after you enter -\tif a > 0: \\[py-newline-and-indent] -the cursor will be moved to the position of the `_' (_ is not a -character in the file, it's just used here to indicate the location of -the cursor): -\tif a > 0: -\t _ -If you then enter `c = d' \\[py-newline-and-indent], the cursor will move -to -\tif a > 0: -\t c = d -\t _ -`python-mode' cannot know whether that's what you intended, or whether -\tif a > 0: -\t c = d -\t_ -was your intent. In general, `python-mode' either reproduces the -indentation of the (closest code or indenting-comment) preceding -statement, or adds an extra py-indent-offset blanks if the preceding -statement has `:' as its last significant (non-whitespace and non- -comment) character. If the suggested indentation is too much, use -\\[py-electric-backspace] to reduce it. - -Continuation lines are given extra indentation. If you don't like the -suggested indentation, change it to something you do like, and Python- -mode will strive to indent later lines of the statement in the same way. - -If a line is a continuation line by virtue of being in an unclosed -paren/bracket/brace structure (`list', for short), the suggested -indentation depends on whether the current line contains the first item -in the list. If it does, it's indented py-indent-offset columns beyond -the indentation of the line containing the open bracket. If you don't -like that, change it by hand. The remaining items in the list will mimic -whatever indentation you give to the first item. - -If a line is a continuation line because the line preceding it ends with -a backslash, the third and following lines of the statement inherit their -indentation from the line preceding them. The indentation of the second -line in the statement depends on the form of the first (base) line: if -the base line is an assignment statement with anything more interesting -than the backslash following the leftmost assigning `=', the second line -is indented two columns beyond that `='. Else it's indented to two -columns beyond the leftmost solid chunk of non-whitespace characters on -the base line. - -Warning: indent-region should not normally be used! It calls \\[indent-for-tab-command] -repeatedly, and as explained above, \\[indent-for-tab-command] can't guess the block -structure you intend. -%c:indent-for-tab-command -%c:py-newline-and-indent -%c:py-electric-backspace - -The next function may be handy when editing code you didn't write: -%c:py-guess-indent-offset - -The remaining `indent' functions apply to a region of Python code. They -assume the block structure (equals indentation, in Python) of the region -is correct, and alter the indentation in various ways while preserving -the block structure: -%c:py-indent-region -%c:py-shift-left -%c:py-shift-right - -@MARKING & MANIPULATING REGIONS OF CODE - -\\[py-mark-block]\t mark block of lines -\\[py-mark-def-or-class]\t mark smallest enclosing def -\\[universal-argument] \\[py-mark-def-or-class]\t mark smallest enclosing class -\\[comment-region]\t comment out region of code -\\[universal-argument] \\[comment-region]\t uncomment region of code -%c:py-mark-block -%c:py-mark-def-or-class -%c:comment-region - -@MOVING POINT - -\\[py-previous-statement]\t move to statement preceding point -\\[py-next-statement]\t move to statement following point -\\[py-goto-block-up]\t move up to start of current block -\\[py-beginning-of-def-or-class]\t move to start of def -\\[universal-argument] \\[py-beginning-of-def-or-class]\t move to start of class -\\[py-end-of-def-or-class]\t move to end of def -\\[universal-argument] \\[py-end-of-def-or-class]\t move to end of class - -The first two move to one statement beyond the statement that contains -point. A numeric prefix argument tells them to move that many -statements instead. Blank lines, comment lines, and continuation lines -do not count as `statements' for these commands. So, e.g., you can go -to the first code statement in a file by entering -\t\\[beginning-of-buffer]\t to move to the top of the file -\t\\[py-next-statement]\t to skip over initial comments and blank lines -Or do `\\[py-previous-statement]' with a huge prefix argument. -%c:py-previous-statement -%c:py-next-statement -%c:py-goto-block-up -%c:py-beginning-of-def-or-class -%c:py-end-of-def-or-class - -@LITTLE-KNOWN EMACS COMMANDS PARTICULARLY USEFUL IN PYTHON MODE - -`\\[indent-new-comment-line]' is handy for entering a multi-line comment. - -`\\[set-selective-display]' with a `small' prefix arg is ideally suited for viewing the -overall class and def structure of a module. - -`\\[back-to-indentation]' moves point to a line's first non-blank character. - -`\\[indent-relative]' is handy for creating odd indentation. - -@OTHER EMACS HINTS - -If you don't like the default value of a variable, change its value to -whatever you do like by putting a `setq' line in your .emacs file. -E.g., to set the indentation increment to 4, put this line in your -.emacs: -\t(setq py-indent-offset 4) -To see the value of a variable, do `\\[describe-variable]' and enter the variable -name at the prompt. - -When entering a key sequence like `C-c C-n', it is not necessary to -release the CONTROL key after doing the `C-c' part -- it suffices to -press the CONTROL key, press and release `c' (while still holding down -CONTROL), press and release `n' (while still holding down CONTROL), & -then release CONTROL. - -Entering Python mode calls with no arguments the value of the variable -`python-mode-hook', if that value exists and is not nil; for backward -compatibility it also tries `py-mode-hook'; see the `Hooks' section of -the Elisp manual for details. - -Obscure: When python-mode is first loaded, it looks for all bindings -to newline-and-indent in the global keymap, and shadows them with -local bindings to py-newline-and-indent.")) - -;; (require 'info-look) -;; The info-look package does not always provide this function (it -;; appears this is the case with XEmacs 21.1) -(when (fboundp 'info-lookup-maybe-add-help) - (info-lookup-maybe-add-help - :mode 'python-mode - :regexp "[a-zA-Z0-9_]+" - :doc-spec '(("(python-lib)Module Index") - ("(python-lib)Class-Exception-Object Index") - ("(python-lib)Function-Method-Variable Index") - ("(python-lib)Miscellaneous Index")))) - -(defvar python-preoutput-result nil - "Data from last `_emacs_out' line seen by the preoutput filter.") - -(defun py-send-receive (string) - "Send STRING to inferior Python (if any) and return result. - -The result is what follows `_emacs_out' in the output. -This is a no-op if `python-check-comint-prompt' returns nil." - (python-shell-send-string-no-output string) - (let ((proc (py-proc))) - (with-current-buffer (process-buffer proc) - (when (python-check-comint-prompt proc) - (set (make-local-variable 'python-preoutput-result) nil) - (accept-process-output proc 5) - (prog1 python-preoutput-result - (kill-local-variable 'python-preoutput-result)))))) - -(defun py-find-function (name) - "Find source of definition of function NAME. - -Interactively, prompt for name." - (interactive - (let ((symbol (with-syntax-table py-dotted-expression-syntax-table - (current-word))) - (enable-recursive-minibuffers t)) - (list (read-string (if symbol - (format "Find location of (default %s): " symbol) - "Find location of: ") - nil nil symbol)))) - (unless python-imports - (error "Not called from buffer visiting Python file")) - (let* ((loc (py-send-receive (format "emacs.location_of (%S, %s)" - name python-imports))) - (loc (car (read-from-string loc))) - (file (car loc)) - (line (cdr loc))) - (unless file (error "Don't know where `%s' is defined" name)) - (pop-to-buffer (find-file-noselect file)) - (when (integerp line) - (goto-char (point-min)) - (forward-line (1- line))))) - -(defun py-update-imports () - "Returns `python-imports'. - -Imports done are displayed in message buffer. " - (interactive) - (save-excursion - (let ((oldbuf (current-buffer)) - (orig (point)) - erg) - (mapc 'py-execute-string (split-string (car (read-from-string (py-find-imports))) "\n" t)) - (setq erg (car (read-from-string python-imports))) - (set-buffer oldbuf) - (goto-char orig) - (when (interactive-p) - (switch-to-buffer (current-buffer)) - (when py-verbose-p (message "%s" erg))) - erg))) - -;;; python-components-extensions.el - -(defun py-indent-forward-line (&optional arg) - "Indent and move one line forward to next indentation. -Returns column of line reached. - -If `py-kill-empty-line' is non-nil, delete an empty line. -When closing a form, use py-close-block et al, which will move and indent likewise. -With \\[universal argument] just indent. -" - (interactive "*P") - (let ((orig (point)) - erg) - (unless (eobp) - (if (and (py-in-comment-p)(not py-indent-comments)) - (forward-line 1) - (py-indent-line-outmost) - (unless (eq 4 (prefix-numeric-value arg)) - (if (eobp) (newline) - (progn (forward-line 1)) - (when (and py-kill-empty-line (empty-line-p) (not (looking-at "[ \t]*\n[[:alpha:]]")) (not (eobp))) - (delete-region (line-beginning-position) (line-end-position))))))) - (back-to-indentation) - (when (or (eq 4 (prefix-numeric-value arg)) (< orig (point))) (setq erg (current-column))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg)) - -(defun py-dedent-forward-line (&optional arg) - "Dedent line and move one line forward. " - (interactive "*p") - (py-dedent arg) - (forward-line 1) - (end-of-line) - (skip-chars-backward " \t\r\n\f")) - -(defun py-dedent (&optional arg) - "Dedent line according to `py-indent-offset'. - -With arg, do it that many times. -If point is between indent levels, dedent to next level. -Return indentation reached, if dedent done, nil otherwise. - -Affected by `py-dedent-keep-relative-column'. " - (interactive "*p") - (let ((orig (copy-marker (point))) - erg) - (dotimes (i arg) - (let* ((cui (current-indentation)) - (remain (% cui py-indent-offset)) - (indent (* py-indent-offset (/ cui py-indent-offset)))) - (beginning-of-line) - (fixup-whitespace) - (if (< 0 remain) - (indent-to-column indent) - (indent-to-column (- cui py-indent-offset))))) - (when (< (point) orig) - (setq erg (current-column))) - (if py-dedent-keep-relative-column - (goto-char orig) - (end-of-line) - (skip-chars-backward " \t\r\n\f")) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg)) - -(defun py-close-intern (regexp) - "Core function, internal used only. " - (let ((cui (ignore-errors (car (py-go-to-keyword regexp))))) - (py-end-base regexp (point)) - (forward-line 1) - (if py-close-provides-newline - (unless (empty-line-p) (split-line)) - (fixup-whitespace)) - (indent-to-column cui) - cui)) - -(defun py-close-def () - "Set indent level to that of beginning of function definition. - -If final line isn't empty and `py-close-block-provides-newline' non-nil, insert a newline. " - (interactive "*") - (let ((erg (py-close-intern py-def-re))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg)) - -(defun py-close-class () - "Set indent level to that of beginning of class definition. - -If final line isn't empty and `py-close-block-provides-newline' non-nil, insert a newline. " - (interactive "*") - (let ((erg (py-close-intern py-class-re))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg)) - -(defun py-close-clause () - "Set indent level to that of beginning of clause definition. - -If final line isn't empty and `py-close-block-provides-newline' non-nil, insert a newline. " - (interactive "*") - (let ((erg (py-close-intern py-clause-re))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg)) - -(defun py-close-block () - "Set indent level to that of beginning of block definition. - -If final line isn't empty and `py-close-block-provides-newline' non-nil, insert a newline. " - (interactive "*") - (let ((erg (py-close-intern py-block-re))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg)) - -(defun py-class-at-point () - "Return class definition as string. - -With interactive call, send it to the message buffer too. " - (interactive) - (save-excursion - (let* ((beg (py-beginning-of-class)) - (end (py-end-of-class)) - (res (when (and (numberp beg)(numberp end)(< beg end)) (buffer-substring-no-properties beg end)))) - (when (and py-verbose-p (interactive-p)) (message "%s" res)) - res))) - -(defun py-line-at-point () - "Return line as string. - With interactive call, send it to the message buffer too. " - (interactive) - (let* ((beg (line-beginning-position)) - (end (line-end-position)) - (res (when (and (numberp beg)(numberp end)(< beg end)) (buffer-substring-no-properties beg end)))) - (when (and py-verbose-p (interactive-p)) (message "%s" res)) - res)) - -(defun py-looking-at-keywords-p () - "If looking at a python keyword. Returns t or nil. " - (interactive) - (let* ((kwds1 (car (nth 1 (eval (eval (quote (car font-lock-defaults))))))) - (kwds3 (car (nth 3 (eval (eval (quote (car font-lock-defaults))))))) - (res - (or - (looking-at kwds1) - (looking-at kwds3)))) - (when (and py-verbose-p (interactive-p)) (message "looking-at keywords: %s" res)) - res)) - -(defun py-match-paren-mode (&optional arg) - "py-match-paren-mode nil oder t" - (interactive "P") - (if (or (eq 4 (prefix-numeric-value arg)) (not py-match-paren-mode)) - (setq py-match-paren-mode t) - (setq py-match-paren-mode nil))) - -(defun py-match-paren () - "Goto to the opening or closing of block before or after point. - -With arg, do it that many times. - Closes unclosed block if jumping from beginning. " - (interactive) - (let ((cuc (current-column)) - (cid (current-indentation))) - (py-beginning-of-block-or-clause) - (if (< cuc (current-indentation)) - (goto-char cuc) - (back-to-indentation) - (when (eq (point) cuc) - (py-end-of-block))))) - -;;; from string-strip.el --- Strip CHARS from STRING - -;; (setq strip-chars-before "[ \t\r\n]*") -(defcustom strip-chars-before "[ \t\r\n]*" - "Regexp indicating which chars shall be stripped before STRING - which is defined by `string-chars-preserve'." - - :type 'string - :group 'convenience) - -;; (setq strip-chars-after "[ \t\r\n]*") -(defcustom strip-chars-after "[ \t\r\n]*\\'" - "Regexp indicating which chars shall be stripped after STRING - which is defined by `string-chars-preserve'." - - :type 'string - :group 'convenience) - -(defcustom string-chars-preserve "\\(.*?\\)" - "Chars preserved of STRING. -`strip-chars-after' and -`strip-chars-before' indicate what class of chars to strip." - :type 'string - :group 'convenience) - -(defun string-strip (str &optional chars-before chars-after chars-preserve) - "Return a copy of STR, CHARS removed. -`CHARS-BEFORE' and `CHARS-AFTER' default is \"[ \t\r\n]*\", -i.e. spaces, tabs, carriage returns, newlines and newpages. -`CHARS-PRESERVE' must be a parentized expression, -it defaults to \"\\(.*?\\)\"" - (let ((s-c-b (or chars-before - strip-chars-before)) - (s-c-a (or chars-after - strip-chars-after)) - (s-c-p (or chars-preserve - string-chars-preserve))) - (string-match - (concat "\\`[" s-c-b"]*" s-c-p "[" s-c-a "]*\\'") str) - (match-string 1 str))) - -;;; - -(defalias 'druck 'py-printform-insert) -(defun py-printform-insert (&optional arg) - "Inserts a print statement out of current `(car kill-ring)' by default, inserts ARG instead if delivered. " - (interactive "*") - (let* ((name (string-strip (or arg (car kill-ring)))) - (form (cond ((or (eq major-mode 'python-mode)(eq major-mode 'inferior-python-mode)) - (concat "print \"" name ": %s \" % " name))))) - (insert form))) - -(defun py-documentation (w) - "Launch PyDOC on the Word at Point" - (interactive - (list (let* ((word (thing-at-point 'word)) - (input (read-string - (format "pydoc entry%s: " - (if (not word) "" (format " (default %s)" word)))))) - (if (string= input "") - (if (not word) (error "No pydoc args given") - word) ;sinon word - input)))) ;sinon input - (shell-command (concat py-shell-name " -c \"from pydoc import help;help(\'" w "\')\"") "*PYDOCS*") - (view-buffer-other-window "*PYDOCS*" t 'kill-buffer-and-window)) - -(defun eva () - "Put \"eval(...)\" forms around strings at point. " - (interactive "*") - (skip-chars-forward " \t\r\n\f") - (let* ((bounds (ar-bounds-of-word-atpt)) - (beg (car bounds)) - (end (cdr bounds))) - (goto-char end) - (insert ")") - (goto-char beg) - (insert "eval("))) - -(defun pst-here () - "Kill previous \"pdb.set_trace()\" and insert it at point. " - (interactive "*") - (let ((orig (copy-marker (point)))) - (search-backward "pdb.set_trace()") - (replace-match "") - (when (empty-line-p) - (delete-region (line-beginning-position) (line-end-position))) - (goto-char orig) - (insert "pdb.set_trace()"))) - -(defun py-line-to-printform-python2 (&optional arg) - "Transforms the item on current in a print statement. " - (interactive "*") - (let* ((name (thing-at-point 'word)) - (form (cond ((or (eq major-mode 'python-mode)(eq major-mode 'inferior-python-mode)) - (concat "print \"" name ": %s \" % " name))))) - (delete-region (line-beginning-position) (line-end-position)) - (insert form)) - (forward-line 1) - (back-to-indentation)) - -;;; python-components-imenu.el - -;; Imenu definitions -(defvar py-imenu-class-regexp - (concat ; <<classes>> - "\\(" ; - "^[ \t]*" ; newline and maybe whitespace - "\\(class[ \t]+[a-zA-Z0-9_]+\\)" ; class name - ; possibly multiple superclasses - "\\([ \t]*\\((\\([a-zA-Z0-9_,. \t\n]\\)*)\\)?\\)" - "[ \t]*:" ; and the final : - "\\)" ; >>classes<< - ) - "Regexp for Python classes for use with the Imenu package.") - -(defvar py-imenu-method-regexp - (concat ; <<methods and functions>> - "\\(" ; - "^[ \t]*" ; new line and maybe whitespace - "\\(def[ \t]+" ; function definitions start with def - "\\([a-zA-Z0-9_]+\\)" ; name is here - ; function arguments... - ;; "[ \t]*(\\([-+/a-zA-Z0-9_=,\* \t\n.()\"'#]*\\))" - "[ \t]*(\\([^:#]*\\))" - "\\)" ; end of def - "[ \t]*:" ; and then the : - "\\)" ; >>methods and functions<< - ) - "Regexp for Python methods/functions for use with the Imenu package.") - -(defvar py-imenu-method-no-arg-parens '(2 8) - "Indices into groups of the Python regexp for use with Imenu. - -Using these values will result in smaller Imenu lists, as arguments to -functions are not listed. - -See the variable `py-imenu-show-method-args-p' for more -information.") - -(defvar py-imenu-method-arg-parens '(2 7) - "Indices into groups of the Python regexp for use with imenu. -Using these values will result in large Imenu lists, as arguments to -functions are listed. - -See the variable `py-imenu-show-method-args-p' for more -information.") - -;; Note that in this format, this variable can still be used with the -;; imenu--generic-function. Otherwise, there is no real reason to have -;; it. -(defvar py-imenu-generic-expression - (cons - (concat - py-imenu-class-regexp - "\\|" ; or... - py-imenu-method-regexp) - py-imenu-method-no-arg-parens) - "Generic Python expression which may be used directly with Imenu. -Used by setting the variable `imenu-generic-expression' to this value. -Also, see the function \\[py-imenu-create-index] for a better -alternative for finding the index.") - -;; These next two variables are used when searching for the Python -;; class/definitions. Just saving some time in accessing the -;; generic-python-expression, really. -(defvar py-imenu-generic-regexp nil) -(defvar py-imenu-generic-parens nil) - -(defun py-switch-imenu-index-function () - "For development only. Good old renamed `py-imenu-create-index'-function hangs with medium size files already. Working `py-imenu-create-index-new' is active by default. - -Switch between classic index machine `py-imenu-create-index'-function and new `py-imenu-create-index-new'. - -The former may provide a more detailed report, thus delivering two different index-machines is considered. " - (interactive) - (if (eq major-mode 'python-mode) - (progn - (if (eq imenu-create-index-function 'py-imenu-create-index-new) - (setq imenu-create-index-function #'py-imenu-create-index) - (setq imenu-create-index-function #'py-imenu-create-index-new)) - (when (and py-verbose-p (interactive-p)) (message "imenu-create-index-function: %s" (prin1-to-string imenu-create-index-function)))) - (error "%s" "Only available in buffers set to python-mode"))) - -(defun py-imenu-create-index-function () - "Python interface function for the Imenu package. -Finds all Python classes and functions/methods. Calls function -\\[py-imenu-create-index-engine]. See that function for the details -of how this works." - (setq py-imenu-generic-regexp (car py-imenu-generic-expression) - py-imenu-generic-parens (if py-imenu-show-method-args-p - py-imenu-method-arg-parens - py-imenu-method-no-arg-parens)) - (goto-char (point-min)) - ;; Warning: When the buffer has no classes or functions, this will - ;; return nil, which seems proper according to the Imenu API, but - ;; causes an error in the XEmacs port of Imenu. Sigh. - (py-imenu-create-index-engine nil)) - -(defun py-imenu-create-index-engine (&optional start-indent) - "Function for finding Imenu definitions in Python. - -Finds all definitions (classes, methods, or functions) in a Python -file for the Imenu package. - -Returns a possibly nested alist of the form - - (INDEX-NAME . INDEX-POSITION) - -The second element of the alist may be an alist, producing a nested -list as in - - (INDEX-NAME . INDEX-ALIST) - -This function should not be called directly, as it calls itself -recursively and requires some setup. Rather this is the engine for -the function \\[py-imenu-create-index-function]. - -It works recursively by looking for all definitions at the current -indention level. When it finds one, it adds it to the alist. If it -finds a definition at a greater indentation level, it removes the -previous definition from the alist. In its place it adds all -definitions found at the next indentation level. When it finds a -definition that is less indented then the current level, it returns -the alist it has created thus far. - -The optional argument START-INDENT indicates the starting indentation -at which to continue looking for Python classes, methods, or -functions. If this is not supplied, the function uses the indentation -of the first definition found." - (let (index-alist - sub-method-alist - looking-p - def-name prev-name - cur-indent def-pos - (class-paren (first py-imenu-generic-parens)) - (def-paren (second py-imenu-generic-parens))) - (setq looking-p - (re-search-forward py-imenu-generic-regexp (point-max) t)) - (while looking-p - (save-excursion - ;; used to set def-name to this value but generic-extract-name - ;; is new to imenu-1.14. this way it still works with - ;; imenu-1.11 - ;;(imenu--generic-extract-name py-imenu-generic-parens)) - (let ((cur-paren (if (match-beginning class-paren) - class-paren def-paren))) - (setq def-name - (buffer-substring-no-properties (match-beginning cur-paren) - (match-end cur-paren)))) - (save-match-data - (py-beginning-of-def-or-class)) - (beginning-of-line) - (setq cur-indent (current-indentation))) - ;; HACK: want to go to the next correct definition location. We - ;; explicitly list them here but it would be better to have them - ;; in a list. - (setq def-pos - (or (match-beginning class-paren) - (match-beginning def-paren))) - ;; if we don't have a starting indent level, take this one - (or start-indent - (setq start-indent cur-indent)) - ;; if we don't have class name yet, take this one - (or prev-name - (setq prev-name def-name)) - ;; what level is the next definition on? must be same, deeper - ;; or shallower indentation - (cond - ;; Skip code in comments and strings - ((py-in-literal)) - ;; at the same indent level, add it to the list... - ((= start-indent cur-indent) - (push (cons def-name def-pos) index-alist)) - ;; deeper indented expression, recurse - ((< start-indent cur-indent) - ;; the point is currently on the expression we're supposed to - ;; start on, so go back to the last expression. The recursive - ;; call will find this place again and add it to the correct - ;; list - (re-search-backward py-imenu-generic-regexp (point-min) 'move) - (setq sub-method-alist (py-imenu-create-index-engine cur-indent)) - (if sub-method-alist - ;; we put the last element on the index-alist on the start - ;; of the submethod alist so the user can still get to it. - (let ((save-elmt (pop index-alist))) - (push (cons prev-name - (cons save-elmt sub-method-alist)) - index-alist)))) - ;; found less indented expression, we're done. - (t - (setq looking-p nil) - (re-search-backward py-imenu-generic-regexp (point-min) t))) - ;; end-cond - (setq prev-name def-name) - (and looking-p - (setq looking-p - (re-search-forward py-imenu-generic-regexp - (point-max) 'move)))) - (nreverse index-alist))) - -(defvar imenu-max-items) -(defun py-imenu-create-index-new-intern (&optional thisend) - (let* ((pos (match-beginning 0)) - (name (match-string-no-properties 2)) - (classname (concat "class " name)) - (thisend (or thisend (save-match-data (py-end-of-def-or-class-position)))) - sublist) - (while (and (re-search-forward "^[ \t]*\\(?:\\(def\\|class\\)\\)[ \t]+\\(?:\\(\\sw+\\)\\)" (or thisend end) t 1)(not (nth 8 (syntax-ppss)))) - (let* ((pos (match-beginning 0)) - (name (match-string-no-properties 2)) - (classname (concat "class " name)) - (thisend (or thisend (save-match-data (py-end-of-def-or-class-position))))) - (if (string= "class" (match-string-no-properties 1)) - (py-imenu-create-index-new-intern (save-match-data (py-end-of-def-or-class-position))) - (push (cons (concat " " name) pos) sublist)))) - (if classname - (progn - (setq sublist (nreverse sublist)) - (push (cons classname pos) sublist) - (push (cons classname sublist) index-alist)) - (push sublist index-alist)))) - -(defun py-imenu-create-index-new (&optional beg end) - "`imenu-create-index-function' for Python. " - (set (make-local-variable 'imenu-max-items) 99) - (let ((orig (point)) - (beg (or beg (point-min))) - (end (or end (point-max))) - index-alist vars thisend sublist classname) - (goto-char beg) - (while (and (re-search-forward "^[ \t]*\\(def\\|class\\)[ \t]+\\(\\sw+\\)" end t 1)(not (nth 8 (syntax-ppss)))) - (if (save-match-data (string= "class" (match-string-no-properties 1))) - (progn - (setq pos (match-beginning 0) - name (match-string-no-properties 2) - classname (concat "class " name) - thisend (save-match-data (py-end-of-def-or-class-position)) - sublist '()) - (while (and (re-search-forward "^[ \t]*\\(def\\|class\\)[ \t]+\\(\\sw+\\)" (or thisend end) t 1)(not (nth 8 (syntax-ppss)))) - (let* ((pos (match-beginning 0)) - (name (match-string-no-properties 2)) - (classname (concat "class " name)) - (thisend (or thisend (save-match-data (py-end-of-def-or-class-position))))) - (if (string= "class" (match-string-no-properties 1)) - (py-imenu-create-index-new-intern (save-match-data (py-end-of-def-or-class-position))) - (push (cons (concat " " name) pos) sublist)))) - (if classname - (progn - (setq sublist (nreverse sublist)) - (push (cons classname pos) sublist) - (push (cons classname sublist) index-alist)) - (push sublist index-alist))) - - (let ((pos (match-beginning 0)) - (name (match-string-no-properties 2))) - (push (cons name pos) index-alist)))) - ;; Look for module variables. - (goto-char (point-min)) - (while (re-search-forward "^\\(\\sw+\\)[ \t]*=" end t) - (unless (nth 8 (syntax-ppss)) - (let ((pos (match-beginning 1)) - (name (match-string-no-properties 1))) - (push (cons name pos) vars)))) - (setq index-alist (nreverse index-alist)) - (when vars - (push (cons "Module variables" - (nreverse vars)) - index-alist)) - (goto-char orig) - index-alist)) - -;;; python-components-completion.el -(defun python-symbol-completions (symbol) - "Return a list of completions of the string SYMBOL from Python process. -The list is sorted. -Uses `python-imports' to load modules against which to complete." - (when (stringp symbol) - (let ((completions - (condition-case () - (car (read-from-string - (python-send-receive - (format "emacs.complete(%S,%s)" - (substring-no-properties symbol) - python-imports)))) - (error nil)))) - (sort - ;; We can get duplicates from the above -- don't know why. - (delete-dups completions) - #'string<)))) - -(defvar py-mode-output-map nil - "Keymap used in *Python Output* buffers.") -(if py-mode-output-map - nil - (setq py-mode-output-map (make-sparse-keymap)) - (define-key py-mode-output-map [button2] 'py-mouseto-exception) - (define-key py-mode-output-map "\C-c\C-c" 'py-goto-exception) - ;; TBD: Disable all self-inserting keys. This is bogus, we should - ;; really implement this as *Python Output* buffer being read-only - (mapc #' (lambda (key) - (define-key py-mode-output-map key - #'(lambda () (interactive) (beep)))) - (where-is-internal 'self-insert-command))) - -(setq py-shell-map - (let ((map (copy-keymap comint-mode-map))) - (define-key map (kbd "RET") 'comint-send-input) - (define-key map "\C-c-" 'py-up-exception) - (define-key map "\C-c=" 'py-down-exception) - ;; defined three times... one should succed - (define-key map (kbd "TAB") 'py-shell-complete) - (define-key map [(meta tab)] 'py-shell-complete) - map)) - -(defun py-choose-shell-by-path (&optional file-separator-char) - "Select Python executable according to version desplayed in path, current buffer-file is selected from. - -Returns versioned string, nil if nothing appropriate found " - (interactive) - (lexical-let ((path (buffer-file-name)) - (file-separator-char (or file-separator-char (char-to-string py-separator-char))) - erg) - (when (and path file-separator-char - (string-match (concat file-separator-char "[iI]?[pP]ython[0-9.]+" file-separator-char) path)) - (setq erg (substring path - (1+ (string-match (concat file-separator-char "[iI]?[pP]ython[0-9.]+" file-separator-char) path)) (1- (match-end 0)) ))) - (when (interactive-p) (message "%s" erg)) - erg)) - -(defun py-choose-shell-by-shebang () - "Choose shell by looking at #! on the first line. - -Returns the specified Python resp. Jython shell command name. " - (interactive) - ;; look for an interpreter specified in the first line - (let* (erg res) - (save-excursion - (goto-char (point-min)) - (when (looking-at py-shebang-regexp) - (setq erg (split-string (match-string-no-properties 0) "[#! \t]")) - (dolist (ele erg) - (when (string-match "[bijp]+ython" ele) - (setq res ele))))) - (when (and py-verbose-p (interactive-p)) (message "%s" res)) - res)) - -(defun py-choose-shell-by-import () - "Choose CPython or Jython mode based imports. - -If a file imports any packages in `py-jython-packages', within -`py-import-check-point-max' characters from the start of the file, -return `jython', otherwise return nil." - (let (mode) - (save-excursion - (goto-char (point-min)) - (while (and (not mode) - (search-forward-regexp - "^\\(\\(from\\)\\|\\(import\\)\\) \\([^ \t\n.]+\\)" - py-import-check-point-max t)) - (setq mode (and (member (match-string 4) py-jython-packages) - 'jython)))) - mode)) - -(defalias 'py-version 'py-which-python) -(defun py-which-python () - "Returns version of Python of current environment, a number. " - (interactive) - (let* ((cmd (py-choose-shell)) - (erg (shell-command-to-string (concat cmd " --version"))) - ;; Result: "bpython version 0.9.7.1 on top of Python 2.7\n(C) 2008-2010 Bob Farrell, Andreas Stuehrk et al. See AUTHORS for detail.\n" - - (version (cond ((string-match (concat "\\(on top of Python \\)" "\\([0-9]\\.[0-9]+\\)") erg) - (match-string-no-properties 2 erg)) - ((string-match "\\([0-9]\\.[0-9]+\\)" erg) - (substring erg 7 (1- (length erg))))))) - (when (interactive-p) - (if erg - (when py-verbose-p (message "%s" erg)) - (message "%s" "Could not detect Python on your system"))) - (string-to-number version))) - -(defun py-python-current-environment () - "Returns path of current Python installation. " - (interactive) - (let* ((cmd (py-choose-shell)) - (denv (shell-command-to-string (concat "type " cmd))) - (erg (substring denv (string-match "/" denv)))) - (when (interactive-p) - (if erg - (when py-verbose-p (message "%s" erg)) - (message "%s" "Could not detect Python on your system"))) - erg)) - -(defalias 'python-toggle-shells 'py-switch-shell) -(defalias 'py-toggle-shell 'py-switch-shell) -(defun py-switch-shell (&optional arg) - "Toggles between the interpreter customized in `py-shell-toggle-1' resp. `py-shell-toggle-2'. Was hard-coded CPython and Jython in earlier versions, now starts with Python2 and Python3 by default. - -ARG might be a python-version string to set to. - -\\[universal-argument] `py-toggle-shell' prompts to specify a reachable Python command. -\\[universal-argument] followed by numerical arg 2 or 3, `py-toggle-shell' opens a respective Python shell. -\\[universal-argument] followed by numerical arg 5 opens a Jython shell. - -Should you need more shells to select, extend this command by adding inside the first cond: - - ((eq NUMBER (prefix-numeric-value arg)) - \"MY-PATH-TO-SHELL\") -" - (interactive "P") - (let ((name (cond ((eq 2 (prefix-numeric-value arg)) - "python2") - ((eq 3 (prefix-numeric-value arg)) - "python3") - ((eq 4 (prefix-numeric-value arg)) - (string-strip - (read-from-minibuffer "Python Shell: " py-shell-name) "\" " "\" " - )) - ((eq 5 (prefix-numeric-value arg)) - "jython") - (t (if (string-match py-shell-name - py-shell-toggle-1) - py-shell-toggle-2 - py-shell-toggle-1)))) - erg) - (cond ((or (string= "ipython" name) - (string= "IPython" name)) - (setq py-shell-name name - py-which-bufname "IPython" - msg "IPython" - mode-name "IPython")) - ((string-match "python3" name) - (setq py-shell-name name - py-which-bufname (py-buffer-name-prepare name) - msg "CPython" - mode-name (py-buffer-name-prepare name))) - ((string-match "jython" name) - (setq py-shell-name name - py-which-bufname (py-buffer-name-prepare name) - msg "Jython" - mode-name (py-buffer-name-prepare name))) - ((string-match "python" name) - (setq py-shell-name name - py-which-bufname (py-buffer-name-prepare name) - msg "CPython" - mode-name py-which-bufname)) - (t - (setq py-shell-name name - py-which-bufname name - msg name - mode-name name))) - ;; py-edit-only-p has no interpreter - ;; (if py-edit-only-p - ;; (setq erg py-shell-name) - (setq erg (executable-find py-shell-name)) - ;;) - (if erg - (progn - (force-mode-line-update) - (when (interactive-p) - (message "Using the %s shell, %s" msg erg)) - (setq py-output-buffer (format "*%s Output*" py-which-bufname))) - (error (concat "Could not detect " py-shell-name " on your sys -tem"))))) - -(defalias 'py-which-shell 'py-choose-shell) -(defun py-choose-shell (&optional arg pyshell dedicated) - "Return an appropriate executable as a string. - -Returns nil, if no executable found. - -This does the following: - - look for an interpreter with `py-choose-shell-by-shebang' - - examine imports using `py-choose-shell-by-import' - - look if Path/To/File indicates a Python version - - if not successful, return default value of `py-shell-name' - -When interactivly called, messages the shell name, Emacs would in the given circtumstances. - -With \\[universal-argument] 4 is called `py-switch-shell' see docu there. -" - (interactive "P") - (if (eq 4 (prefix-numeric-value arg)) - (py-switch-shell '(4)) - (let* ((erg (cond (py-force-py-shell-name-p - py-shell-name) - (py-use-local-default - (if (not (string= "" py-shell-local-path)) - (expand-file-name py-shell-local-path) - (message "Abort: `py-use-local-default' is set to `t' but `py-shell-local-path' is empty. Maybe call `py-toggle-local-default-use'"))) - ((comint-check-proc (current-buffer)) - (process-name (get-buffer-process (current-buffer)))) - ((py-choose-shell-by-shebang)) - ((py-choose-shell-by-import)) - ((py-choose-shell-by-path)) - (py-shell-name py-shell-name) - (t (default-value 'py-shell-name)))) - (cmd (if py-edit-only-p erg - (executable-find erg)))) - (if cmd - (when (interactive-p) - (message "%s" cmd)) - (when (interactive-p) (message "%s" "Could not detect Python on your system. Maybe set `py-edit-only-p'?"))) - erg))) - -(defalias 'toggle-py-smart-indentation 'py-toggle-smart-indentation) -(defun py-toggle-smart-indentation (&optional arg) - "If `py-smart-indentation' should be on or off. - -Returns value of `py-smart-indentation' switched to. " - (interactive) - (let ((arg (or arg (if py-smart-indentation -1 1)))) - (if (< 0 arg) - (setq py-smart-indentation t) - (setq py-smart-indentation nil) - (setq py-indent-offset (default-value 'py-indent-offset))) - (when (and py-verbose-p (interactive-p)) (message "py-smart-indentation: %s" py-smart-indentation)) - py-smart-indentation)) - -(defun py-smart-indentation-on (&optional arg) - "Make sure, `py-smart-indentation' is on. - -Returns value of `py-smart-indentation'. " - (interactive "p") - (let ((arg (or arg 1))) - (toggle-py-smart-indentation arg)) - (when (interactive-p) (message "py-smart-indentation: %s" py-smart-indentation)) - py-smart-indentation) - -(defun py-smart-indentation-off (&optional arg) - "Make sure, `py-smart-indentation' is off. - -Returns value of `py-smart-indentation'. " - (interactive "p") - (let ((arg (if arg (- arg) -1))) - (toggle-py-smart-indentation arg)) - (when (interactive-p) (message "py-smart-indentation: %s" py-smart-indentation)) - py-smart-indentation) - -;;; Split-Windows-On-Execute forms -(defalias 'toggle-py-split-windows-on-execute 'py-toggle-split-windows-on-execute) -(defun py-toggle-split-windows-on-execute (&optional arg) - "If `py-split-windows-on-execute-p' should be on or off. - - Returns value of `py-split-windows-on-execute-p' switched to. " - (interactive) - (let ((arg (or arg (if py-split-windows-on-execute-p -1 1)))) - (if (< 0 arg) - (setq py-split-windows-on-execute-p t) - (setq py-split-windows-on-execute-p nil)) - (when (interactive-p) (message "py-split-windows-on-execute-p: %s" py-split-windows-on-execute-p)) - py-split-windows-on-execute-p)) - -(defun py-split-windows-on-execute-on (&optional arg) - "Make sure, `py-split-windows-on-execute-p' is on. - -Returns value of `py-split-windows-on-execute-p'. " - (interactive "p") - (let ((arg (or arg 1))) - (toggle-py-split-windows-on-execute arg)) - (when (interactive-p) (message "py-split-windows-on-execute-p: %s" py-split-windows-on-execute-p)) - py-split-windows-on-execute-p) - -(defun py-split-windows-on-execute-off () - "Make sure, `py-split-windows-on-execute-p' is off. - -Returns value of `py-split-windows-on-execute-p'. " - (interactive) - (toggle-py-split-windows-on-execute -1) - (when (interactive-p) (message "py-split-windows-on-execute-p: %s" py-split-windows-on-execute-p)) - py-split-windows-on-execute-p) - -;;; Flymake -(defun clear-flymake-allowed-file-name-masks (&optional suffix) - "Remove entries with SUFFIX from `flymake-allowed-file-name-masks'. - -Default is \"\\.py\\'\" " - (interactive "P") - (let ((suffix (cond ((eq 4 (prefix-numeric-value suffix)) - (read-from-minibuffer "Suffix: " "\\\\.py\\\\'")) - (suffix suffix) - (t "\\\\.py\\\\'"))) - (erg flymake-allowed-file-name-masks) - (newlist '())) - (dolist (ele flymake-allowed-file-name-masks) - (unless - ;; (string-match "\\\\.py\\\\'" (car ele)) - (string-match suffix (car ele)) - (add-to-list 'newlist ele t))) - (setq flymake-allowed-file-name-masks newlist) - (when (and py-verbose-p (interactive-p)) (message "%s" flymake-allowed-file-name-masks)) - flymake-allowed-file-name-masks)) - -(defun py-toggle-flymake-intern (name command) - ;; (clear-flymake-allowed-file-name-masks) - (unless (string-match "pyflakespep8" name) - (unless (executable-find name) - (when py-verbose-p (message "Don't see %s. Use `easy_install' %s? " name name)))) - (let* ((temp-file (flymake-init-create-temp-buffer-copy - 'flymake-create-temp-inplace)) - (local-file (file-relative-name - temp-file - (file-name-directory buffer-file-name)))) - (add-to-list 'flymake-allowed-file-name-masks (car (read-from-string (concat "(\"\\.py\\'\" flymake-" name ")")))) - (list command (list local-file)))) - -(defun pylint-flymake-mode () - "Toggle `pylint' `flymake-mode'. " - (interactive) - (if flymake-mode - ;; switch off - (flymake-mode) - (py-toggle-flymake-intern "pylint" "pylint") - (flymake-mode))) - -(defun pyflakes-flymake-mode () - "Toggle `pyflakes' `flymake-mode'. " - (interactive) - (if flymake-mode - ;; switch off - (flymake-mode) - (py-toggle-flymake-intern "pyflakes" "pyflakes") - (flymake-mode))) - -(defun pychecker-flymake-mode () - "Toggle `pychecker' `flymake-mode'. " - (interactive) - (if flymake-mode - ;; switch off - (flymake-mode) - (py-toggle-flymake-intern "pychecker" "pychecker") - (flymake-mode))) - -(defun pep8-flymake-mode () - "Toggle `pep8' `flymake-mode'. " - (interactive) - (if flymake-mode - ;; switch off - (flymake-mode) - (py-toggle-flymake-intern "pep8" "pep8") - (flymake-mode))) - -(defun pyflakespep8-flymake-mode () - "Toggle `pyflakespep8' `flymake-mode'. - -Joint call to pyflakes and pep8 as proposed by - -Keegan Carruthers-Smith - -" - (interactive) - (if flymake-mode - ;; switch off - (flymake-mode) - (py-toggle-flymake-intern "pyflakespep8" "pyflakespep8") - (flymake-mode))) - -;;; Shell-Switch-Buffers-On-Execute forms -(defalias 'toggle-py-shell-switch-buffers-on-execute 'py-toggle-shell-switch-buffers-on-execute) -(defun py-toggle-shell-switch-buffers-on-execute (&optional arg) - "If `py-switch-buffers-on-execute-p' should be on or off. - - Returns value of `py-switch-buffers-on-execute-p' switched to. " - (interactive) - (let ((arg (or arg (if py-switch-buffers-on-execute-p -1 1)))) - (if (< 0 arg) - (setq py-switch-buffers-on-execute-p t) - (setq py-switch-buffers-on-execute-p nil)) - (when (interactive-p) (message "py-shell-switch-buffers-on-execute: %s" py-switch-buffers-on-execute-p)) - py-switch-buffers-on-execute-p)) - -(defun py-shell-switch-buffers-on-execute-on (&optional arg) - "Make sure, `py-switch-buffers-on-execute-p' is on. - -Returns value of `py-switch-buffers-on-execute-p'. " - (interactive "p") - (let ((arg (or arg 1))) - (toggle-py-shell-switch-buffers-on-execute arg)) - (when (interactive-p) (message "py-shell-switch-buffers-on-execute: %s" py-switch-buffers-on-execute-p)) - py-switch-buffers-on-execute-p) - -(defun py-shell-switch-buffers-on-execute-off () - "Make sure, `py-switch-buffers-on-execute-p' is off. - -Returns value of `py-switch-buffers-on-execute-p'. " - (interactive) - (toggle-py-shell-switch-buffers-on-execute -1) - (when (interactive-p) (message "py-shell-switch-buffers-on-execute: %s" py-switch-buffers-on-execute-p)) - py-switch-buffers-on-execute-p) - -;;; -(defvar inferior-python-mode-map - (let ((map (make-sparse-keymap))) - ;; This will inherit from comint-mode-map. - (define-key map "\C-c\C-l" 'py-load-file) - (define-key map "\C-c\C-v" 'python-check) - ;; Note that we _can_ still use these commands which send to the - ;; Python process even at the prompt iff we have a normal prompt, - ;; i.e. '>>> ' and not '... '. See the comment before - ;; py-send-region. Fixme: uncomment these if we address that. - map)) - -(defun py-normalize-directory (directory &optional file-separator-char) - "Make sure DIRECTORY ends with a file-path separator char. - -Returns DIRECTORY" - (let* ((file-separator-char (or file-separator-char (char-to-string py-separator-char))) - (erg (cond ((string-match (concat file-separator-char "$") directory) - directory) - ((not (string= "" directory)) - (concat directory file-separator-char))))) - (unless erg (when py-verbose-p (message "Warning: directory is empty"))) - erg)) - -(defun py-install-directory-check () - "Do some sanity check for `py-install-directory'. - -Returns `t' if successful. " - (interactive) - (let ((erg (and (boundp 'py-install-directory) (stringp py-install-directory) (< 1 (length py-install-directory))))) - (when (interactive-p) (message "py-install-directory-check: %s" erg)) - erg)) - -(defun py-guess-py-install-directory () - "Takes value of user directory aka $HOME -if `(locate-library \"python-mode\")' is not succesful. " - (interactive) - (let ((erg (file-name-directory (locate-library "python-mode")))) - (if erg - (progn - (setq py-install-directory erg) - (when (and py-verbose-p (interactive-p)) (message "Setting py-install-directory to: %s" erg))) - (setq py-install-directory (expand-file-name "~/"))) - py-install-directory )) - -(defun py-set-load-path () - "Include needed subdirs of python-mode directory. " - (interactive) - (let ((py-install-directory (py-normalize-directory py-install-directory (char-to-string py-separator-char)))) - (cond ((and (not (string= "" py-install-directory))(stringp py-install-directory)) - (add-to-list 'load-path (expand-file-name py-install-directory)) - (add-to-list 'load-path (concat (expand-file-name py-install-directory) "completion")) - (add-to-list 'load-path (concat (expand-file-name py-install-directory) "test")) - (add-to-list 'load-path (concat (expand-file-name py-install-directory) "tools"))) - ((when py-guess-py-install-directory-p - (let ((guessed-py-install-directory (py-guess-py-install-directory))) - (when guessed-py-install-directory - (add-to-list 'load-path guessed-py-install-directory))))) - (t (error "Please set `py-install-directory', see INSTALL")) - (when (interactive-p) (message "%s" load-path))))) - -;;; Autopair -;; Original author: Joao Tavora <joaotavora [at] gmail.com> -;; X-URL: http://autopair.googlecode.com - -;; variables -(defvar autopair-pair-criteria 'help-balance - "How to decide whether to pair opening brackets or quotes. - -Set this to 'always to always pair, or 'help-balance to be more -criterious when pairing.") - -(defvar autopair-skip-criteria 'help-balance - "How to decide whether to skip closing brackets or quotes. - -Set this to 'always to always skip, or 'help-balance to be more -criterious when skipping.") - -(defvar autopair-emulation-alist nil - "A dinamic keymap for autopair set mostly from the current - syntax table.") - -(unless (> emacs-major-version 23) - (defvar autopair-dont-activate nil - "Control activation of `autopair-global-mode'. - -Set this to a non-nil value to skip activation of `autopair-mode' -in certain contexts. If however the value satisfies `functionp' -and is a function of no arguments, the function is called and it is -the return value that decides.") - (make-variable-buffer-local 'autopair-dont-activate)) - -(defvar autopair-extra-pairs nil - "Extra pairs for which to use pairing. - -It's a Common-lisp-style even-numbered property list, each pair -of elements being of the form (TYPE , PAIRS). PAIRS is a mixed -list whose elements are cons cells, which look like cells look -like (OPENING . CLOSING). Autopair pairs these like -parenthesis. - -TYPE can be one of: - -:string : whereby PAIRS will be considered only when inside a - string literal - -:comment : whereby PAIRS will be considered only when inside a comment - -:code : whereby PAIRS will be considered only when outisde a - string and a comment. - -:everywhere : whereby PAIRS will be considered in all situations - -In Emacs-lisp, this might be useful - -(add-hook 'emacs-lisp-mode-hook - #'(lambda () - (setq autopair-extra-pairs `(:comment ((?`. ?')))))) - -Note that this does *not* work for single characters, -e.x. characters you want to behave as quotes. See the -docs/source comments for more details.") - -(make-variable-buffer-local 'autopair-extra-pairs) - -(defvar autopair-dont-pair `(:string (?') :comment (?')) - "Characters for which to skip any pairing behaviour. - -This variable overrides `autopair-pair-criteria' and -`autopair-extra-pairs'. It does not - (currently) affect the skipping behaviour. - -It's a Common-lisp-style even-numbered property list, each pair -of elements being of the form (TYPE , CHARS). CHARS is a list of -characters and TYPE can be one of: - -:string : whereby characters in CHARS will not be autopaired when - inside a string literal - -:comment : whereby characters in CHARS will not be autopaired when - inside a comment - -:never : whereby characters in CHARS won't even have their - bindings replaced by autopair's. This particular option - should be used for troubleshooting and requires - `autopair-mode' to be restarted to have any effect.") -(make-variable-buffer-local 'autopair-dont-pair) - -(defvar autopair-action nil - "Autopair action decided on by last interactive autopair command, or nil. - -When autopair decides on an action this is a list whose first -three elements are (ACTION PAIR POS-BEFORE). - -ACTION is one of `opening', `insert-quote', `skip-quote', -`backspace', `newline' or `paired-delimiter'. PAIR is the pair of -the `autopair-inserted' character, if applicable. POS-BEFORE is -value of point before action command took place .") - -(defvar autopair-wrap-action nil - "Autowrap action decided on by autopair, if any. - -When autopair decides on an action this is a list whose first -three elements are (ACTION PAIR POS-BEFORE REGION-BEFORE). - -ACTION can only be `wrap' currently. PAIR and POS-BEFORE -delimiter are as in `autopair-action'. REGION-BEFORE is a cons -cell with the bounds of the region before the command takes -place") - -(defvar autopair-handle-action-fns '() - "Autopair handlers to run *instead* of the default handler. - -Each element is a function taking three arguments (ACTION, PAIR -and POS-BEFORE), which are the three elements of the -`autopair-action' variable, which see. - -If non-nil, these functions are called *instead* of the single -function `autopair-default-handle-action', so use this variable -to specify special behaviour. To also run the default behaviour, -be sure to include `autopair-default-handle-action' in the -list, or call it from your handlers.") -(make-variable-buffer-local 'autopair-handle-action-fns) - -(defvar autopair-handle-wrap-action-fns '() - "Autopair wrap handlers to run *instead* of the default handler. - -Each element is a function taking four arguments (ACTION, PAIR, -POS-BEFORE and REGION-BEFORE), which are the three elements of the -`autopair-wrap-action' variable, which see. - -If non-nil, these functions are called *instead* of the single -function `autopair-default-handle-wrap-action', so use this -variable to specify special behaviour. To also run the default -behaviour, be sure to include `autopair-default-handle-wrap-action' in -the list, or call it in your handlers.") -(make-variable-buffer-local 'autopair-handle-wrap-action-fns) - -(defvar autopair-inserted nil - "Delimiter inserted by last interactive autopair command. - -This is calculated with `autopair-calculate-inserted', which see.") - -(defun autopair-calculate-inserted () - "Attempts to guess the delimiter the current command is inserting. - -For now, simply returns `last-command-event'" - last-command-event) - -;; minor mode and global mode -;; -(define-globalized-minor-mode autopair-global-mode autopair-mode autopair-on) - -(defun autopair-on () - (unless (or buffer-read-only - (and (not (minibufferp)) - (string-match "^ \\*" (buffer-name))) - (eq major-mode 'sldb-mode) - (and (boundp 'autopair-dont-activate) - autopair-dont-activate)) - (autopair-mode 1))) - -(define-minor-mode autopair-mode - "Automagically pair braces and quotes. " - nil " pair" nil - (cond (autopair-mode - ;; Setup the dynamic emulation keymap - ;; - (let ((map (make-sparse-keymap))) - (define-key map [remap delete-backward-char] 'autopair-backspace) - (define-key map [remap backward-delete-char-untabify] 'autopair-backspace) - (define-key map (kbd "<backspace>") 'autopair-backspace) - (define-key map [backspace] 'autopair-backspace) - (define-key map (kbd "DEL") 'autopair-backspace) - (define-key map [return] 'autopair-newline) - (define-key map (kbd "RET") 'autopair-newline) - (dotimes (char 256) ;; only searches the first 256 chars, - ;; TODO: is this enough/toomuch/stupid? - (unless (member char - (getf autopair-dont-pair :never)) - (let* ((syntax-entry (aref (syntax-table) char)) - (class (and syntax-entry - (syntax-class syntax-entry))) - (pair (and syntax-entry - (cdr syntax-entry)))) - (cond ((eq class (car (string-to-syntax "("))) - ;; syntax classes "opening parens" and "close parens" - (define-key map (string char) 'autopair-insert-opening) - (define-key map (string pair) 'autopair-skip-close-maybe)) - ((eq class (car (string-to-syntax "\""))) - ;; syntax class "string quote - (define-key map (string char) 'autopair-insert-or-skip-quote)) - ((eq class (car (string-to-syntax "$"))) - ;; syntax class "paired-delimiter" - ;; - ;; Apropos this class, see Issues 18, 25 and - ;; elisp info node "35.2.1 Table of Syntax - ;; Classes". The fact that it supresses - ;; syntatic properties in the delimited region - ;; dictates that deciding to autopair/autoskip - ;; can't really be as clean as the string - ;; delimiter. - ;; - ;; Apparently, only `TeX-mode' uses this, so - ;; the best is to bind this to - ;; `autopair-insert-or-skip-paired-delimiter' - ;; which defers any decision making to - ;; mode-specific post-command handler - ;; functions. - ;; - (define-key map (string char) 'autopair-insert-or-skip-paired-delimiter)))))) - ;; read `autopair-extra-pairs' - (dolist (pairs-list (remove-if-not #'listp autopair-extra-pairs)) - (dolist (pair pairs-list) - (define-key map (string (car pair)) 'autopair-extra-insert-opening) - (define-key map (string (cdr pair)) 'autopair-extra-skip-close-maybe))) - - (set (make-local-variable 'autopair-emulation-alist) (list (cons t map))) - (add-hook 'python-mode-hook - #'(lambda () - (setq autopair-handle-action-fns - (list #'autopair-default-handle-action - #'autopair-python-triple-quote-action))))) - (setq autopair-action nil) - (setq autopair-wrap-action nil) - (add-hook 'emulation-mode-map-alists 'autopair-emulation-alist 'append) - (add-hook 'post-command-hook 'autopair-post-command-handler nil 'local)) - (t - (remove-hook 'python-mode-hook - #'(lambda () - (setq autopair-handle-action-fns - (list #'autopair-default-handle-action - #'autopair-python-triple-quote-action)))) - (setq autopair-emulation-alist nil) - (remove-hook 'emulation-mode-map-alists 'autopair-emulation-alist) - (remove-hook 'post-command-hook 'autopair-post-command-handler 'local)))) - -;; helper functions -;; -(defun autopair-syntax-ppss () - "Calculate syntax info relevant to autopair. - -A list of four elements is returned: - -- SYNTAX-INFO is either the result `syntax-ppss' or the result of - calling `parse-partial-sexp' with the appropriate - bounds (previously calculated with `syntax-ppss'. - -- WHERE-SYM can be one of the symbols :string, :comment or :code. - -- QUICK-SYNTAX-INFO is always the result returned by `syntax-ppss'. - -- BOUNDS are the boudaries of the current string or comment if - we're currently inside one." - (let* ((quick-syntax-info (syntax-ppss)) - (string-or-comment-start (nth 8 quick-syntax-info))) - (cond (;; inside a string, recalculate - (nth 3 quick-syntax-info) - (list (parse-partial-sexp (1+ string-or-comment-start) (point)) - :string - quick-syntax-info - (cons string-or-comment-start - (condition-case nil - (scan-sexps string-or-comment-start 1) - (error nil))))) - ((nth 4 quick-syntax-info) - (list (parse-partial-sexp (1+ (nth 8 quick-syntax-info)) (point)) - :comment - quick-syntax-info)) - (t - (list quick-syntax-info - :code - quick-syntax-info))))) - -(defun autopair-find-pair (delim &optional closing) - (when (and delim - (integerp delim)) - (let ((syntax-entry (aref (syntax-table) delim))) - (cond ((eq (syntax-class syntax-entry) (car (string-to-syntax "("))) - (cdr syntax-entry)) - ((or (eq (syntax-class syntax-entry) (car (string-to-syntax "\""))) - (eq (syntax-class syntax-entry) (car (string-to-syntax "$")))) - delim) - ((and (not closing) - (eq (syntax-class syntax-entry) (car (string-to-syntax ")")))) - (cdr syntax-entry)) - (autopair-extra-pairs - (some #'(lambda (pair-list) - (some #'(lambda (pair) - (cond ((eq (cdr pair) delim) (car pair)) - ((eq (car pair) delim) (cdr pair)))) - pair-list)) - (remove-if-not #'listp autopair-extra-pairs))))))) - -(defun autopair-calculate-wrap-action () - (when (and transient-mark-mode mark-active) - (when (> (point) (mark)) - (exchange-point-and-mark)) - (save-excursion - (let* ((region-before (cons (region-beginning) - (region-end))) - (point-before (point)) - (start-syntax (syntax-ppss (car region-before))) - (end-syntax (syntax-ppss (cdr region-before)))) - (when (or (not (eq autopair-autowrap 'help-balance)) - (and (eq (nth 0 start-syntax) (nth 0 end-syntax)) - (eq (nth 3 start-syntax) (nth 3 end-syntax)))) - (list 'wrap (or (second autopair-action) - (autopair-find-pair autopair-inserted)) - point-before - region-before)))))) - -(defun autopair-original-binding (fallback-keys) - (or (key-binding `[,autopair-inserted]) - (key-binding (this-single-command-keys)) - (key-binding fallback-keys))) - -(defun autopair-fallback (&optional fallback-keys) - (let* ((autopair-emulation-alist nil) - (beyond-cua (let ((cua--keymap-alist nil)) - (autopair-original-binding fallback-keys))) - (beyond-autopair (autopair-original-binding fallback-keys))) - (when autopair-autowrap - (setq autopair-wrap-action (autopair-calculate-wrap-action))) - - (setq this-original-command beyond-cua) - ;; defer to "paredit-mode" if that is installed and running - (when (and (featurep 'paredit) - (string-match "paredit" (symbol-name beyond-cua))) - (setq autopair-action nil)) - (let ((cua-delete-selection (not autopair-autowrap)) - (blink-matching-paren (not autopair-action))) - (call-interactively beyond-autopair)))) - -(defvar autopair-autowrap 'help-balance - "If non-nil autopair attempts to wrap the selected region. - -This is also done in an optimistic \"try-to-balance\" fashion. -Set this to to 'help-balance to be more criterious when wrapping.") - -(defvar autopair-skip-whitespace nil - "If non-nil also skip over whitespace when skipping closing delimiters. - -If set to 'chomp, this will be most useful in lisp-like languages where you want -lots of )))))....") - -(defvar autopair-blink (if (boundp 'blink-matching-paren) - blink-matching-paren - t) - "If non-nil autopair blinks matching delimiters.") - -(defvar autopair-blink-delay 0.1 - "Autopair's blink-the-delimiter delay.") - -(defun autopair-document-bindings (&optional fallback-keys) - (concat - "Works by scheduling possible autopair behaviour, then calls -original command as if autopair didn't exist" - (when (eq this-command 'describe-key) - (let* ((autopair-emulation-alist nil) - (command (or (key-binding (this-single-command-keys)) - (key-binding fallback-keys)))) - (when command - (format ", which in this case is `%s'" command)))) - ".")) - -(defun autopair-escaped-p (syntax-info) - (nth 5 syntax-info)) - -(defun autopair-exception-p (where-sym exception-where-sym blacklist &optional fn) - (and (or (eq exception-where-sym :everywhere) - (eq exception-where-sym where-sym)) - (member autopair-inserted - (if fn - (mapcar fn (getf blacklist exception-where-sym)) - (getf blacklist exception-where-sym))))) - -(defun autopair-up-list (syntax-info &optional closing) - "Try to uplist as much as possible, moving point. - -Return nil if something prevented uplisting. - -Otherwise return a cons of char positions of the starting -delimiter and end delimiters of the last list we just came out -of. If we aren't inside any lists return a cons of current point. - -If inside nested lists of mixed parethesis types, finding a -matching parenthesis of a mixed-type is considered OK (non-nil is -returned) and uplisting stops there." - (condition-case nil - (let ((howmany (car syntax-info)) - (retval (cons (point) - (point)))) - (while (and (> howmany 0) - (condition-case err - (progn - (scan-sexps (point) (- (point-max))) - (error err)) - (error (let ((opening (and closing - (autopair-find-pair closing)))) - (setq retval (cons (fourth err) - (point))) - (or (not opening) - (eq opening (char-after (fourth err)))))))) - (goto-char (scan-lists (point) 1 1)) - (decf howmany)) - retval) - (error nil))) - -;; interactive commands and their associated predicates -;; -(defun autopair-insert-or-skip-quote () - (interactive) - (setq autopair-inserted (autopair-calculate-inserted)) - (let* ((syntax-triplet (autopair-syntax-ppss)) - (syntax-info (first syntax-triplet)) - (where-sym (second syntax-triplet)) - (orig-info (third syntax-triplet)) - ;; inside-string may the quote character itself or t if this - ;; is a "generically terminated string" - (inside-string (and (eq where-sym :string) - (fourth orig-info))) - (escaped-p (autopair-escaped-p syntax-info)) - - ) - (cond (;; decides whether to skip the quote... - ;; - (and (not escaped-p) - (eq autopair-inserted (char-after (point))) - (or - ;; ... if we're already inside a string and the - ;; string starts with the character just inserted, - ;; or it's a generically terminated string - (and inside-string - (or (eq inside-string t) - (eq autopair-inserted inside-string))) - ;; ... if we're in a comment and ending a string - ;; (the inside-string criteria does not work - ;; here...) - (and (eq where-sym :comment) - (condition-case nil - (eq autopair-inserted (char-after (scan-sexps (1+ (point)) -1))) - (error nil))))) - (setq autopair-action (list 'skip-quote autopair-inserted (point)))) - (;; decides whether to pair, i.e do *not* pair the quote if... - ;; - (not - (or - escaped-p - ;; ... inside a generic string - (eq inside-string t) - ;; ... inside an unterminated string started by this char - (autopair-in-unterminated-string-p syntax-triplet) - ;; ... uplisting forward causes an error which leaves us - ;; inside an unterminated string started by this char - (condition-case err - (progn (save-excursion (up-list)) nil) - (error - (autopair-in-unterminated-string-p (save-excursion - (goto-char (fourth err)) - (autopair-syntax-ppss))))) - (autopair-in-unterminated-string-p (save-excursion - (goto-char (point-max)) - (autopair-syntax-ppss))) - ;; ... comment-disable or string-disable are true here. - ;; The latter is only useful if we're in a string - ;; terminated by a character other than - ;; `autopair-inserted'. - (some #'(lambda (sym) - (autopair-exception-p where-sym sym autopair-dont-pair)) - '(:comment :string)))) - (setq autopair-action (list 'insert-quote autopair-inserted (point))))) - (autopair-fallback))) - -(put 'autopair-insert-or-skip-quote 'function-documentation - '(concat "Insert or possibly skip over a quoting character.\n\n" - (autopair-document-bindings))) - -(defun autopair-in-unterminated-string-p (autopair-triplet) - (and (eq autopair-inserted (fourth (third autopair-triplet))) - (condition-case nil (progn (scan-sexps (ninth (third autopair-triplet)) 1) nil) (error t)))) - -(defun autopair-insert-opening () - (interactive) - (setq autopair-inserted (autopair-calculate-inserted)) - (when (autopair-pair-p) - (setq autopair-action (list 'opening (autopair-find-pair autopair-inserted) (point)))) - (autopair-fallback)) -(put 'autopair-insert-opening 'function-documentation - '(concat "Insert opening delimiter and possibly automatically close it.\n\n" - (autopair-document-bindings))) - -(defun autopair-skip-close-maybe () - (interactive) - (setq autopair-inserted (autopair-calculate-inserted)) - (when (autopair-skip-p) - (setq autopair-action (list 'closing (autopair-find-pair autopair-inserted) (point)))) - (autopair-fallback)) -(put 'autopair-skip-close-maybe 'function-documentation - '(concat "Insert or possibly skip over a closing delimiter.\n\n" - (autopair-document-bindings))) - -(defun autopair-backspace () - (interactive) - (setq autopair-inserted (autopair-calculate-inserted)) - (when (char-before) - (setq autopair-action (list 'backspace (autopair-find-pair (char-before) 'closing) (point)))) - (autopair-fallback (kbd "DEL"))) -(put 'autopair-backspace 'function-documentation - '(concat "Possibly delete a pair of paired delimiters.\n\n" - (autopair-document-bindings (kbd "DEL")))) - -(defun autopair-newline () - (interactive) - (setq autopair-inserted (autopair-calculate-inserted)) - (let ((pair (autopair-find-pair (char-before)))) - (when (and pair - (eq (char-syntax pair) ?\)) - (eq (char-after) pair)) - (setq autopair-action (list 'newline pair (point)))) - (autopair-fallback (kbd "RET")))) -(put 'autopair-newline 'function-documentation - '(concat "Do a smart newline when right between parenthesis.\n -In other words, insert an extra newline along with the one inserted normally -by this command. Then place point after the first, indented.\n\n" - (autopair-document-bindings (kbd "RET")))) - -(defun autopair-skip-p () - (let* ((syntax-triplet (autopair-syntax-ppss)) - (syntax-info (first syntax-triplet)) - (orig-point (point))) - (cond ((eq autopair-skip-criteria 'help-balance) - (save-excursion - (let ((pos-pair (autopair-up-list syntax-info autopair-inserted))) - ;; if `autopair-up-list' returned something valid, we - ;; probably want to skip but only if on of the following is true. - ;; - ;; 1. it returned a cons of equal values (we're not inside any list - ;; - ;; 2. up-listing stopped at a list that contains our original point - ;; - ;; 3. up-listing stopped at a list that does not - ;; contain out original point but its starting - ;; delimiter matches the one we expect. - (and pos-pair - (or (eq (car pos-pair) (cdr pos-pair)) - (< orig-point (cdr pos-pair)) - (eq (char-after (car pos-pair)) - (autopair-find-pair autopair-inserted))))))) - ((eq autopair-skip-criteria 'need-opening) - (save-excursion - (condition-case err - (progn - (backward-list) - t) - (error nil)))) - (t - t)))) - -(defun autopair-pair-p () - (let* ((syntax-triplet (autopair-syntax-ppss)) - (syntax-info (first syntax-triplet)) - (where-sym (second syntax-triplet)) - (orig-point (point))) - (and (not (some #'(lambda (sym) - (autopair-exception-p where-sym sym autopair-dont-pair)) - '(:string :comment :code :everywhere))) - (cond ((eq autopair-pair-criteria 'help-balance) - (and (not (autopair-escaped-p syntax-info)) - (save-excursion - (let ((pos-pair (autopair-up-list syntax-info)) - (prev-point (point-max)) - (expected-closing (autopair-find-pair autopair-inserted))) - (condition-case err - (progn - (while (not (eq prev-point (point))) - (setq prev-point (point)) - (forward-sexp)) - t) - (error - ;; if `forward-sexp' (called byp - ;; `autopair-forward') returned an error. - ;; typically we don't want to autopair, - ;; unless one of the following occurs: - ;; - (cond (;; 1. The error is *not* of type "containing - ;; expression ends prematurely", which means - ;; we're in the "too-many-openings" situation - ;; and thus want to autopair. - (not (string-match "prematurely" (second err))) - t) - (;; 2. We stopped at a closing parenthesis. Do - ;; autopair if we're in a mixed parens situation, - ;; i.e. the last list jumped over was started by - ;; the paren we're trying to match - ;; (`autopair-inserted') and ended by a different - ;; parens, or the closing paren we stopped at is - ;; also different from the expected. The second - ;; `scan-lists' places point at the closing of the - ;; last list we forwarded over. - ;; - (condition-case err - (prog1 - (eq (char-after (scan-lists (point) -1 0)) - autopair-inserted) - (goto-char (scan-lists (point) -1 -1))) - (error t)) - - (or - ;; mixed () ] for input (, yes autopair - (not (eq expected-closing (char-after (third err)))) - ;; mixed (] ) for input (, yes autopair - (not (eq expected-closing (char-after (point)))) - ;; ()) for input (, not mixed - ;; hence no autopair - )) - (t - nil)) - ;; (eq (fourth err) (point-max)) - )))))) - ((eq autopair-pair-criteria 'always) - t) - (t - (not (autopair-escaped-p syntax-info))))))) - -;; post-command-hook stuff -;; -(defun autopair-post-command-handler () - "Performs pairing and wrapping based on `autopair-action' and -`autopair-wrap-action'. " - (when (and autopair-wrap-action - (notany #'null autopair-wrap-action)) - - (if autopair-handle-wrap-action-fns - (condition-case err - (mapc #'(lambda (fn) - (apply fn autopair-wrap-action)) - autopair-handle-wrap-action-fns) - (error (progn - (message "[autopair] error running custom `autopair-handle-wrap-action-fns', switching autopair off") - (autopair-mode -1)))) - (apply #'autopair-default-handle-wrap-action autopair-wrap-action)) - (setq autopair-wrap-action nil)) - - (when (and autopair-action - (notany #'null autopair-action)) - (if autopair-handle-action-fns - (condition-case err - (mapc #'(lambda (fn) - (funcall fn (first autopair-action) (second autopair-action) (third autopair-action))) - autopair-handle-action-fns) - (error (progn - (message "[autopair] error running custom `autopair-handle-action-fns', switching autopair off") - (autopair-mode -1)))) - (apply #'autopair-default-handle-action autopair-action)) - (setq autopair-action nil))) - -(defun autopair-blink-matching-open () - (let ((blink-matching-paren autopair-blink) - (show-paren-mode nil) - (blink-matching-delay autopair-blink-delay)) - (blink-matching-open))) - -(defun autopair-blink (&optional pos) - (when autopair-blink - (if pos - (save-excursion - (goto-char pos) - (sit-for autopair-blink-delay)) - (sit-for autopair-blink-delay)))) - -(defun autopair-default-handle-action (action pair pos-before) - ;;(message "action is %s" action) - (condition-case err - (cond (;; automatically insert closing delimiter - (and (eq 'opening action) - (not (eq pair (char-before)))) - (insert pair) - (autopair-blink) - (backward-char 1)) - (;; automatically insert closing quote delimiter - (eq 'insert-quote action) - (insert pair) - (autopair-blink) - (backward-char 1)) - (;; automatically skip oper closer quote delimiter - (and (eq 'skip-quote action) - (eq pair (char-after (point)))) - (delete-char 1) - (autopair-blink-matching-open)) - (;; skip over newly-inserted-but-existing closing delimiter - ;; (normal case) - (eq 'closing action) - (let ((skipped 0)) - (when autopair-skip-whitespace - (setq skipped (save-excursion (skip-chars-forward "\s\n\t")))) - (when (eq autopair-inserted (char-after (+ (point) skipped))) - (backward-delete-char 1) - (unless (zerop skipped) (autopair-blink (+ (point) skipped))) - (if (eq autopair-skip-whitespace 'chomp) - (delete-char skipped) - (forward-char skipped)) - (forward-char)) - (autopair-blink-matching-open))) - (;; autodelete closing delimiter - (and (eq 'backspace action) - (eq pair (char-after (point)))) - (delete-char 1)) - (;; opens an extra line after point, then indents - (and (eq 'newline action) - (eq pair (char-after (point)))) - (save-excursion - (newline-and-indent)) - (indent-according-to-mode) - (when (or (and (boundp 'global-hl-line-mode) - global-hl-line-mode) - (and (boundp 'hl-line-mode) - hl-line-mode)) - (hl-line-unhighlight) (hl-line-highlight)))) - (error - (message "[autopair] Ignored error in `autopair-default-handle-action'")))) - -(defun autopair-default-handle-wrap-action (action pair pos-before region-before) - "Default handler for the wrapping action in `autopair-wrap'" - (condition-case err - (when (eq 'wrap action) - (let ((delete-active-region nil)) - (cond - ((eq 'opening (first autopair-action)) - (goto-char (1+ (cdr region-before))) - (insert pair) - (autopair-blink) - (goto-char (1+ (car region-before)))) - (;; wraps - (eq 'closing (first autopair-action)) - (delete-backward-char 1) - (insert pair) - (goto-char (1+ (cdr region-before))) - (insert autopair-inserted)) - ((eq 'insert-quote (first autopair-action)) - (goto-char (1+ (cdr region-before))) - (insert pair) - (autopair-blink)) - (t - (delete-backward-char 1) - (goto-char (cdr region-before)) - (insert autopair-inserted))) - (setq autopair-action nil))) - (error - (message "[autopair] Ignored error in `autopair-default-handle-wrap-action'")))) - -;; example python triple quote helper -;; -(defun autopair-python-triple-quote-action (action pair pos-before) - (cond ((and (eq 'insert-quote action) - (>= (point) 3) - (string= (buffer-substring (- (point) 3) - (point)) - (make-string 3 pair))) - (save-excursion (insert (make-string 2 pair)))) - ((and (eq 'backspace action) - (>= (point) 2) - (<= (point) (- (point-max) 2)) - (string= (buffer-substring (- (point) 2) - (+ (point) 2)) - (make-string 4 pair))) - (delete-region (- (point) 2) - (+ (point) 2))) - ((and (eq 'skip-quote action) - (<= (point) (- (point-max) 2)) - (string= (buffer-substring (point) - (+ (point) 2)) - (make-string 2 pair))) - (forward-char 2)) - (t - t))) - -;; example latex paired-delimiter helper -;; -(defun autopair-latex-mode-paired-delimiter-action (action pair pos-before) - "Pair or skip latex's \"paired delimiter\" syntax in math mode. Added AucText support, thanks Massimo Lauria" - (when (eq action 'paired-delimiter) - (when (eq (char-before) pair) - (if (and (or - (eq (get-text-property pos-before 'face) 'tex-math) - (eq (get-text-property (- pos-before 1) 'face) 'font-latex-math-face) - (member 'font-latex-math-face (get-text-property (- pos-before 1) 'face))) - (eq (char-after) pair)) - (cond ((and (eq (char-after) pair) - (eq (char-after (1+ (point))) pair)) - ;; double skip - (delete-char 1) - (forward-char)) - ((eq (char-before pos-before) pair) - ;; doube insert - (insert pair) - (backward-char)) - (t - ;; simple skip - (delete-char 1))) - (insert pair) - (backward-char))))) - -;; Commands and predicates for the autopair-extra* feature -;; - -(defun autopair-extra-insert-opening () - (interactive) - (setq autopair-inserted (autopair-calculate-inserted)) - (when (autopair-extra-pair-p) - (setq autopair-action (list 'opening (autopair-find-pair autopair-inserted) (point)))) - (autopair-fallback)) -(put 'autopair-extra-insert-opening 'function-documentation - '(concat "Insert (an extra) opening delimiter and possibly automatically close it.\n\n" - (autopair-document-bindings))) - -(defun autopair-extra-skip-close-maybe () - (interactive) - (setq autopair-inserted (autopair-calculate-inserted)) - (when (autopair-extra-skip-p) - (setq autopair-action (list 'closing autopair-inserted (point)))) - (autopair-fallback)) -(put 'autopair-extra-skip-close-maybe 'function-documentation - '(concat "Insert or possibly skip over a (and extra) closing delimiter.\n\n" - (autopair-document-bindings))) - -(defun autopair-extra-pair-p () - (let* ((syntax-triplet (autopair-syntax-ppss)) - (syntax-info (first syntax-triplet)) - (where-sym (second syntax-triplet))) - (some #'(lambda (sym) - (autopair-exception-p where-sym sym autopair-extra-pairs #'car)) - '(:everywhere :comment :string :code)))) - -(defun autopair-extra-skip-p () - (let* ((syntax-triplet (autopair-syntax-ppss)) - (syntax-info (first syntax-triplet)) - (where-sym (second syntax-triplet)) - (orig-point (point))) - (and (eq (char-after (point)) autopair-inserted) - (some #'(lambda (sym) - (autopair-exception-p where-sym sym autopair-extra-pairs #'cdr)) - '(:comment :string :code :everywhere)) - (save-excursion - (condition-case err - (backward-sexp (point-max)) - (error - (goto-char (third err)))) - (search-forward (make-string 1 (autopair-find-pair autopair-inserted)) - orig-point - 'noerror))))) - -;; Commands and tex-mode specific handler functions for the "paired -;; delimiter" syntax class. -;; -(defun autopair-insert-or-skip-paired-delimiter () - " insert or skip a character paired delimiter" - (interactive) - (setq autopair-inserted (autopair-calculate-inserted)) - (setq autopair-action (list 'paired-delimiter autopair-inserted (point))) - (autopair-fallback)) - -(put 'autopair-insert-or-skip-paired-delimiter 'function-documentation - '(concat "Insert or possibly skip over a character with a syntax-class of \"paired delimiter\"." - (autopair-document-bindings))) - - -;; monkey-patching: Compatibility with delete-selection-mode and cua-mode -;; -;; Ideally one would be able to use functions as the value of the -;; 'delete-selection properties of the autopair commands. The function -;; would return non-nil when no wrapping should/could be performed. -;; -;; Until then use some `defadvice' i.e. monkey-patching, which relies -;; on these features' implementation details. -;; -(put 'autopair-insert-opening 'delete-selection t) -(put 'autopair-skip-close-maybe 'delete-selection t) -(put 'autopair-insert-or-skip-quote 'delete-selection t) -(put 'autopair-extra-insert-opening 'delete-selection t) -(put 'autopair-extra-skip-close-maybe 'delete-selection t) -(put 'autopair-backspace 'delete-selection 'supersede) -(put 'autopair-newline 'delete-selection t) - -(defun autopair-should-autowrap () - (let ((name (symbol-name this-command))) - (and autopair-mode - (not (eq this-command 'autopair-backspace)) - (string-match "^autopair" (symbol-name this-command)) - (autopair-calculate-wrap-action)))) - -(defadvice cua--pre-command-handler-1 (around autopair-override activate) - "Don't actually do anything if autopair is about to autowrap. " - (unless (autopair-should-autowrap) ad-do-it)) - -(defadvice delete-selection-pre-hook (around autopair-override activate) - "Don't actually do anything if autopair is about to autowrap. " - (unless (autopair-should-autowrap) ad-do-it)) - -;;; -(defvar py-menu) -(defvar python-mode-map) -(setq python-mode-map - (let ((map (make-sparse-keymap))) - ;; electric keys - (define-key map [(:)] 'py-electric-colon) - (define-key map [(\#)] 'py-electric-comment) - (define-key map [(delete)] 'py-electric-delete) - (define-key map [(backspace)] 'py-electric-backspace) - (define-key map [(control backspace)] 'py-hungry-delete-backwards) - (define-key map [(control c) (delete)] 'py-hungry-delete-forward) - (define-key map [(control c)(control a)] 'py-mark-statement) - ;; moving point - (define-key map [(control c)(control p)] 'py-beginning-of-statement) - (define-key map [(control c)(control n)] 'py-end-of-statement) - (define-key map [(control c)(control u)] 'py-beginning-of-block) - (define-key map [(control c)(control q)] 'py-end-of-block) - (define-key map [(control meta a)] 'py-beginning-of-def-or-class) - (define-key map [(control meta e)] 'py-end-of-def-or-class) - - ;; (define-key map [(meta i)] 'py-indent-forward-line) - (define-key map [(control j)] 'py-newline-and-indent) - ;; Most Pythoneers expect RET `py-newline-and-indent' - ;; (define-key map (kbd "RET") 'py-newline-and-dedent) - (define-key map (kbd "RET") 'py-newline-and-indent) - ;; (define-key map (kbd "RET") 'newline) - (define-key map [(super backspace)] 'py-dedent) - ;; (define-key map [(control return)] 'py-newline-and-dedent) - ;; indentation level modifiers - (define-key map [(control c)(control l)] 'py-shift-left) - (define-key map [(control c)(control r)] 'py-shift-right) - (define-key map [(control c)(<)] 'py-shift-left) - (define-key map [(control c)(>)] 'py-shift-right) - (define-key map [(control c)(tab)] 'py-indent-region) - (define-key map [(control c)(:)] 'py-guess-indent-offset) - ;; subprocess commands - (define-key map [(control c)(control c)] 'py-execute-buffer) - (define-key map [(control c)(control m)] 'py-execute-import-or-reload) - (define-key map [(control c)(control s)] 'py-execute-string) - (define-key map [(control c)(|)] 'py-execute-region) - (define-key map [(control meta x)] 'py-execute-def-or-class) - (define-key map [(control c)(!)] 'py-shell) - (define-key map [(control c)(control t)] 'py-toggle-shell) - (define-key map [(control meta h)] 'py-mark-def-or-class) - (define-key map [(control c)(control k)] 'py-mark-block-or-clause) - (define-key map [(control c)(.)] 'py-expression) - ;; Miscellaneous - (define-key map [(control c)(control d)] 'py-pdbtrack-toggle-stack-tracking) - (define-key map [(control c)(control f)] 'py-sort-imports) - (define-key map [(control c)(\#)] 'py-comment-region) - (define-key map [(control c)(\?)] 'py-describe-mode) - (define-key map [(control c)(control e)] 'py-describe-symbol) - (define-key map [(control c)(-)] 'py-up-exception) - (define-key map [(control c)(=)] 'py-down-exception) - (define-key map [(control x) (n) (d)] 'py-narrow-to-defun) - ;; information - (define-key map [(control c)(control b)] 'py-submit-bug-report) - (define-key map [(control c)(control v)] 'py-version) - (define-key map [(control c)(control w)] 'py-pychecker-run) - (define-key map (kbd "TAB") 'py-indent-line) - (if py-complete-function - (define-key map [(meta tab)] py-complete-function) - (define-key map [(meta tab)] 'py-shell-complete)) - ;; (substitute-key-definition 'complete-symbol 'completion-at-point - ;; map global-map) - (easy-menu-define py-menu map "Python Tools" - `("PyTools" - :help "Python mode tools" - - ["Customize Python mode" (customize-group 'python-mode) - :help "Open the customization buffer for Python mode"] - - "-" - - ["pychecker-run" py-pychecker-run - :help "`py-pychecker-run' -Run pychecker"] - - ("Pylint ... " - :help "Extendet report options -call `easy_install pylint' if not available" - - ["pylint-run" py-pylint-run - :help "`pylint-run' -Pylint will display a number of messages as it analyzes the code, -as well as some statistics about the number of warnings and -errors found in different files - unless called with arg \"--errors-only\". The messages are classified -under various categories such as errors and warnings - -Pylint checks length of lines of code, if variable names are -well-formed according to your coding standard, if declared -interfaces are truly implemented, and much more. Additionally, it -is possible to write plugins. - -call `easy_install pylint' if not available -"] - - ["pylint-help" pylint-help - :help "`pylint-help' -List extendet report options -"] - ["pylint-flymake-mode" pylint-flymake-mode - :help "`pylint-flymake-mode' -Toggle flymake-mode running `pylint' -"]) - - ("pep8 ... " - :help "Check formatting -call `easy_install pep8' if not available" - - ["pep8-run" py-pep8-run - :help "`py-pep8-run' -Check formatting (default on the file currently visited) -call `easy_install pep8' if not available -"] - - ["pep8-help" py-pep8-help - :help "`py-pep8-help' -Display help for pep8 format checker) -"] - - ["pep8-flymake-mode" pep8-flymake-mode - :help "`pep8-flymake-mode' -Toggle flymake-mode running `pep8' -"]) - - ("Pyflakes ... " :help "Non intrusive code - checker call `easy_install pyflakes' if - not available" - - ["pyflakes-run" py-pyflakes-run :help - "`py-pyflakes-run' Run pyflakes call - `easy_install pyflakes' if not - available"] - - ["pyflakes-help" py-pyflakes-help :help - "`py-pyflakes-help' Display help for - Pyflakes "] - - ["pyflakes-flymake-mode" pyflakes-flymake-mode :help - "`pyflakes-flymake-mode' -Toggle flymake-mode running `pyflakes' "]) - - ("Pyflakes-pep8 ... " :help - "Non intrusive code checker running `pyflakes' and `pep8' -call `easy_install pyflakes' and `easy_install pep8' if basics not available" - - ["pyflakespep8-run" py-pyflakespep8-run :help - "`py-pyflakespep8-run' Run `pyflakespep8' -call `easy_install pyflakes' if not available"] - - ["pyflakespep8-help" py-pyflakespep8-help :help - "`py-pyflakespep8-help' Display help for - Pyflakespep8 "] - - ["pyflakespep8-flymake-mode" pyflakespep8-flymake-mode :help - "`pyflakespep8-flymake-mode' -Toggle flymake-mode running `pyflakespep8' "]) - - "-" - ("Abbrevs" - :help "see also `py-add-abbrev'" - :filter (lambda (&rest junk) - (abbrev-table-menu python-mode-abbrev-table))) - ["add-abbrev" py-add-abbrev - :help "Defines python-mode specific abbrev for last expressions before point. -Argument is how many `py-partial-expression's form the expansion; or zero means the region is the expansion. "] - - ("Skeletons" - :help "See also templates in YASnippet" - - ["if" py-if - :help "Inserts if-statement"] - ["py-else" py-else - :help "Inserts else-statement"] - ["py-while" py-while - :help "Inserts while-statement"] - ["py-for" py-for - :help "Inserts for-statement"] - ["py-try/finally" py-try/finally - :help "Inserts py-try/finally-statement"] - ["py-try/except" py-try/except - :help "Inserts py-try/except-statement"]) - - "-" - - ["Import/reload file" py-execute-import-or-reload - :help "`py-execute-import-or-reload' -Load into inferior Python session"] - - ["Debugger" pdb - :help "`pdb' -Run pdb under GUD"] - "-" - - ["Toggle autopair-mode" autopair-mode - :help "When `py-prepare-autopair-mode-p' is `t', this toggles `autopair-mode' "] - - ["Toggle py-smart-indentation" toggle-py-smart-indentation - :help "See also `py-smart-indentation-on', `-off' "] - - ["Toggle indent-tabs-mode" py-toggle-indent-tabs-mode - :help "See also `py-indent-tabs-mode-on', `-off' "] - - ["Help on symbol" py-describe-symbol - :help "`py-describe-symbol' -Use pydoc on symbol at point"] - ["Complete symbol" py-shell-complete - :help "`py-shell-complete' -Complete (qualified) symbol before point"] - ["Find function" py-find-function - :help "`py-find-function' -Try to find source definition of function at point"] - ["Update imports" py-update-imports - :help "`py-update-imports' -Update list of top-level imports for completion"] - "-" - )) - ;; Menu py-execute forms - (easy-menu-define py-menu map "Execute Python" - `("PyExec" - :help "Python-specific features" - - ["Execute statement" py-execute-statement - :help "`py-execute-statement' - Send statement at point to Python interpreter. "] - - ["Execute block" py-execute-block - :help "`py-execute-block' - Send block at point to Python interpreter. "] - - ["Execute block-or-clause" py-execute-block-or-clause - :help "`py-execute-block-or-clause' - Send block-or-clause at point to Python interpreter. "] - - ["Execute def" py-execute-def - :help "`py-execute-def' - Send def at point to Python interpreter. "] - - ["Execute class" py-execute-class - :help "`py-execute-class' - Send class at point to Python interpreter. "] - - ["Execute region" py-execute-region - :help "`py-execute-region' - Send region at point to Python interpreter. "] - - ["Execute buffer" py-execute-buffer - :help "`py-execute-buffer' - Send buffer at point to Python interpreter. "] - - ["Execute file" py-execute-file - :help "`py-execute-file' - Send file at point to Python interpreter. "] - ["Execute line" py-execute-line - :help "`py-execute-line' - Send current line from beginning of indent to Python interpreter. "] - - ["Execute expression" py-execute-expression - :help "`py-execute-expression' - Send expression at point to Python interpreter. "] - - ["Execute partial-expression" py-execute-partial-expression - :help "`py-execute-partial-expression' - Send partial-expression at point to Python interpreter. "] - - ["Execute line" py-execute-line - :help "`py-execute-line' - Send line at point to Python interpreter. "] - - ;; statement - ("Execute statement ... " - :help "Execute statement functions" - ["py-execute-statement-python" py-execute-statement-python - :help "Execute statement through a Python interpreter. - With \\[universal-argument] use an unique Python interpreter. "] - ["py-execute-statement-ipython" py-execute-statement-ipython - :help "Execute statement through an IPython interpreter. - With \\[universal-argument] use an unique IPython interpreter. "] - ["py-execute-statement-python3" py-execute-statement-python3 - :help "Execute statement through a Python3 interpreter. - With \\[universal-argument] use an unique Python3 interpreter. "] - ["py-execute-statement-python2" py-execute-statement-python2 - :help "Execute statement through a Python2 interpreter. - With \\[universal-argument] use an unique Python2 interpreter. "] - ["py-execute-statement-python2.7" py-execute-statement-python2.7 - :help "Execute statement through a Python2.7 interpreter. - With \\[universal-argument] use an unique Python2.7 interpreter. "] - ["py-execute-statement-jython" py-execute-statement-jython - :help "Execute statement through a Jython interpreter. - With \\[universal-argument] use an unique Jython interpreter. "] - ["py-execute-statement-python3.2" py-execute-statement-python3.2 - :help "Execute statement through a Python3.2 interpreter. - With \\[universal-argument] use an unique Python3.2 interpreter. "] - ;; dedicated - ["py-execute-statement-python-dedicated" py-execute-statement-python-dedicated - :help "Execute statement through a unique Python interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-statement-ipython-dedicated" py-execute-statement-ipython-dedicated - :help "Execute statement through a unique IPython interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-statement-python3-dedicated" py-execute-statement-python3-dedicated - :help "Execute statement through a unique Python3 interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-statement-python2-dedicated" py-execute-statement-python2-dedicated - :help "Execute statement through a unique Python2 interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-statement-python2.7-dedicated" py-execute-statement-python2.7-dedicated - :help "Execute statement through a unique Python2.7 interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-statement-jython-dedicated" py-execute-statement-jython-dedicated - :help "Execute statement through a unique Jython interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-statement-python3.2-dedicated" py-execute-statement-python3.2-dedicated - :help "Execute statement through a unique Python3.2 interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ;; switch - ["py-execute-statement-python-switch" py-execute-statement-python-switch - :help "Execute statement through a Python interpreter. -With \\[universal-argument] use an unique Python interpreter. "] - ["py-execute-statement-ipython-switch" py-execute-statement-ipython-switch - :help "Execute statement through an IPython interpreter. -With \\[universal-argument] use an unique IPython interpreter. "] - ["py-execute-statement-python3-switch" py-execute-statement-python3-switch - :help "Execute statement through a Python3 interpreter. -With \\[universal-argument] use an unique Python3 interpreter. "] - ["py-execute-statement-python2-switch" py-execute-statement-python2-switch - :help "Execute statement through a Python2 interpreter. -With \\[universal-argument] use an unique Python2 interpreter. "] - ["py-execute-statement-python2.7-switch" py-execute-statement-python2.7-switch - :help "Execute statement through a Python2.7 interpreter. -With \\[universal-argument] use an unique Python2.7 interpreter. "] - ["py-execute-statement-jython-switch" py-execute-statement-jython-switch - :help "Execute statement through a Jython interpreter. -With \\[universal-argument] use an unique Jython interpreter. "] - ["py-execute-statement-python3.2-switch" py-execute-statement-python3.2-switch - :help "Execute statement through a Python3.2 interpreter. -With \\[universal-argument] use an unique Python3.2 interpreter. "] - ;; dedicated-switch - ["py-execute-statement-python-dedicated-switch" py-execute-statement-python-dedicated-switch - :help "Execute statement through a unique Python interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-statement-ipython-dedicated-switch" py-execute-statement-ipython-dedicated-switch - :help "Execute statement through a uniquen IPython interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-statement-python3-dedicated-switch" py-execute-statement-python3-dedicated-switch - :help "Execute statement through a unique Python3 interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-statement-python2-dedicated-switch" py-execute-statement-python2-dedicated-switch - :help "Execute statement through a unique Python2 interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-statement-python2.7-dedicated-switch" py-execute-statement-python2.7-dedicated-switch - :help "Execute statement through a unique Python2.7 interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-statement-jython-dedicated-switch" py-execute-statement-jython-dedicated-switch - :help "Execute statement through a unique Jython interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-statement-python3.2-dedicated-switch" py-execute-statement-python3.2-dedicated-switch - :help "Execute statement through a unique Python3.2 interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ) - - ;; block - ("Execute block ... " - :help "Execute block functions" - ["py-execute-block-python" py-execute-block-python - :help "Execute block through a Python interpreter. - With \\[universal-argument] use an unique Python interpreter. "] - ["py-execute-block-ipython" py-execute-block-ipython - :help "Execute block through an IPython interpreter. - With \\[universal-argument] use an unique IPython interpreter. "] - ["py-execute-block-python3" py-execute-block-python3 - :help "Execute block through a Python3 interpreter. - With \\[universal-argument] use an unique Python3 interpreter. "] - ["py-execute-block-python2" py-execute-block-python2 - :help "Execute block through a Python2 interpreter. - With \\[universal-argument] use an unique Python2 interpreter. "] - ["py-execute-block-python2.7" py-execute-block-python2.7 - :help "Execute block through a Python2.7 interpreter. - With \\[universal-argument] use an unique Python2.7 interpreter. "] - ["py-execute-block-jython" py-execute-block-jython - :help "Execute block through a Jython interpreter. - With \\[universal-argument] use an unique Jython interpreter. "] - ["py-execute-block-python3.2" py-execute-block-python3.2 - :help "Execute block through a Python3.2 interpreter. - With \\[universal-argument] use an unique Python3.2 interpreter. "] - ;; dedicated - ["py-execute-block-python-dedicated" py-execute-block-python-dedicated - :help "Execute block through a unique Python interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-block-ipython-dedicated" py-execute-block-ipython-dedicated - :help "Execute block through a unique IPython interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-block-python3-dedicated" py-execute-block-python3-dedicated - :help "Execute block through a unique Python3 interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-block-python2-dedicated" py-execute-block-python2-dedicated - :help "Execute block through a unique Python2 interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-block-python2.7-dedicated" py-execute-block-python2.7-dedicated - :help "Execute block through a unique Python2.7 interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-block-jython-dedicated" py-execute-block-jython-dedicated - :help "Execute block through a unique Jython interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-block-python3.2-dedicated" py-execute-block-python3.2-dedicated - :help "Execute block through a unique Python3.2 interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ;; switch - ["py-execute-block-python-switch" py-execute-block-python-switch - :help "Execute block through a Python interpreter. -With \\[universal-argument] use an unique Python interpreter. "] - ["py-execute-block-ipython-switch" py-execute-block-ipython-switch - :help "Execute block through an IPython interpreter. -With \\[universal-argument] use an unique IPython interpreter. "] - ["py-execute-block-python3-switch" py-execute-block-python3-switch - :help "Execute block through a Python3 interpreter. -With \\[universal-argument] use an unique Python3 interpreter. "] - ["py-execute-block-python2-switch" py-execute-block-python2-switch - :help "Execute block through a Python2 interpreter. -With \\[universal-argument] use an unique Python2 interpreter. "] - ["py-execute-block-python2.7-switch" py-execute-block-python2.7-switch - :help "Execute block through a Python2.7 interpreter. -With \\[universal-argument] use an unique Python2.7 interpreter. "] - ["py-execute-block-jython-switch" py-execute-block-jython-switch - :help "Execute block through a Jython interpreter. -With \\[universal-argument] use an unique Jython interpreter. "] - ["py-execute-block-python3.2-switch" py-execute-block-python3.2-switch - :help "Execute block through a Python3.2 interpreter. -With \\[universal-argument] use an unique Python3.2 interpreter. "] - ;; dedicated-switch - ["py-execute-block-python-dedicated-switch" py-execute-block-python-dedicated-switch - :help "Execute block through a unique Python interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-block-ipython-dedicated-switch" py-execute-block-ipython-dedicated-switch - :help "Execute block through a uniquen IPython interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-block-python3-dedicated-switch" py-execute-block-python3-dedicated-switch - :help "Execute block through a unique Python3 interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-block-python2-dedicated-switch" py-execute-block-python2-dedicated-switch - :help "Execute block through a unique Python2 interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-block-python2.7-dedicated-switch" py-execute-block-python2.7-dedicated-switch - :help "Execute block through a unique Python2.7 interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-block-jython-dedicated-switch" py-execute-block-jython-dedicated-switch - :help "Execute block through a unique Jython interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-block-python3.2-dedicated-switch" py-execute-block-python3.2-dedicated-switch - :help "Execute block through a unique Python3.2 interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ) - - ;; block-or-clause - ("Execute block-or-clause ... " - :help "Execute block-or-clause functions" - ["py-execute-block-or-clause-python" py-execute-block-or-clause-python - :help "Execute block-or-clause through a Python interpreter. - With \\[universal-argument] use an unique Python interpreter. "] - ["py-execute-block-or-clause-ipython" py-execute-block-or-clause-ipython - :help "Execute block-or-clause through an IPython interpreter. - With \\[universal-argument] use an unique IPython interpreter. "] - ["py-execute-block-or-clause-python3" py-execute-block-or-clause-python3 - :help "Execute block-or-clause through a Python3 interpreter. - With \\[universal-argument] use an unique Python3 interpreter. "] - ["py-execute-block-or-clause-python2" py-execute-block-or-clause-python2 - :help "Execute block-or-clause through a Python2 interpreter. - With \\[universal-argument] use an unique Python2 interpreter. "] - ["py-execute-block-or-clause-python2.7" py-execute-block-or-clause-python2.7 - :help "Execute block-or-clause through a Python2.7 interpreter. - With \\[universal-argument] use an unique Python2.7 interpreter. "] - ["py-execute-block-or-clause-jython" py-execute-block-or-clause-jython - :help "Execute block-or-clause through a Jython interpreter. - With \\[universal-argument] use an unique Jython interpreter. "] - ["py-execute-block-or-clause-python3.2" py-execute-block-or-clause-python3.2 - :help "Execute block-or-clause through a Python3.2 interpreter. - With \\[universal-argument] use an unique Python3.2 interpreter. "] - ;; dedicated - ["py-execute-block-or-clause-python-dedicated" py-execute-block-or-clause-python-dedicated - :help "Execute block-or-clause through a unique Python interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-block-or-clause-ipython-dedicated" py-execute-block-or-clause-ipython-dedicated - :help "Execute block-or-clause through a unique IPython interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-block-or-clause-python3-dedicated" py-execute-block-or-clause-python3-dedicated - :help "Execute block-or-clause through a unique Python3 interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-block-or-clause-python2-dedicated" py-execute-block-or-clause-python2-dedicated - :help "Execute block-or-clause through a unique Python2 interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-block-or-clause-python2.7-dedicated" py-execute-block-or-clause-python2.7-dedicated - :help "Execute block-or-clause through a unique Python2.7 interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-block-or-clause-jython-dedicated" py-execute-block-or-clause-jython-dedicated - :help "Execute block-or-clause through a unique Jython interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-block-or-clause-python3.2-dedicated" py-execute-block-or-clause-python3.2-dedicated - :help "Execute block-or-clause through a unique Python3.2 interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ;; switch - ["py-execute-block-or-clause-python-switch" py-execute-block-or-clause-python-switch - :help "Execute block-or-clause through a Python interpreter. -With \\[universal-argument] use an unique Python interpreter. "] - ["py-execute-block-or-clause-ipython-switch" py-execute-block-or-clause-ipython-switch - :help "Execute block-or-clause through an IPython interpreter. -With \\[universal-argument] use an unique IPython interpreter. "] - ["py-execute-block-or-clause-python3-switch" py-execute-block-or-clause-python3-switch - :help "Execute block-or-clause through a Python3 interpreter. -With \\[universal-argument] use an unique Python3 interpreter. "] - ["py-execute-block-or-clause-python2-switch" py-execute-block-or-clause-python2-switch - :help "Execute block-or-clause through a Python2 interpreter. -With \\[universal-argument] use an unique Python2 interpreter. "] - ["py-execute-block-or-clause-python2.7-switch" py-execute-block-or-clause-python2.7-switch - :help "Execute block-or-clause through a Python2.7 interpreter. -With \\[universal-argument] use an unique Python2.7 interpreter. "] - ["py-execute-block-or-clause-jython-switch" py-execute-block-or-clause-jython-switch - :help "Execute block-or-clause through a Jython interpreter. -With \\[universal-argument] use an unique Jython interpreter. "] - ["py-execute-block-or-clause-python3.2-switch" py-execute-block-or-clause-python3.2-switch - :help "Execute block-or-clause through a Python3.2 interpreter. -With \\[universal-argument] use an unique Python3.2 interpreter. "] - ;; dedicated-switch - ["py-execute-block-or-clause-python-dedicated-switch" py-execute-block-or-clause-python-dedicated-switch - :help "Execute block-or-clause through a unique Python interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-block-or-clause-ipython-dedicated-switch" py-execute-block-or-clause-ipython-dedicated-switch - :help "Execute block-or-clause through a uniquen IPython interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-block-or-clause-python3-dedicated-switch" py-execute-block-or-clause-python3-dedicated-switch - :help "Execute block-or-clause through a unique Python3 interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-block-or-clause-python2-dedicated-switch" py-execute-block-or-clause-python2-dedicated-switch - :help "Execute block-or-clause through a unique Python2 interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-block-or-clause-python2.7-dedicated-switch" py-execute-block-or-clause-python2.7-dedicated-switch - :help "Execute block-or-clause through a unique Python2.7 interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-block-or-clause-jython-dedicated-switch" py-execute-block-or-clause-jython-dedicated-switch - :help "Execute block-or-clause through a unique Jython interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-block-or-clause-python3.2-dedicated-switch" py-execute-block-or-clause-python3.2-dedicated-switch - :help "Execute block-or-clause through a unique Python3.2 interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ) - - ;; def - ("Execute def ... " - :help "Execute def functions" - ["py-execute-def-python" py-execute-def-python - :help "Execute def through a Python interpreter. - With \\[universal-argument] use an unique Python interpreter. "] - ["py-execute-def-ipython" py-execute-def-ipython - :help "Execute def through an IPython interpreter. - With \\[universal-argument] use an unique IPython interpreter. "] - ["py-execute-def-python3" py-execute-def-python3 - :help "Execute def through a Python3 interpreter. - With \\[universal-argument] use an unique Python3 interpreter. "] - ["py-execute-def-python2" py-execute-def-python2 - :help "Execute def through a Python2 interpreter. - With \\[universal-argument] use an unique Python2 interpreter. "] - ["py-execute-def-python2.7" py-execute-def-python2.7 - :help "Execute def through a Python2.7 interpreter. - With \\[universal-argument] use an unique Python2.7 interpreter. "] - ["py-execute-def-jython" py-execute-def-jython - :help "Execute def through a Jython interpreter. - With \\[universal-argument] use an unique Jython interpreter. "] - ["py-execute-def-python3.2" py-execute-def-python3.2 - :help "Execute def through a Python3.2 interpreter. - With \\[universal-argument] use an unique Python3.2 interpreter. "] - ;; dedicated - ["py-execute-def-python-dedicated" py-execute-def-python-dedicated - :help "Execute def through a unique Python interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-def-ipython-dedicated" py-execute-def-ipython-dedicated - :help "Execute def through a unique IPython interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-def-python3-dedicated" py-execute-def-python3-dedicated - :help "Execute def through a unique Python3 interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-def-python2-dedicated" py-execute-def-python2-dedicated - :help "Execute def through a unique Python2 interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-def-python2.7-dedicated" py-execute-def-python2.7-dedicated - :help "Execute def through a unique Python2.7 interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-def-jython-dedicated" py-execute-def-jython-dedicated - :help "Execute def through a unique Jython interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-def-python3.2-dedicated" py-execute-def-python3.2-dedicated - :help "Execute def through a unique Python3.2 interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ;; switch - ["py-execute-def-python-switch" py-execute-def-python-switch - :help "Execute def through a Python interpreter. -With \\[universal-argument] use an unique Python interpreter. "] - ["py-execute-def-ipython-switch" py-execute-def-ipython-switch - :help "Execute def through an IPython interpreter. -With \\[universal-argument] use an unique IPython interpreter. "] - ["py-execute-def-python3-switch" py-execute-def-python3-switch - :help "Execute def through a Python3 interpreter. -With \\[universal-argument] use an unique Python3 interpreter. "] - ["py-execute-def-python2-switch" py-execute-def-python2-switch - :help "Execute def through a Python2 interpreter. -With \\[universal-argument] use an unique Python2 interpreter. "] - ["py-execute-def-python2.7-switch" py-execute-def-python2.7-switch - :help "Execute def through a Python2.7 interpreter. -With \\[universal-argument] use an unique Python2.7 interpreter. "] - ["py-execute-def-jython-switch" py-execute-def-jython-switch - :help "Execute def through a Jython interpreter. -With \\[universal-argument] use an unique Jython interpreter. "] - ["py-execute-def-python3.2-switch" py-execute-def-python3.2-switch - :help "Execute def through a Python3.2 interpreter. -With \\[universal-argument] use an unique Python3.2 interpreter. "] - ;; dedicated-switch - ["py-execute-def-python-dedicated-switch" py-execute-def-python-dedicated-switch - :help "Execute def through a unique Python interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-def-ipython-dedicated-switch" py-execute-def-ipython-dedicated-switch - :help "Execute def through a uniquen IPython interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-def-python3-dedicated-switch" py-execute-def-python3-dedicated-switch - :help "Execute def through a unique Python3 interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-def-python2-dedicated-switch" py-execute-def-python2-dedicated-switch - :help "Execute def through a unique Python2 interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-def-python2.7-dedicated-switch" py-execute-def-python2.7-dedicated-switch - :help "Execute def through a unique Python2.7 interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-def-jython-dedicated-switch" py-execute-def-jython-dedicated-switch - :help "Execute def through a unique Jython interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-def-python3.2-dedicated-switch" py-execute-def-python3.2-dedicated-switch - :help "Execute def through a unique Python3.2 interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ) - - ;; class - ("Execute class ... " - :help "Execute class functions" - ["py-execute-class-python" py-execute-class-python - :help "Execute class through a Python interpreter. - With \\[universal-argument] use an unique Python interpreter. "] - ["py-execute-class-ipython" py-execute-class-ipython - :help "Execute class through an IPython interpreter. - With \\[universal-argument] use an unique IPython interpreter. "] - ["py-execute-class-python3" py-execute-class-python3 - :help "Execute class through a Python3 interpreter. - With \\[universal-argument] use an unique Python3 interpreter. "] - ["py-execute-class-python2" py-execute-class-python2 - :help "Execute class through a Python2 interpreter. - With \\[universal-argument] use an unique Python2 interpreter. "] - ["py-execute-class-python2.7" py-execute-class-python2.7 - :help "Execute class through a Python2.7 interpreter. - With \\[universal-argument] use an unique Python2.7 interpreter. "] - ["py-execute-class-jython" py-execute-class-jython - :help "Execute class through a Jython interpreter. - With \\[universal-argument] use an unique Jython interpreter. "] - ["py-execute-class-python3.2" py-execute-class-python3.2 - :help "Execute class through a Python3.2 interpreter. - With \\[universal-argument] use an unique Python3.2 interpreter. "] - ;; dedicated - ["py-execute-class-python-dedicated" py-execute-class-python-dedicated - :help "Execute class through a unique Python interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-class-ipython-dedicated" py-execute-class-ipython-dedicated - :help "Execute class through a unique IPython interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-class-python3-dedicated" py-execute-class-python3-dedicated - :help "Execute class through a unique Python3 interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-class-python2-dedicated" py-execute-class-python2-dedicated - :help "Execute class through a unique Python2 interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-class-python2.7-dedicated" py-execute-class-python2.7-dedicated - :help "Execute class through a unique Python2.7 interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-class-jython-dedicated" py-execute-class-jython-dedicated - :help "Execute class through a unique Jython interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-class-python3.2-dedicated" py-execute-class-python3.2-dedicated - :help "Execute class through a unique Python3.2 interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ;; switch - ["py-execute-class-python-switch" py-execute-class-python-switch - :help "Execute class through a Python interpreter. -With \\[universal-argument] use an unique Python interpreter. "] - ["py-execute-class-ipython-switch" py-execute-class-ipython-switch - :help "Execute class through an IPython interpreter. -With \\[universal-argument] use an unique IPython interpreter. "] - ["py-execute-class-python3-switch" py-execute-class-python3-switch - :help "Execute class through a Python3 interpreter. -With \\[universal-argument] use an unique Python3 interpreter. "] - ["py-execute-class-python2-switch" py-execute-class-python2-switch - :help "Execute class through a Python2 interpreter. -With \\[universal-argument] use an unique Python2 interpreter. "] - ["py-execute-class-python2.7-switch" py-execute-class-python2.7-switch - :help "Execute class through a Python2.7 interpreter. -With \\[universal-argument] use an unique Python2.7 interpreter. "] - ["py-execute-class-jython-switch" py-execute-class-jython-switch - :help "Execute class through a Jython interpreter. -With \\[universal-argument] use an unique Jython interpreter. "] - ["py-execute-class-python3.2-switch" py-execute-class-python3.2-switch - :help "Execute class through a Python3.2 interpreter. -With \\[universal-argument] use an unique Python3.2 interpreter. "] - ;; dedicated-switch - ["py-execute-class-python-dedicated-switch" py-execute-class-python-dedicated-switch - :help "Execute class through a unique Python interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-class-ipython-dedicated-switch" py-execute-class-ipython-dedicated-switch - :help "Execute class through a uniquen IPython interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-class-python3-dedicated-switch" py-execute-class-python3-dedicated-switch - :help "Execute class through a unique Python3 interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-class-python2-dedicated-switch" py-execute-class-python2-dedicated-switch - :help "Execute class through a unique Python2 interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-class-python2.7-dedicated-switch" py-execute-class-python2.7-dedicated-switch - :help "Execute class through a unique Python2.7 interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-class-jython-dedicated-switch" py-execute-class-jython-dedicated-switch - :help "Execute class through a unique Jython interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-class-python3.2-dedicated-switch" py-execute-class-python3.2-dedicated-switch - :help "Execute class through a unique Python3.2 interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ) - - ;; region - ("Execute region ... " - :help "Execute region functions" - ["py-execute-region-python" py-execute-region-python - :help "Execute region through a Python interpreter. - With \\[universal-argument] use an unique Python interpreter. "] - ["py-execute-region-ipython" py-execute-region-ipython - :help "Execute region through an IPython interpreter. - With \\[universal-argument] use an unique IPython interpreter. "] - ["py-execute-region-python3" py-execute-region-python3 - :help "Execute region through a Python3 interpreter. - With \\[universal-argument] use an unique Python3 interpreter. "] - ["py-execute-region-python2" py-execute-region-python2 - :help "Execute region through a Python2 interpreter. - With \\[universal-argument] use an unique Python2 interpreter. "] - ["py-execute-region-python2.7" py-execute-region-python2.7 - :help "Execute region through a Python2.7 interpreter. - With \\[universal-argument] use an unique Python2.7 interpreter. "] - ["py-execute-region-jython" py-execute-region-jython - :help "Execute region through a Jython interpreter. - With \\[universal-argument] use an unique Jython interpreter. "] - ["py-execute-region-python3.2" py-execute-region-python3.2 - :help "Execute region through a Python3.2 interpreter. - With \\[universal-argument] use an unique Python3.2 interpreter. "] - ;; dedicated - ["py-execute-region-python-dedicated" py-execute-region-python-dedicated - :help "Execute region through a unique Python interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-region-ipython-dedicated" py-execute-region-ipython-dedicated - :help "Execute region through a unique IPython interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-region-python3-dedicated" py-execute-region-python3-dedicated - :help "Execute region through a unique Python3 interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-region-python2-dedicated" py-execute-region-python2-dedicated - :help "Execute region through a unique Python2 interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-region-python2.7-dedicated" py-execute-region-python2.7-dedicated - :help "Execute region through a unique Python2.7 interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-region-jython-dedicated" py-execute-region-jython-dedicated - :help "Execute region through a unique Jython interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-region-python3.2-dedicated" py-execute-region-python3.2-dedicated - :help "Execute region through a unique Python3.2 interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ;; switch - ["py-execute-region-python-switch" py-execute-region-python-switch - :help "Execute region through a Python interpreter. -With \\[universal-argument] use an unique Python interpreter. "] - ["py-execute-region-ipython-switch" py-execute-region-ipython-switch - :help "Execute region through an IPython interpreter. -With \\[universal-argument] use an unique IPython interpreter. "] - ["py-execute-region-python3-switch" py-execute-region-python3-switch - :help "Execute region through a Python3 interpreter. -With \\[universal-argument] use an unique Python3 interpreter. "] - ["py-execute-region-python2-switch" py-execute-region-python2-switch - :help "Execute region through a Python2 interpreter. -With \\[universal-argument] use an unique Python2 interpreter. "] - ["py-execute-region-python2.7-switch" py-execute-region-python2.7-switch - :help "Execute region through a Python2.7 interpreter. -With \\[universal-argument] use an unique Python2.7 interpreter. "] - ["py-execute-region-jython-switch" py-execute-region-jython-switch - :help "Execute region through a Jython interpreter. -With \\[universal-argument] use an unique Jython interpreter. "] - ["py-execute-region-python3.2-switch" py-execute-region-python3.2-switch - :help "Execute region through a Python3.2 interpreter. -With \\[universal-argument] use an unique Python3.2 interpreter. "] - ;; dedicated-switch - ["py-execute-region-python-dedicated-switch" py-execute-region-python-dedicated-switch - :help "Execute region through a unique Python interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-region-ipython-dedicated-switch" py-execute-region-ipython-dedicated-switch - :help "Execute region through a uniquen IPython interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-region-python3-dedicated-switch" py-execute-region-python3-dedicated-switch - :help "Execute region through a unique Python3 interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-region-python2-dedicated-switch" py-execute-region-python2-dedicated-switch - :help "Execute region through a unique Python2 interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-region-python2.7-dedicated-switch" py-execute-region-python2.7-dedicated-switch - :help "Execute region through a unique Python2.7 interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-region-jython-dedicated-switch" py-execute-region-jython-dedicated-switch - :help "Execute region through a unique Jython interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-region-python3.2-dedicated-switch" py-execute-region-python3.2-dedicated-switch - :help "Execute region through a unique Python3.2 interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ) - - ;; buffer - ("Execute buffer ... " - :help "Execute buffer functions" - ["py-execute-buffer-python" py-execute-buffer-python - :help "Execute buffer through a Python interpreter. - With \\[universal-argument] use an unique Python interpreter. "] - ["py-execute-buffer-ipython" py-execute-buffer-ipython - :help "Execute buffer through an IPython interpreter. - With \\[universal-argument] use an unique IPython interpreter. "] - ["py-execute-buffer-python3" py-execute-buffer-python3 - :help "Execute buffer through a Python3 interpreter. - With \\[universal-argument] use an unique Python3 interpreter. "] - ["py-execute-buffer-python2" py-execute-buffer-python2 - :help "Execute buffer through a Python2 interpreter. - With \\[universal-argument] use an unique Python2 interpreter. "] - ["py-execute-buffer-python2.7" py-execute-buffer-python2.7 - :help "Execute buffer through a Python2.7 interpreter. - With \\[universal-argument] use an unique Python2.7 interpreter. "] - ["py-execute-buffer-jython" py-execute-buffer-jython - :help "Execute buffer through a Jython interpreter. - With \\[universal-argument] use an unique Jython interpreter. "] - ["py-execute-buffer-python3.2" py-execute-buffer-python3.2 - :help "Execute buffer through a Python3.2 interpreter. - With \\[universal-argument] use an unique Python3.2 interpreter. "] - ;; dedicated - ["py-execute-buffer-python-dedicated" py-execute-buffer-python-dedicated - :help "Execute buffer through a unique Python interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-buffer-ipython-dedicated" py-execute-buffer-ipython-dedicated - :help "Execute buffer through a unique IPython interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-buffer-python3-dedicated" py-execute-buffer-python3-dedicated - :help "Execute buffer through a unique Python3 interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-buffer-python2-dedicated" py-execute-buffer-python2-dedicated - :help "Execute buffer through a unique Python2 interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-buffer-python2.7-dedicated" py-execute-buffer-python2.7-dedicated - :help "Execute buffer through a unique Python2.7 interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-buffer-jython-dedicated" py-execute-buffer-jython-dedicated - :help "Execute buffer through a unique Jython interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-buffer-python3.2-dedicated" py-execute-buffer-python3.2-dedicated - :help "Execute buffer through a unique Python3.2 interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ;; switch - ["py-execute-buffer-python-switch" py-execute-buffer-python-switch - :help "Execute buffer through a Python interpreter. -With \\[universal-argument] use an unique Python interpreter. "] - ["py-execute-buffer-ipython-switch" py-execute-buffer-ipython-switch - :help "Execute buffer through an IPython interpreter. -With \\[universal-argument] use an unique IPython interpreter. "] - ["py-execute-buffer-python3-switch" py-execute-buffer-python3-switch - :help "Execute buffer through a Python3 interpreter. -With \\[universal-argument] use an unique Python3 interpreter. "] - ["py-execute-buffer-python2-switch" py-execute-buffer-python2-switch - :help "Execute buffer through a Python2 interpreter. -With \\[universal-argument] use an unique Python2 interpreter. "] - ["py-execute-buffer-python2.7-switch" py-execute-buffer-python2.7-switch - :help "Execute buffer through a Python2.7 interpreter. -With \\[universal-argument] use an unique Python2.7 interpreter. "] - ["py-execute-buffer-jython-switch" py-execute-buffer-jython-switch - :help "Execute buffer through a Jython interpreter. -With \\[universal-argument] use an unique Jython interpreter. "] - ["py-execute-buffer-python3.2-switch" py-execute-buffer-python3.2-switch - :help "Execute buffer through a Python3.2 interpreter. -With \\[universal-argument] use an unique Python3.2 interpreter. "] - ;; dedicated-switch - ["py-execute-buffer-python-dedicated-switch" py-execute-buffer-python-dedicated-switch - :help "Execute buffer through a unique Python interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-buffer-ipython-dedicated-switch" py-execute-buffer-ipython-dedicated-switch - :help "Execute buffer through a uniquen IPython interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-buffer-python3-dedicated-switch" py-execute-buffer-python3-dedicated-switch - :help "Execute buffer through a unique Python3 interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-buffer-python2-dedicated-switch" py-execute-buffer-python2-dedicated-switch - :help "Execute buffer through a unique Python2 interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-buffer-python2.7-dedicated-switch" py-execute-buffer-python2.7-dedicated-switch - :help "Execute buffer through a unique Python2.7 interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-buffer-jython-dedicated-switch" py-execute-buffer-jython-dedicated-switch - :help "Execute buffer through a unique Jython interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-buffer-python3.2-dedicated-switch" py-execute-buffer-python3.2-dedicated-switch - :help "Execute buffer through a unique Python3.2 interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ) - - ;; expression - ("Execute expression ... " - :help "Execute expression functions" - ["py-execute-expression-python" py-execute-expression-python - :help "Execute expression through a Python interpreter. - With \\[universal-argument] use an unique Python interpreter. "] - ["py-execute-expression-ipython" py-execute-expression-ipython - :help "Execute expression through an IPython interpreter. - With \\[universal-argument] use an unique IPython interpreter. "] - ["py-execute-expression-python3" py-execute-expression-python3 - :help "Execute expression through a Python3 interpreter. - With \\[universal-argument] use an unique Python3 interpreter. "] - ["py-execute-expression-python2" py-execute-expression-python2 - :help "Execute expression through a Python2 interpreter. - With \\[universal-argument] use an unique Python2 interpreter. "] - ["py-execute-expression-python2.7" py-execute-expression-python2.7 - :help "Execute expression through a Python2.7 interpreter. - With \\[universal-argument] use an unique Python2.7 interpreter. "] - ["py-execute-expression-jython" py-execute-expression-jython - :help "Execute expression through a Jython interpreter. - With \\[universal-argument] use an unique Jython interpreter. "] - ["py-execute-expression-python3.2" py-execute-expression-python3.2 - :help "Execute expression through a Python3.2 interpreter. - With \\[universal-argument] use an unique Python3.2 interpreter. "] - ;; dedicated - ["py-execute-expression-python-dedicated" py-execute-expression-python-dedicated - :help "Execute expression through a unique Python interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-expression-ipython-dedicated" py-execute-expression-ipython-dedicated - :help "Execute expression through a unique IPython interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-expression-python3-dedicated" py-execute-expression-python3-dedicated - :help "Execute expression through a unique Python3 interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-expression-python2-dedicated" py-execute-expression-python2-dedicated - :help "Execute expression through a unique Python2 interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-expression-python2.7-dedicated" py-execute-expression-python2.7-dedicated - :help "Execute expression through a unique Python2.7 interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-expression-jython-dedicated" py-execute-expression-jython-dedicated - :help "Execute expression through a unique Jython interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-expression-python3.2-dedicated" py-execute-expression-python3.2-dedicated - :help "Execute expression through a unique Python3.2 interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ;; switch - ["py-execute-expression-python-switch" py-execute-expression-python-switch - :help "Execute expression through a Python interpreter. -With \\[universal-argument] use an unique Python interpreter. "] - ["py-execute-expression-ipython-switch" py-execute-expression-ipython-switch - :help "Execute expression through an IPython interpreter. -With \\[universal-argument] use an unique IPython interpreter. "] - ["py-execute-expression-python3-switch" py-execute-expression-python3-switch - :help "Execute expression through a Python3 interpreter. -With \\[universal-argument] use an unique Python3 interpreter. "] - ["py-execute-expression-python2-switch" py-execute-expression-python2-switch - :help "Execute expression through a Python2 interpreter. -With \\[universal-argument] use an unique Python2 interpreter. "] - ["py-execute-expression-python2.7-switch" py-execute-expression-python2.7-switch - :help "Execute expression through a Python2.7 interpreter. -With \\[universal-argument] use an unique Python2.7 interpreter. "] - ["py-execute-expression-jython-switch" py-execute-expression-jython-switch - :help "Execute expression through a Jython interpreter. -With \\[universal-argument] use an unique Jython interpreter. "] - ["py-execute-expression-python3.2-switch" py-execute-expression-python3.2-switch - :help "Execute expression through a Python3.2 interpreter. -With \\[universal-argument] use an unique Python3.2 interpreter. "] - ;; dedicated-switch - ["py-execute-expression-python-dedicated-switch" py-execute-expression-python-dedicated-switch - :help "Execute expression through a unique Python interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-expression-ipython-dedicated-switch" py-execute-expression-ipython-dedicated-switch - :help "Execute expression through a uniquen IPython interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-expression-python3-dedicated-switch" py-execute-expression-python3-dedicated-switch - :help "Execute expression through a unique Python3 interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-expression-python2-dedicated-switch" py-execute-expression-python2-dedicated-switch - :help "Execute expression through a unique Python2 interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-expression-python2.7-dedicated-switch" py-execute-expression-python2.7-dedicated-switch - :help "Execute expression through a unique Python2.7 interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-expression-jython-dedicated-switch" py-execute-expression-jython-dedicated-switch - :help "Execute expression through a unique Jython interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-expression-python3.2-dedicated-switch" py-execute-expression-python3.2-dedicated-switch - :help "Execute expression through a unique Python3.2 interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ) ;; partial-expression - - ("Execute partial-expression ... " - :help "Execute partial-expression functions" - ["py-execute-partial-expression-python" py-execute-partial-expression-python - :help "Execute minor-expression through a Python interpreter. - With \\[universal-argument] use an unique Python interpreter. "] - ["py-execute-minor-expression-ipython" py-execute-minor-expression-ipython - :help "Execute minor-expression through an IPython interpreter. - With \\[universal-argument] use an unique IPython interpreter. "] - ["py-execute-minor-expression-python3" py-execute-minor-expression-python3 - :help "Execute minor-expression through a Python3 interpreter. - With \\[universal-argument] use an unique Python3 interpreter. "] - ["py-execute-minor-expression-python2" py-execute-minor-expression-python2 - :help "Execute minor-expression through a Python2 interpreter. - With \\[universal-argument] use an unique Python2 interpreter. "] - ["py-execute-minor-expression-python2.7" py-execute-minor-expression-python2.7 - :help "Execute minor-expression through a Python2.7 interpreter. - With \\[universal-argument] use an unique Python2.7 interpreter. "] - ["py-execute-minor-expression-jython" py-execute-minor-expression-jython - :help "Execute minor-expression through a Jython interpreter. - With \\[universal-argument] use an unique Jython interpreter. "] - ["py-execute-minor-expression-python3.2" py-execute-minor-expression-python3.2 - :help "Execute minor-expression through a Python3.2 interpreter. - With \\[universal-argument] use an unique Python3.2 interpreter. "] - ;; dedicated - ["py-execute-minor-expression-python-dedicated" py-execute-minor-expression-python-dedicated - :help "Execute minor-expression through a unique Python interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-minor-expression-ipython-dedicated" py-execute-minor-expression-ipython-dedicated - :help "Execute minor-expression through a unique IPython interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-minor-expression-python3-dedicated" py-execute-minor-expression-python3-dedicated - :help "Execute minor-expression through a unique Python3 interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-minor-expression-python2-dedicated" py-execute-minor-expression-python2-dedicated - :help "Execute minor-expression through a unique Python2 interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-minor-expression-python2.7-dedicated" py-execute-minor-expression-python2.7-dedicated - :help "Execute minor-expression through a unique Python2.7 interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-minor-expression-jython-dedicated" py-execute-minor-expression-jython-dedicated - :help "Execute minor-expression through a unique Jython interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-minor-expression-python3.2-dedicated" py-execute-minor-expression-python3.2-dedicated - :help "Execute minor-expression through a unique Python3.2 interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ;; switch - ["py-execute-minor-expression-python-switch" py-execute-minor-expression-python-switch - :help "Execute minor-expression through a Python interpreter. -With \\[universal-argument] use an unique Python interpreter. "] - ["py-execute-minor-expression-ipython-switch" py-execute-minor-expression-ipython-switch - :help "Execute minor-expression through an IPython interpreter. -With \\[universal-argument] use an unique IPython interpreter. "] - ["py-execute-minor-expression-python3-switch" py-execute-minor-expression-python3-switch - :help "Execute minor-expression through a Python3 interpreter. -With \\[universal-argument] use an unique Python3 interpreter. "] - ["py-execute-minor-expression-python2-switch" py-execute-minor-expression-python2-switch - :help "Execute minor-expression through a Python2 interpreter. -With \\[universal-argument] use an unique Python2 interpreter. "] - ["py-execute-minor-expression-python2.7-switch" py-execute-minor-expression-python2.7-switch - :help "Execute minor-expression through a Python2.7 interpreter. -With \\[universal-argument] use an unique Python2.7 interpreter. "] - ["py-execute-minor-expression-jython-switch" py-execute-minor-expression-jython-switch - :help "Execute minor-expression through a Jython interpreter. -With \\[universal-argument] use an unique Jython interpreter. "] - ["py-execute-minor-expression-python3.2-switch" py-execute-minor-expression-python3.2-switch - :help "Execute minor-expression through a Python3.2 interpreter. -With \\[universal-argument] use an unique Python3.2 interpreter. "] - ;; dedicated-switch - ["py-execute-minor-expression-python-dedicated-switch" py-execute-minor-expression-python-dedicated-switch - :help "Execute minor-expression through a unique Python interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-minor-expression-ipython-dedicated-switch" py-execute-minor-expression-ipython-dedicated-switch - :help "Execute minor-expression through a uniquen IPython interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-minor-expression-python3-dedicated-switch" py-execute-minor-expression-python3-dedicated-switch - :help "Execute minor-expression through a unique Python3 interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-minor-expression-python2-dedicated-switch" py-execute-minor-expression-python2-dedicated-switch - :help "Execute minor-expression through a unique Python2 interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-minor-expression-python2.7-dedicated-switch" py-execute-minor-expression-python2.7-dedicated-switch - :help "Execute minor-expression through a unique Python2.7 interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-minor-expression-jython-dedicated-switch" py-execute-minor-expression-jython-dedicated-switch - :help "Execute minor-expression through a unique Jython interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-minor-expression-python3.2-dedicated-switch" py-execute-minor-expression-python3.2-dedicated-switch - :help "Execute minor-expression through a unique Python3.2 interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ) ;; line - - ("Execute line ... " - :help "Execute line functions" - ["py-execute-line-python" py-execute-line-python - :help "Execute line through a Python interpreter. - With \\[universal-argument] use an unique Python interpreter. "] - ["py-execute-line-ipython" py-execute-line-ipython - :help "Execute line through an IPython interpreter. - With \\[universal-argument] use an unique IPython interpreter. "] - ["py-execute-line-python3" py-execute-line-python3 - :help "Execute line through a Python3 interpreter. - With \\[universal-argument] use an unique Python3 interpreter. "] - ["py-execute-line-python2" py-execute-line-python2 - :help "Execute line through a Python2 interpreter. - With \\[universal-argument] use an unique Python2 interpreter. "] - ["py-execute-line-python2.7" py-execute-line-python2.7 - :help "Execute line through a Python2.7 interpreter. - With \\[universal-argument] use an unique Python2.7 interpreter. "] - ["py-execute-line-jython" py-execute-line-jython - :help "Execute line through a Jython interpreter. - With \\[universal-argument] use an unique Jython interpreter. "] - ["py-execute-line-python3.2" py-execute-line-python3.2 - :help "Execute line through a Python3.2 interpreter. - With \\[universal-argument] use an unique Python3.2 interpreter. "] - ;; dedicated - ["py-execute-line-python-dedicated" py-execute-line-python-dedicated - :help "Execute line through a unique Python interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-line-ipython-dedicated" py-execute-line-ipython-dedicated - :help "Execute line through a unique IPython interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-line-python3-dedicated" py-execute-line-python3-dedicated - :help "Execute line through a unique Python3 interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-line-python2-dedicated" py-execute-line-python2-dedicated - :help "Execute line through a unique Python2 interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-line-python2.7-dedicated" py-execute-line-python2.7-dedicated - :help "Execute line through a unique Python2.7 interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-line-jython-dedicated" py-execute-line-jython-dedicated - :help "Execute line through a unique Jython interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-line-python3.2-dedicated" py-execute-line-python3.2-dedicated - :help "Execute line through a unique Python3.2 interpreter. -Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] - ;; switch - ["py-execute-line-python-switch" py-execute-line-python-switch - :help "Execute line through a Python interpreter. -With \\[universal-argument] use an unique Python interpreter. "] - ["py-execute-line-ipython-switch" py-execute-line-ipython-switch - :help "Execute line through an IPython interpreter. -With \\[universal-argument] use an unique IPython interpreter. "] - ["py-execute-line-python3-switch" py-execute-line-python3-switch - :help "Execute line through a Python3 interpreter. -With \\[universal-argument] use an unique Python3 interpreter. "] - ["py-execute-line-python2-switch" py-execute-line-python2-switch - :help "Execute line through a Python2 interpreter. -With \\[universal-argument] use an unique Python2 interpreter. "] - ["py-execute-line-python2.7-switch" py-execute-line-python2.7-switch - :help "Execute line through a Python2.7 interpreter. -With \\[universal-argument] use an unique Python2.7 interpreter. "] - ["py-execute-line-jython-switch" py-execute-line-jython-switch - :help "Execute line through a Jython interpreter. -With \\[universal-argument] use an unique Jython interpreter. "] - ["py-execute-line-python3.2-switch" py-execute-line-python3.2-switch - :help "Execute line through a Python3.2 interpreter. -With \\[universal-argument] use an unique Python3.2 interpreter. "] - ;; dedicated-switch - ["py-execute-line-python-dedicated-switch" py-execute-line-python-dedicated-switch - :help "Execute line through a unique Python interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-line-ipython-dedicated-switch" py-execute-line-ipython-dedicated-switch - :help "Execute line through a uniquen IPython interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-line-python3-dedicated-switch" py-execute-line-python3-dedicated-switch - :help "Execute line through a unique Python3 interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-line-python2-dedicated-switch" py-execute-line-python2-dedicated-switch - :help "Execute line through a unique Python2 interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-line-python2.7-dedicated-switch" py-execute-line-python2.7-dedicated-switch - :help "Execute line through a unique Python2.7 interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-line-jython-dedicated-switch" py-execute-line-jython-dedicated-switch - :help "Execute line through a unique Jython interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ["py-execute-line-python3.2-dedicated-switch" py-execute-line-python3.2-dedicated-switch - :help "Execute line through a unique Python3.2 interpreter. -Switch to output buffer; ignores `py-switch-buffers-on-execute-p'. "] - ))) - - ;; Menu command forms - (easy-menu-define py-menu map "Python Mode Commands" - `("PyEdit" - :help "Python-specific features" - ["Copy block" py-copy-block - :help "`py-copy-block' -Copy innermost compound statement at point"] - - ["Copy clause" py-copy-clause - :help "`py-copy-clause' -Copy clause at point"] - - ["Copy def-or-class" py-copy-def-or-class - :help "`py-copy-def-or-class' -Copy innermost definition at point"] - - ["Copy def" py-copy-def - :help "`py-copy-def' -Copy method/function definition at point"] - - ["Copy class" py-copy-class - :help "`py-copy-class' -Copy class definition at point"] - - ["Copy statement" py-copy-statement - :help "`py-copy-statement' -Copy statement at point"] - ["Copy expression" py-copy-expression - :help "`py-copy-expression' -Copy expression at point"] - - ["Copy partial expression" py-copy-partial-expression - :help "`py-copy-partial-expression' -\".\" operators delimit a partial-expression expression on it's level"] - "-" - ["Beginning of block" py-beginning-of-block - :help "`py-beginning-of-block' -Go to start of innermost compound statement at point"] - ["End of block" py-end-of-block - :help "`py-end-of-block' -Go to end of innermost compound statement at point"] - ["Beginning of Def-or-Class" py-beginning-of-def-or-class - :help "`py-beginning-of-def-or-class' -Go to start of innermost definition at point"] - ["End of Def-or-Class" py-end-of-def-or-class - :help "`py-end-of-def-or-class' -Go to end of innermost function definition at point"] - ["Beginning of class" py-beginning-of-class - :help "`py-beginning-of-class' -Go to start of class definition "] - ["End of class" py-end-of-class - :help "`py-end-of-class' -Go to end of class definition "] - ["Beginning of statement" py-beginning-of-statement - :help "`py-beginning-of-statement' -Go to start of a Python statement"] - ["End of statement" py-end-of-statement - :help "`py-end-of-statement' -Go to end of a Python statement"] - ["Beginning of expression" py-beginning-of-expression - :help "Go to the beginning of a compound python expression. - -A a compound python expression might be concatenated by \".\" operator, thus composed by minor python expressions. - -Expression here is conceived as the syntactical component of a statement in Python. See http://docs.python.org/reference -Operators however are left aside resp. limit py-expression designed for edit-purposes."] - ["End of expression" py-end-of-expression - :help "`py-end-of-expression' -Go to the end of a compound python expression. - -A a compound python expression might be concatenated by \".\" operator, thus composed by minor python expressions. - -Expression here is conceived as the syntactical component of a statement in Python. See http://docs.python.org/reference -Operators however are left aside resp. limit py-expression designed for edit-purposes."] - ["Beginning of minor expression" py-beginning-of-partial-expression - :help "`py-beginning-of-partial-expression' -Go to start of an minor expression - -Expression here is conceived as the syntactical component of a statement in Python. See http://docs.python.org/reference -Operators however are left aside resp. limit py-expression designed for edit-purposes."] - ["End of partial-expression" py-end-of-partial-expression - :help "`py-end-of-partial-expression' -Go to end of an partial-expression - -Expression here is conceived as the syntactical component of a statement in Python. See http://docs.python.org/reference -Operators however are left aside resp. limit py-expression designed for edit-purposes."] - ["Backward into nomenclature" py-backward-into-nomenclature - :help " `py-backward-into-nomenclature' -Go backward into nomenclature - -A nomenclature is a fancy way of saying AWordWithMixedCaseNotUnderscores. "] - ["Forward into nomenclature" py-forward-into-nomenclature - :help " `py-forward-into-nomenclature' -Go forward into nomenclature - -A nomenclature is a fancy way of saying AWordWithMixedCaseNotUnderscores. "] - "-" - ["Down statement lc" py-down-statement-lc - :help "`py-down-statement-lc' -Goto beginning of line following end of statement. - -Returns position reached, if successful, nil otherwise. - -\"-lc\" stands for \"left-corner\" - a complementary command travelling left, whilst `py-end-of-statement' stops at right corner. - -See also `py-down-statement': down from current definition to next beginning of statement below. "] - ["Down block lc" py-down-block-lc - :help "`py-down-block-lc' -Goto beginning of line following end of block. - -Returns position reached, if successful, nil otherwise. - -\"-lc\" stands for \"left-corner\" - a complementary command travelling left, whilst `py-end-of-block' stops at right corner. - -See also `py-down-block': down from current definition to next beginning of block below. "] - ["Down def lc" py-down-def-lc - :help "`py-down-def-lc' -Goto beginning of line following end of def. - -Returns position reached, if successful, nil otherwise. - -\"-lc\" stands for \"left-corner\" - a complementary command travelling left, whilst `py-end-of-def' stops at right corner. - -See also `py-down-def': down from current definition to next beginning of def below. - "] - ["Down statement" py-down-statement - :help "`py-down-statement' - -Go to the beginning of next statement below in buffer. - -Returns indentation if statement found, nil otherwise. "] - ["Down block" py-down-block - :help "`py-down-block' - -Go to the beginning of next block below in buffer. - -Returns indentation if block found, nil otherwise. "] - ["Down def" py-down-def - :help "`py-down-def' - -Go to the beginning of next function definition below in buffer. - -Returns indentation if found, nil otherwise. "])) - ;; Python shell menu - (easy-menu-define py-menu map "Python Shells" - `("PyShell" - :help "Python Shells" - ["Default interpreter" py-shell - :help "`py-shell' -Switch to `inferior' Python in separate buffer"] - - ;; ["Toggle enforcement of default interpreter" toggle-force-py-shell-name-p - ;; :help "If customized default `py-shell-name' should be enforced upon execution. "] - - ["Enforce py-shell-name" force-py-shell-name-p-on - :help "Enforce customized default `py-shell-name' should upon execution. "] - - ["Don't enforce default interpreter" force-py-shell-name-p-off - :help "Make execute commands guess interpreter from environment"] - - ;; ["Enforce locally Python shell sessions interpreter " toggle-force-local-shell - ;; :help "If locally indicated Python shell should be taken and - ;; enforced upon sessions execute commands. "] - - ["Enforce local Python shell " py-force-local-shell-on - :help "Locally indicated Python being enforced upon sessions execute commands. "] - - ["Remove local Python shell enforcement, restore default" py-force-local-shell-off - :help "Restore `py-shell-name' default value and `behaviour'. "] - - "-" - - ["python" python - :help "`python' -Start an Python interpreter. - -Optional C-u prompts for options to pass to the Python interpreter. See `py-python-command-args'."] - ["ipython" ipython - :help "`ipython' -Start an IPython interpreter. - -Optional C-u prompts for options to pass to the IPython interpreter. See `py-python-command-args'."] - ["python3" python3 - :help "`python3' -Start an Python3 interpreter. - -Optional C-u prompts for options to pass to the Python3 interpreter. See `py-python-command-args'."] - ["python2" python2 - :help "`python2' -Start an Python2 interpreter. - -Optional C-u prompts for options to pass to the Python2 interpreter. See `py-python-command-args'."] - ["python2.7" python2.7 - :help "`python2.7' -Start an Python2.7 interpreter. - -Optional C-u prompts for options to pass to the Python2.7 interpreter. See `py-python-command-args'."] - ["jython" jython - :help "`jython' -Start an Jython interpreter. - -Optional C-u prompts for options to pass to the Jython interpreter. See `py-python-command-args'."] - ["python3.2" python3.2 - :help "`python3.2' -Start an Python3.2 interpreter. - -Optional C-u prompts for options to pass to the Python3.2 interpreter. See `py-python-command-args'."] - "-" - ["python-dedicated" python-dedicated - :help "`python-dedicated' -Start an unique Python interpreter in another window. - -Optional C-u prompts for options to pass to the Python interpreter. See `py-python-command-args'."] - ["ipython-dedicated" ipython-dedicated - :help "`ipython-dedicated' -Start an unique IPython interpreter in another window. - -Optional C-u prompts for options to pass to the IPython interpreter. See `py-python-command-args'."] - ["python3-dedicated" python3-dedicated - :help "`python3-dedicated' -Start an unique Python3 interpreter in another window. - -Optional C-u prompts for options to pass to the Python3 interpreter. See `py-python-command-args'."] - ["python2-dedicated" python2-dedicated - :help "`python2-dedicated' -Start an unique Python2 interpreter in another window. - -Optional C-u prompts for options to pass to the Python2 interpreter. See `py-python-command-args'."] - ["python2.7-dedicated" python2.7-dedicated - :help "`python2'.7-dedicated -Start an unique Python2.7 interpreter in another window. - -Optional C-u prompts for options to pass to the Python2.7 interpreter. See `py-python-command-args'."] - ["jython-dedicated" jython-dedicated - :help "`jython-dedicated' -Start an unique Jython interpreter in another window. - -Optional C-u prompts for options to pass to the Jython interpreter. See `py-python-command-args'."] - ["python3.2-dedicated" python3.2-dedicated - :help "`python3.2-dedicated' -Start an unique Python3.2 interpreter in another window. - -Optional C-u prompts for options to pass to the Python3.2 interpreter. See `py-python-command-args'."] - "-" - - ["Toggle split-windows-on-execute" py-toggle-split-windows-on-execute - :help "Switch boolean `py-split-windows-on-execute-p'."] - ["Switch split-windows-on-execute ON" py-split-windows-on-execute-on - :help "Switch `py-split-windows-on-execute-p' ON. "] - ["Switch split-windows-on-execute OFF" py-split-windows-on-execute-off - :help "Switch `py-split-windows-on-execute-p' OFF. "] - - ["Toggle shell-switch-buffers-on-execute" py-toggle-shell-switch-buffers-on-execute - :help "Switch boolean `py-switch-buffers-on-execute-p'."] - ["Switch shell-switch-buffers-on-execute ON" py-shell-switch-buffers-on-execute-on - :help "Switch `py-switch-buffers-on-execute-p' ON. "] - ["Switch shell-switch-buffers-on-execute OFF" py-shell-switch-buffers-on-execute-off - :help "Switch `py-switch-buffers-on-execute-p' OFF. "])) - map)) - -;;; Abbrevs -(defun py-edit-abbrevs () - "Jumps to `python-mode-abbrev-table' in a buffer containing lists of abbrev definitions. -You can edit them and type \\<edit-abbrevs-map>\\[edit-abbrevs-redefine] to redefine abbrevs -according to your editing. -Buffer contains a header line for each abbrev table, - which is the abbrev table name in parentheses. -This is followed by one line per abbrev in that table: -NAME USECOUNT EXPANSION HOOK -where NAME and EXPANSION are strings with quotes, -USECOUNT is an integer, and HOOK is any valid function -or may be omitted (it is usually omitted). " - (interactive) - (save-excursion - (let ((mat (abbrev-table-name local-abbrev-table))) - (prepare-abbrev-list-buffer) - (set-buffer "*Abbrevs*") - (switch-to-buffer (current-buffer)) - (goto-char (point-min)) - (search-forward (concat "(" (format "%s" mat)))))) - -(defun py-add-abbrev-propose (table type arg &optional dont-ask) - (save-excursion - (let ((orig (point)) - proposal exp) - (if (= arg 0) - (setq exp - (buffer-substring-no-properties - (point) - (mark))) - (while (< 0 arg) - (py-beginning-of-partial-expression) - (when (looking-at "[[:alpha:]]") - (setq proposal (concat (downcase (match-string-no-properties 0)) proposal))) - (setq arg (1- arg))) - (setq exp (buffer-substring-no-properties (point) orig))) - (setq name - ;; ask only when interactive - (if dont-ask - proposal - (read-string (format (if exp "%s abbrev for \"%s\": " - "Undefine %s abbrev: ") - type exp) proposal))) - (set-text-properties 0 (length name) nil name) - (when (or (null exp) - (not (abbrev-expansion name table)) - (y-or-n-p (format "%s expands to \"%s\"; redefine? " - name (abbrev-expansion name table)))) - (define-abbrev table (downcase name) exp))))) - -(defun py-add-abbrev (arg) - "Defines python-mode specific abbrev for last expressions before point. -Argument is how many `py-partial-expression's form the expansion; or zero means the region is the expansion. - -Reads the abbreviation in the minibuffer; with numeric arg it displays a proposal for an abbrev. -Proposal is composed from the initial character(s) of the -expansion. - -Don't use this function in a Lisp program; use `define-abbrev' instead." - (interactive "p") - (save-excursion - (py-add-abbrev-propose - (if only-global-abbrevs - global-abbrev-table - (or local-abbrev-table - (error "No per-mode abbrev table"))) - "Mode" arg))) - -;;; Hooks -;; arrange to kill temp files when Emacs exists -(add-hook 'kill-emacs-hook 'py-kill-emacs-hook) -(add-hook 'comint-output-filter-functions 'py-pdbtrack-track-stack-file) - -(add-hook 'inferior-python-mode-hook 'py-send-shell-setup-code) - -(remove-hook 'python-mode-hook 'python-setup-brm) -(add-hook 'python-mode-hook - #'(lambda () - (when py-smart-indentation - (if (bobp) - (save-excursion - (save-restriction - (widen) - (while (and (not (eobp)) - (or - (let ((erg (syntax-ppss))) - (or (nth 1 erg) (nth 8 erg))) - (eq 0 (current-indentation)))) - (forward-line 1)) - (back-to-indentation) - (py-guess-indent-offset))) - (py-guess-indent-offset))))) - -(add-hook 'which-func-functions 'python-which-func nil t) - -(add-hook 'comint-output-filter-functions - 'py-comint-output-filter-function) - -(add-hook 'python-mode-hook - (lambda () - (setq indent-tabs-mode py-indent-tabs-mode) - (set (make-local-variable 'beginning-of-defun-function) 'py-beginning-of-def-or-class) - (set (make-local-variable 'end-of-defun-function) 'py-end-of-def-or-class) - ;; (orgstruct-mode 1) - )) -(when py-warn-tmp-files-left-p - (add-hook 'python-mode-hook 'py-warn-tmp-files-left)) - -;; FixMe: for unknown reasons this is not done by mode -(if (file-readable-p abbrev-file-name) - (add-hook 'python-mode-hook '(lambda () (load abbrev-file-name nil t))) - (message "Warning: %s" "no abbrev-file found, customize `abbrev-file-name' in order to make mode-specific abbrevs work. ")) - -;;; - -(add-to-list 'hs-special-modes-alist - (list - 'python-mode - ;; start regex - (concat (if py-hide-show-hide-docstrings - "^\\s-*\"\"\"\\|" "") - (mapconcat 'identity - (mapcar #'(lambda (x) (concat "^\\s-*" x "\\_>")) - py-hide-show-keywords) - "\\|")) - ;; end regex - nil - ;; comment-start regex - "#" - ;; forward-sexp function - (lambda (arg) - (py-down-block-lc) - (skip-chars-backward " \t\n")) - nil)) - -(setq imenu-generic-expression 'py-imenu-generic-regexp) -;;; -(defvar skeleton-further-elements) -(define-derived-mode python-mode fundamental-mode python-mode-modeline-display - "Major mode for editing Python files. - -To submit a problem report, enter `\\[py-submit-bug-report]' from a -`python-mode' buffer. Do `\\[py-describe-mode]' for detailed -documentation. To see what version of `python-mode' you are running, -enter `\\[py-version]'. - -This mode knows about Python indentation, tokens, comments and -continuation lines. Paragraphs are separated by blank lines only. - -COMMANDS - -VARIABLES - -py-indent-offset\t\tindentation increment -py-block-comment-prefix\t\tcomment string used by `comment-region' -py-shell-name\t\tshell command to invoke Python interpreter -py-temp-directory\t\tdirectory used for temp files (if needed) -py-beep-if-tab-change\t\tring the bell if `tab-width' is changed - -\\{python-mode-map}" - :group 'python-mode -;;; Local vars - (set (make-local-variable 'outline-regexp) - (concat (mapconcat 'identity - (mapcar #'(lambda (x) (concat "^\\s-*" x "\\_>")) - py-outline-mode-keywords) - "\\|"))) - (set (make-local-variable 'font-lock-defaults) - '(python-font-lock-keywords nil nil nil nil - (font-lock-syntactic-keywords - . python-font-lock-syntactic-keywords) - ;; This probably isn't worth it. - ;; (font-lock-syntactic-face-function - ;; . python-font-lock-syntactic-face-function) - )) - (set (make-local-variable 'parse-sexp-lookup-properties) t) - (set (make-local-variable 'parse-sexp-ignore-comments) t) - (set (make-local-variable 'comment-start) "# ") - (set (make-local-variable 'comment-start-skip) "^[ \t]*#+ *") - (set (make-local-variable 'comment-column) 40) - (set (make-local-variable 'comment-indent-function) #'py-comment-indent-function) - (set (make-local-variable 'indent-region-function) 'py-indent-region) - (set (make-local-variable 'indent-line-function) 'py-indent-line) - (set (make-local-variable 'hs-hide-comments-when-hiding-all) 'py-hide-comments-when-hiding-all) - (set (make-local-variable 'outline-heading-end-regexp) ":\\s-*\n") - (set (make-local-variable 'outline-level) #'python-outline-level) - (set (make-local-variable 'open-paren-in-column-0-is-defun-start) nil) - (set (make-local-variable 'add-log-current-defun-function) 'py-current-defun) - (set (make-local-variable 'paragraph-start) "\\s-*$") - (set (make-local-variable 'fill-paragraph-function) 'py-fill-paragraph) - (set (make-local-variable 'require-final-newline) mode-require-final-newline) - (make-local-variable 'python-saved-check-command) - (set (make-local-variable 'tab-width) py-indent-offset) - (set (make-local-variable 'eldoc-documentation-function) - #'py-eldoc-function) - (set (make-local-variable 'skeleton-further-elements) - '((< '(backward-delete-char-untabify (min py-indent-offset - (current-column)))) - (^ '(- (1+ (current-indentation)))))) - - (when py-prepare-autopair-mode-p - (add-hook 'python-mode-hook - #'(lambda () - (setq autopair-handle-action-fns - (list #'autopair-default-handle-action - #'autopair-python-triple-quote-action))))) - - (when (and py-imenu-create-index-p (fboundp 'imenu-add-to-menubar)(ignore-errors (require 'imenu))) - (setq imenu-create-index-function #'py-imenu-create-index-new) - (imenu-add-to-menubar "PyIndex")) - ;; (when py-imenu-create-index-p (imenu-add-to-menubar "PyIndex")) - - ;; Now guess `py-indent-offset' - - ;; add the menu - (if py-menu - (easy-menu-add py-menu)) - (when py-hide-show-minor-mode-p (hs-minor-mode 1)) - ;; (py-send-string "import emacs") - - (when py-start-run-py-shell - ;; py-shell may split window, provide restore - (window-configuration-to-register 213465879) - (unless (get-process (py-process-name)) - (let ((oldbuf (current-buffer))) - (save-excursion - (py-shell) - (set-buffer oldbuf)))) - (jump-to-register 213465879)) - ;; (run-mode-hooks 'python-mode-hook) - (when py-outline-minor-mode-p (outline-minor-mode 1)) - (when (interactive-p) (message "python-mode loaded from: %s" "python-mode.el"))) - -(defadvice pdb (before gud-query-cmdline activate) - "Provide a better default command line when called interactively." - (interactive - (list (gud-query-cmdline pdb-path - (file-name-nondirectory buffer-file-name))))) - -(defalias 'py-hungry-delete-forward 'c-hungry-delete-forward) -(defalias 'py-hungry-delete-backwards 'c-hungry-delete-backwards) - -(define-derived-mode python2-mode python-mode "Python2" - "Edit and run code used by Python version 2 series. " - :group 'Python - :abbrev nil - (set (make-local-variable 'py-exec-command) '(format "execfile(r'%s') # PYTHON-MODE\n" filename)) - (set (make-local-variable 'py-exec-string-command) '(format "exec(r'%s') # PYTHON-MODE\n" string)) - (py-toggle-shell "python2")) - -(define-derived-mode python3-mode python-mode "Python3" - "Edit and run code used by Python version 3 series. " - :group 'Python - :abbrev nil - (set (make-local-variable 'py-exec-command) '(format "exec(compile(open('%s').read(), '%s', 'exec')) # PYTHON-MODE\n" file file)) - (set (make-local-variable 'py-exec-string-command) '(format "exec(r'(%s)') # PYTHON-MODE\n" string)) - (py-toggle-shell "python3")) - -;; Utilities - -(defun py-def-or-class-beginning-position () - "Returns beginning position of function or class definition. " - (interactive) - (let ((here (point)) - (pos (progn (py-beginning-of-def-or-class)(point)))) - (prog1 - (point) - (when (and py-verbose-p (interactive-p)) (message "%s" pos)) - (goto-char here)))) - -(defun py-def-or-class-end-position () - "Returns end position of function or class definition. " - (interactive) - (let ((here (point)) - (pos (progn (py-end-of-def-or-class) (point)))) - (prog1 - (point) - (when (and py-verbose-p (interactive-p)) (message "%s" pos)) - (goto-char here)))) - -(defun py-statement-beginning-position () - "Returns beginning position of statement. " - (interactive) - (let ((here (point)) - (pos (progn (py-beginning-of-statement)(point)))) - (prog1 - (point) - (when (and py-verbose-p (interactive-p)) (message "%s" pos)) - (goto-char here)))) - -(defun py-statement-end-position () - "Returns end position of statement. " - (interactive) - (let (erg) - (save-excursion - (setq erg (py-end-of-statement))) - (when (and py-verbose-p (interactive-p)) (message "%s" erg)) - erg)) - -(defun py-current-indentation () - "Returns beginning position of code in line. " - (interactive) - (let ((here (point)) - (pos (progn (back-to-indentation)(point)))) - (prog1 - (point) - (when (and py-verbose-p (interactive-p)) (message "%s" pos)) - (goto-char here)))) - -(make-obsolete 'jpython-mode 'jython-mode nil) -(define-derived-mode jython-mode python-mode "Jython" - "Major mode for editing Jython files. -Like `python-mode', but sets up parameters for Jython subprocesses. -Runs `jython-mode-hook' after `python-mode-hook'." - :group 'python-mode - (py-toggle-shell "jython")) - -;; It's handy to add recognition of Python files to the -;; interpreter-mode-alist and to auto-mode-alist. With the former, we -;; can specify different `derived-modes' based on the #! line, but -;; with the latter, we can't. So we just won't add them if they're -;; already added. - -(let ((modes '(("jython" . jython-mode) - ("python" . python-mode) - ("python3" . python-mode)))) - (while modes - (when (not (assoc (car modes) interpreter-mode-alist)) - (push (car modes) interpreter-mode-alist)) - (setq modes (cdr modes)))) - -(when (not (or (rassq 'python-mode auto-mode-alist) - (rassq 'jython-mode auto-mode-alist))) - (push '("\\.py$" . python-mode) auto-mode-alist)) - -(defun py-kill-emacs-hook () - "Delete files in `py-file-queue'. -These are Python temporary files awaiting execution." - (mapc #'(lambda (filename) - (ignore-errors (delete-file filename))) - py-file-queue)) - -;; arrange to kill temp files when Emacs exists -(add-hook 'kill-emacs-hook 'py-kill-emacs-hook) -(add-hook 'comint-output-filter-functions 'py-pdbtrack-track-stack-file) - -;; inside python-mode already -;; (add-hook 'python-mode-hook -;; (lambda () -;; (defvar py-mode-map python-mode-map)) -;; (set (make-local-variable 'beginning-o1f-defun-function) 'py-beginning-of-def-or-class) -;; (set (make-local-variable 'end-of-defun-function) 'py-end-of-def-or-class)) - -;; Add a designator to the minor mode strings -(or (assq 'py-pdbtrack-is-tracking-p minor-mode-alist) - (push '(py-pdbtrack-is-tracking-p py-pdbtrack-minor-mode-string) - minor-mode-alist)) - -(defun py-python-version (&optional executable verbose) - "Returns versions number of a Python EXECUTABLE, string. - -If no EXECUTABLE given, `py-shell-name' is used. -Interactively output of `--version' is displayed. " - (interactive) - (let* ((executable (or executable py-shell-name)) - (erg (string-strip (shell-command-to-string (concat executable " --version"))))) - (when (interactive-p) (message "%s" erg)) - (unless verbose (setq erg (cadr (split-string erg)))) - erg)) - -(defun py-version () - "Echo the current version of `python-mode' in the minibuffer." - (interactive) - (message "Using `python-mode' version %s" py-version) - (py-keep-region-active)) - -(defun py-install-search-local () - (interactive) - (let ((erg (split-string (shell-command-to-string (concat "find " default-directory " -maxdepth 9 -type f -name \"*python\""))))))) - -;; (defun py-install-local-epdfree () -;; (interactive) -;; (py-install-local-shells "MY-PATH/epdfree")) - -(defun py-install-local-shells (&optional local path-prefix) - "Builds Python-shell commands from executable found in LOCAL. - -If LOCAL is empty, shell-command `find' searches beneath current directory. -Eval resulting buffer to install it, see customizable `py-extensions'. " - (interactive) - (let* ((local-dir (if local - (expand-file-name local) - (read-from-minibuffer "Virtualenv directory: " default-directory))) - (path-separator (if (string-match "/" local-dir) - "/" - "\\" t)) - (shells (split-string (shell-command-to-string (concat "find " local-dir " -maxdepth 9 -type f -executable -name \"*python\"")))) - erg newshell prefix akt end orig) - (set-buffer (get-buffer-create py-extensions)) - (erase-buffer) - (switch-to-buffer (current-buffer)) - (dolist (elt shells) - (setq prefix "") - (setq curexe (substring elt (1+ (string-match "/[^/]+$" elt)))) - (setq aktpath (substring elt 0 (1+ (string-match "/[^/]+$" elt)))) - (dolist (prf (split-string aktpath (regexp-quote path-separator))) - (unless (string= "" prf) - (setq prefix (concat prefix (substring prf 0 1))))) - (setq orig (point)) - (insert py-shell-template) - (setq end (point)) - (goto-char orig) - (when (re-search-forward "\\<NAME\\>" end t 1) - (replace-match (concat prefix "-" (substring elt (1+ (save-match-data (string-match "/[^/]+$" elt)))))t)) - (goto-char orig) - (while (search-forward "DOCNAME" end t 1) - (replace-match (if (string= "ipython" curexe) - "IPython" - (capitalize curexe)) t)) - (goto-char orig) - (when (search-forward "FULLNAME" end t 1) - (replace-match elt t)) - (goto-char (point-max))) - (emacs-lisp-mode) - (if (file-readable-p (concat py-install-directory "/" py-extensions)) - (find-file (concat py-install-directory "/" py-extensions))))) - -;;; Utility stuff - -;; for toggling between CPython and JPython -(defvar python-which-shell nil) -(defvar python-which-args python-python-command-args) -(defvar python-which-bufname "Python") -(make-variable-buffer-local 'python-which-shell) -(make-variable-buffer-local 'python-which-args) -(make-variable-buffer-local 'python-which-bufname) - -;; Add a designator to the minor mode strings -(or (assq 'python-pdbtrack-is-tracking-p minor-mode-alist) - (push '(python-pdbtrack-is-tracking-p python-pdbtrack-minor-mode-string) - minor-mode-alist)) - -;; Bind python-file-queue before installing the kill-emacs-hook. -(defvar python-file-queue nil - "Queue of Python temp files awaiting execution. -Currently-active file is at the head of the list.") - -(defvar python-pdbtrack-is-tracking-p nil) - -(defconst python-pdbtrack-stack-entry-regexp - "^> \\(.*\\)(\\([0-9]+\\))\\([?a-zA-Z0-9_<>]+\\)()" - "Regular expression pdbtrack uses to find a stack trace entry.") - -(defconst python-pdbtrack-input-prompt "\n[(<]*[Ii]?[Pp]db[>)]+ " - "Regular expression pdbtrack uses to recognize a pdb prompt.") - -(defconst python-pdbtrack-track-range 10000 - "Max number of characters from end of buffer to search for stack entry.") - -;;;; Inferior mode stuff (following cmuscheme). - -(defconst python-compilation-regexp-alist - ;; FIXME: maybe these should move to compilation-error-regexp-alist-alist. - ;; The first already is (for CAML), but the second isn't. Anyhow, - ;; these are specific to the inferior buffer. -- fx - `((,(rx line-start (1+ (any " \t")) "File \"" - (group (1+ (not (any "\"<")))) ; avoid `<stdin>' &c - "\", line " (group (1+ digit))) - 1 2) - (,(rx " in file " (group (1+ not-newline)) " on line " - (group (1+ digit))) - 1 2) - ;; pdb stack trace - (,(rx line-start "> " (group (1+ (not (any "(\"<")))) - "(" (group (1+ digit)) ")" (1+ (not (any "("))) "()") - 1 2)) - "`compilation-error-regexp-alist' for inferior Python.") - -(defvar inferior-python-mode-syntax-table - (let ((st (make-syntax-table py-mode-syntax-table))) - ;; Don't get confused by apostrophes in the process's output (e.g. if - ;; you execute "help(os)"). - (modify-syntax-entry ?\' "." st) - ;; Maybe we should do the same for double quotes? - ;; (modify-syntax-entry ?\" "." st) - st)) - -;; Autoloaded. -(declare-function compilation-shell-minor-mode "compile" (&optional arg)) - -;; Fixme: This should inherit some stuff from `python-mode', but I'm -;; not sure how much: at least some keybindings, like C-c C-f; -;; syntax?; font-locking, e.g. for triple-quoted strings? -(define-derived-mode inferior-python-mode comint-mode "Inferior Python" - "Major mode for interacting with an inferior Python process. -A Python process can be started with \\[py-shell]. - -Hooks `comint-mode-hook' and `inferior-python-mode-hook' are run in -that order. - -You can send text to the inferior Python process from other buffers -containing Python source. - * \\[python-switch-to-python] switches the current buffer to the Python - process buffer. - * \\[python-send-region] sends the current region to the Python process. - * \\[python-send-region-and-go] switches to the Python process buffer - after sending the text. -For running multiple processes in multiple buffers, see `run-python' and -`python-buffer'. - -\\{inferior-python-mode-map}" - :group 'python-mode - (setq mode-line-process '(":%s"))) - -(defvar python-preoutput-leftover nil) -(defvar python-preoutput-skip-next-prompt nil) - -;; Using this stops us getting lines in the buffer like -;; >>> ... ... >>> -;; Also look for (and delete) an `_emacs_ok' string and call -;; `python-preoutput-continuation' if we get it. - -(defun py-send-region (start end) - "Send the region to the inferior Python process." - ;; The region is evaluated from a temporary file. This avoids - ;; problems with blank lines, which have different semantics - ;; interactively and in files. It also saves the inferior process - ;; buffer filling up with interpreter prompts. We need a Python - ;; function to remove the temporary file when it has been evaluated - ;; (though we could probably do it in Lisp with a Comint output - ;; filter). This function also catches exceptions and truncates - ;; tracebacks not to mention the frame of the function itself. - ;; - ;; The `compilation-shell-minor-mode' parsing takes care of relating - ;; the reference to the temporary file to the source. - ;; - ;; Fixme: Write a `coding' header to the temp file if the region is - ;; non-ASCII. - (interactive "r") - (let* ((f (make-temp-file "py")) - (command - ;; IPython puts the FakeModule module into __main__ so - ;; emacs.eexecfile becomes useless. - (if (string-match "^ipython" py-shell-name) - (format "execfile %S" f) - (format "emacs.eexecfile(%S)" f))) - (orig-start (copy-marker start))) - (when (save-excursion - (goto-char start) - (/= 0 (current-indentation))) ; need dummy block - (save-excursion - (goto-char orig-start) - ;; Wrong if we had indented code at buffer start. - (set-marker orig-start (line-beginning-position 0))) - (write-region "if True:\n" nil f nil 'nomsg)) - (write-region start end f t 'nomsg) - (python-send-command command) - (with-current-buffer (process-buffer (py-proc)) - ;; Tell compile.el to redirect error locations in file `f' to - ;; positions past marker `orig-start'. It has to be done *after* - ;; `python-send-command''s call to `compilation-forget-errors'. - (compilation-fake-loc orig-start f)))) - -(defun py-send-buffer () - "Send the current buffer to the inferior Python process." - (interactive) - (py-send-region (point-min) (point-max))) - -(defun py-switch-to-python (eob-p) - "Switch to the Python process buffer, maybe starting new process. - -With prefix arg, position cursor at end of buffer." - (interactive "P") - (pop-to-buffer (process-buffer (py-proc)) t) ;Runs python if needed. - (when eob-p - (push-mark) - (goto-char (point-max)))) - -(defun py-send-region-and-go (start end) - "Send the region to the inferior Python process. - -Then switch to the process buffer." - (interactive "r") - (py-send-region start end) - (py-switch-to-python t)) - -(defvar python-prev-dir/file nil - "Caches (directory . file) pair used in the last `py-load-file' command. -Used for determining the default in the next one.") - -(defun py-load-file (file-name) - "Load a Python file FILE-NAME into the inferior Python process. - -If the file has extension `.py' import or reload it as a module. -Treating it as a module keeps the global namespace clean, provides -function location information for debugging, and supports users of -module-qualified names." - (interactive (comint-get-source "Load Python file: " python-prev-dir/file - python-source-modes - t)) ; because execfile needs exact name - (comint-check-source file-name) ; Check to see if buffer needs saving. - (setq python-prev-dir/file (cons (file-name-directory file-name) - (file-name-nondirectory file-name))) - (with-current-buffer (process-buffer (py-proc)) ;Runs python if needed. - ;; Fixme: I'm not convinced by this logic from python-mode.el. - (python-send-command - (if (string-match "\\.py\\'" file-name) - (let ((module (file-name-sans-extension - (file-name-nondirectory file-name)))) - (format "emacs.eimport(%S,%S)" - module (file-name-directory file-name))) - (format "execfile(%S)" file-name))) - (message "%s loaded" file-name))) - -;;; Python-el completion and help - -(defvar view-return-to-alist) -(defvar python-imports) ; forward declaration - -;; Called from `python-mode', this causes a recursive call of the -;; mode. See logic there to break out of the recursion. - -;; pdb tracking is alert once this file is loaded, but takes no action if -;; `python-pdbtrack-do-tracking-p' is nil. -(add-hook 'comint-output-filter-functions 'python-pdbtrack-track-stack-file) - - - -(defun python-comint-output-filter-function (string) - "Watch output for Python prompt and exec next file waiting in queue. -This function is appropriate for `comint-output-filter-functions'." - ;; TBD: this should probably use split-string - (when (and (string-match python--prompt-regexp string) - python-file-queue) - (condition-case nil - (delete-file (car python-file-queue)) - (error nil)) - (setq python-file-queue (cdr python-file-queue)) - (if python-file-queue - (let ((pyproc (get-buffer-process (current-buffer)))) - (python-execute-file pyproc (car python-file-queue)))))) - -(defun python-pdbtrack-overlay-arrow (activation) - "Activate or deactivate arrow at beginning-of-line in current buffer." - (if activation - (progn - (setq overlay-arrow-position (make-marker) - overlay-arrow-string "=>" - python-pdbtrack-is-tracking-p t) - (set-marker overlay-arrow-position - (save-excursion (beginning-of-line) (point)) - (current-buffer))) - (setq overlay-arrow-position nil - python-pdbtrack-is-tracking-p nil))) - -(defun python-pdbtrack-track-stack-file (text) - "Show the file indicated by the pdb stack entry line, in a separate window. - -Activity is disabled if the buffer-local variable -`python-pdbtrack-do-tracking-p' is nil. - -We depend on the pdb input prompt being a match for -`python-pdbtrack-input-prompt'. - -If the traceback target file path is invalid, we look for the -most recently visited python-mode buffer which either has the -name of the current function or class, or which defines the -function or class. This is to provide for scripts not in the -local filesytem (e.g., Zope's 'Script \(Python)', but it's not -Zope specific). If you put a copy of the script in a buffer -named for the script and activate python-mode, then pdbtrack will -find it." - ;; Instead of trying to piece things together from partial text - ;; (which can be almost useless depending on Emacs version), we - ;; monitor to the point where we have the next pdb prompt, and then - ;; check all text from comint-last-input-end to process-mark. - ;; - ;; Also, we're very conservative about clearing the overlay arrow, - ;; to minimize residue. This means, for instance, that executing - ;; other pdb commands wipe out the highlight. You can always do a - ;; 'where' (aka 'w') PDB command to reveal the overlay arrow. - - (let* ((origbuf (current-buffer)) - (currproc (get-buffer-process origbuf))) - - (if (not (and currproc python-pdbtrack-do-tracking-p)) - (python-pdbtrack-overlay-arrow nil) - - (let* ((procmark (process-mark currproc)) - (block (buffer-substring (max comint-last-input-end - (- procmark - python-pdbtrack-track-range)) - procmark)) - target target_fname target_lineno target_buffer) - - (if (not (string-match (concat python-pdbtrack-input-prompt "$") block)) - (python-pdbtrack-overlay-arrow nil) - - (setq target (python-pdbtrack-get-source-buffer block)) - - (if (stringp target) - (progn - (python-pdbtrack-overlay-arrow nil) - (message "pdbtrack: %s" target)) - - (setq target_lineno (car target) - target_buffer (cadr target) - target_fname (buffer-file-name target_buffer)) - (switch-to-buffer-other-window target_buffer) - (goto-char (point-min)) - (forward-line (1- target_lineno)) - (message "pdbtrack: line %s, file %s" target_lineno target_fname) - (python-pdbtrack-overlay-arrow t) - (pop-to-buffer origbuf t) - ;; in large shell buffers, above stuff may cause point to lag output - (goto-char procmark))))))) - -(defun python-pdbtrack-get-source-buffer (block) - "Return line number and buffer of code indicated by block's traceback text. - -We look first to visit the file indicated in the trace. - -Failing that, we look for the most recently visited python-mode buffer -with the same name or having the named function. - -If we're unable find the source code we return a string describing the -problem." - - (if (not (string-match python-pdbtrack-stack-entry-regexp block)) - - "Traceback cue not found" - - (let* ((filename (match-string 1 block)) - (lineno (string-to-number (match-string 2 block))) - (funcname (match-string 3 block)) - funcbuffer) - - (cond ((file-exists-p filename) - (list lineno (find-file-noselect filename))) - - ((setq funcbuffer (python-pdbtrack-grub-for-buffer funcname lineno)) - (if (string-match "/Script (Python)$" filename) - ;; Add in number of lines for leading '##' comments: - (setq lineno - (+ lineno - (with-current-buffer funcbuffer - (if (equal (point-min)(point-max)) - 0 - (count-lines - (point-min) - (max (point-min) - (string-match "^\\([^#]\\|#[^#]\\|#$\\)" - (buffer-substring - (point-min) (point-max)))))))))) - (list lineno funcbuffer)) - - ((= (elt filename 0) ?\<) - (format "(Non-file source: '%s')" filename)) - - (t (format "Not found: %s(), %s" funcname filename)))))) - -(defun python-pdbtrack-grub-for-buffer (funcname lineno) - "Find recent python-mode buffer named, or having function named funcname." - (let ((buffers (buffer-list)) - buf - got) - (while (and buffers (not got)) - (setq buf (car buffers) - buffers (cdr buffers)) - (if (and (with-current-buffer buf - (string= major-mode "python-mode")) - (or (string-match funcname (buffer-name buf)) - (string-match (concat "^\\s-*\\(def\\|class\\)\\s-+" - funcname "\\s-*(") - (with-current-buffer buf - (buffer-substring (point-min) - (point-max)))))) - (setq got buf))) - got)) - -;; Python subprocess utilities and filters -(defun python-execute-file (proc filename) - "Send to Python interpreter process PROC \"execfile('FILENAME')\". -Make that process's buffer visible and force display. Also make -comint believe the user typed this string so that -`kill-output-from-shell' does The Right Thing." - (let ((curbuf (current-buffer)) - (procbuf (process-buffer proc)) - ; (comint-scroll-to-bottom-on-output t) - (msg (format "## working on region in file %s...\n" filename)) - ;; add some comment, so that we can filter it out of history - (cmd (format "execfile(r'%s') # PYTHON-MODE\n" filename))) - (unwind-protect - (with-current-buffer procbuf - (goto-char (point-max)) - (move-marker (process-mark proc) (point)) - (funcall (process-filter proc) proc msg)) - (set-buffer curbuf)) - (process-send-string proc cmd))) - -;; from pycomplete.el -(defun py-find-global-imports () - (save-excursion - (let (first-class-or-def imports) - (goto-char (point-min)) - (setq first-class-or-def - (re-search-forward "^ *\\(def\\|class\\) " nil t)) - (goto-char (point-min)) - (while (re-search-forward - "^\\(import \\|from \\([A-Za-z_][A-Za-z_0-9]*\\) import \\).*" - nil t) - (setq imports (append imports - (list (buffer-substring - (match-beginning 0) - (match-end 0)))))) - imports))) - -;;; Code Completion. - -;; http://lists.gnu.org/archive/html/bug-gnu-emacs/2008-01/msg00076.html -(defalias - 'py-shell-redirect-send-command-to-process - 'comint-redirect-send-command-to-process) -(defalias - 'py-shell-dynamic-simple-complete - 'comint-dynamic-simple-complete) - -(defvar python-imports "None" - "String of top-level import statements updated by `py-find-imports'.") -(make-variable-buffer-local 'python-imports) - -;;; Python Shell Complete -;; Author: Lukasz Pankowski -(defun py-shell-simple-send (proc string) - (comint-simple-send proc string)) - -(defun py-shell-execute-string-now (string &optional shell buffer) - "Send to Python interpreter process PROC \"exec STRING in {}\". -and return collected output" - (let* ((procbuf (or buffer (py-shell nil nil shell))) - - (proc (get-buffer-process procbuf)) - (cmd (format "exec '''%s''' in {}" - (mapconcat 'identity (split-string string "\n") "\\n"))) - (outbuf (get-buffer-create " *pyshellcomplete-output*")) - ;; (lines (reverse py-shell-input-lines)) - ) - ;; (when proc - (unwind-protect - (condition-case nil - (progn - ;; (if lines - ;; (with-current-buffer procbuf - ;; (comint-redirect-send-command-to-process - ;; "\C-c" outbuf proc nil t) - ;; ;; wait for output - ;; (while (not comint-redirect-completed) - ;; (accept-process-output proc 1)))) - (with-current-buffer outbuf - (delete-region (point-min) (point-max))) - (with-current-buffer procbuf - (comint-redirect-send-command-to-process - cmd outbuf proc nil t) - (while (not comint-redirect-completed) ; wait for output - (accept-process-output proc 1))) - (with-current-buffer outbuf - (buffer-substring (point-min) (point-max)))) - (quit (with-current-buffer procbuf - (interrupt-process proc comint-ptyp) - (while (not comint-redirect-completed) ; wait for output - (accept-process-output proc 1))) - (signal 'quit nil))) - ;; (if (with-current-buffer procbuf comint-redirect-completed) - ;; (while lines - ;; (with-current-buffer procbuf - ;; (comint-redirect-send-command-to-process - ;; (car lines) outbuf proc nil t)) - ;; (accept-process-output proc 1) - ;; (setq lines (cdr lines)))) - ))) - -(defun py-dot-word-before-point () - (buffer-substring - (save-excursion (skip-chars-backward "a-zA-Z0-9_.") (point)) - (point))) - -(defun py-completion-at-point () - "An alternative completion, similar the way python.el does it. " - (interactive "*") - (let* ((start (when (skip-chars-backward "[[:alnum:]_]")(point))) - (end (progn (skip-chars-forward "[[:alnum:]_]")(point))) - (completion (when start - (py-symbol-completions (buffer-substring-no-properties start end))))) - (if completion - (progn - (delete-region start end) - (insert (car completion))) - (tab-to-tab-stop)))) - -;; started from python.el's python-completion-at-point -(defun py-script-complete () - (interactive "*") - (let ((end (point)) - (start (save-excursion - (and (re-search-backward - (rx (or buffer-start (regexp "[^[:alnum:]._]")) - (group (1+ (regexp "[[:alnum:]._]"))) point) - nil t) - (match-beginning 1))))) - (when start - (list start end - (completion-table-dynamic 'py-symbol-completions))))) - -(defun py-symbol-completions (symbol) - "Return a list of completions of the string SYMBOL from Python process. -The list is sorted. -Uses `python-imports' to load modules against which to complete." - (when (stringp symbol) - (let ((completions - (condition-case () - (car (read-from-string - (python-send-receive - (format "emacs.complete(%S,%s)" - (substring-no-properties symbol) - python-imports)))) - (error nil)))) - (sort - ;; We can get duplicates from the above -- don't know why. - (delete-dups completions) - #'string<)))) - -(defun py-python-script-complete (&optional shell imports beg end word) - "Complete word before point, if any. Otherwise insert TAB. " - (interactive) - (let* (py-split-windows-on-execute-p - py-switch-buffers-on-execute-p - (orig (point)) - (shell (or shell py-local-versioned-command (py-choose-shell))) - (beg (or beg (save-excursion (skip-chars-backward "a-zA-Z0-9_.") (point)))) - (end (or end (point))) - (word (or word (buffer-substring-no-properties beg end))) - (imports (or imports (py-find-imports))) - ) - (cond ((string= word "") - (message "%s" "Nothing to complete. ") - (tab-to-tab-stop)) - (t (or (setq proc (get-buffer-process (py-buffer-name-prepare shell))) - (setq proc (get-buffer-process (py-shell nil nil shell)))) - (if (processp proc) - (progn - ;; when completing instances, make them known - (when (string-match "^\\(^[a-zA-Z0-9_]+\\)\\.\\([a-zA-Z0-9_]+\\)$" word) - ;; (message "%s" (match-string 1 word)) - (save-excursion - (save-match-data - (goto-char (point-min)) - (when (re-search-forward (concat "^[ \t]*" (match-string-no-properties 1 word) "[ \t]*=[ \t]*[^ \n\r\f\t]+") nil t 1))) - (if imports - (unless (string-match (concat "import " (match-string-no-properties 1 word) ";") imports) - (setq imports - (concat imports (concat "import" (match-string-no-properties 1 word) ";")))) - (setq imports (match-string-no-properties 0 word))))) - (python-shell-completion--do-completion-at-point proc imports word) - ;; (unless (python-shell-completion--do-completion-at-point proc imports word) - (when (eq (point) orig) - (if (and (not (window-full-height-p)) - (buffer-live-p (get-buffer "*Python Completions*"))) - (progn - (set-buffer "*Python Completions*") - (switch-to-buffer (current-buffer)) - (delete-other-windows) - (search-forward word)) - (dabbrev-expand nil))) - nil) - (error "No completion process at proc")))))) - -(defun py-python2-shell-complete (&optional shell) - (interactive) - (let* (py-split-windows-on-execute-p - py-switch-buffers-on-execute-p - (shell (or shell py-local-versioned-command)) - (orig (point)) - (beg (save-excursion (skip-chars-backward "a-zA-Z0-9_.") (point))) - (end (point)) - (word (buffer-substring-no-properties beg end))) - (cond ((string= word "") - (message "%s" "Nothing to complete. ") - (tab-to-tab-stop)) - (t (or (setq proc (get-buffer-process shell)) - (setq proc (get-buffer-process (py-shell nil nil shell)))) - (message "%s" (processp proc)) - (python-shell-completion--do-completion-at-point proc nil word)))) - nil) - -(defun py-python3-shell-complete (&optional shell) - "Complete word before point, if any. Otherwise insert TAB. " - (interactive) - (let* ((shell (or shell py-local-versioned-command)) - (orig (point)) - (beg (save-excursion (skip-chars-backward "a-zA-Z0-9_.") (point))) - (end (point)) - (word (buffer-substring-no-properties beg end))) - (cond ((string= word "") - (message "%s" "Nothing to complete. ") - (tab-to-tab-stop)) - (t - (python-shell-completion--do-completion-at-point (get-buffer-process (current-buffer)) nil word) - nil)))) - -(defun py-shell-complete (&optional shell) - "Complete word before point, if any. Otherwise insert TAB. " - (interactive) - ;; (window-configuration-to-register 313465889) - ;; (save-window-excursion - (if (or (eq major-mode 'comint-mode)(eq major-mode 'inferior-python-mode)) - ;; kind of completion resp. to shell - (let (py-fontify-shell-buffer-p - (shell (or shell (py-report-executable (buffer-name (current-buffer)))))) - (if (string-match "[iI][pP]ython" shell) - (ipython-complete) - (let* ((orig (point)) - (beg (save-excursion (skip-chars-backward "a-zA-Z0-9_.") (point))) - (end (point)) - (word (buffer-substring-no-properties beg end))) - (cond ((string= word "") - (tab-to-tab-stop)) - ((string-match "[pP]ython3[^[:alpha:]]*$" shell) - (python-shell-completion--do-completion-at-point (get-buffer-process (current-buffer)) "" word)) - (t (py-shell-complete-intern word beg end shell)))))) - ;; complete in script buffer - (let* ((shell (or shell (py-choose-shell))) - py-split-windows-on-execute-p - py-switch-buffers-on-execute-p - (proc (or (get-buffer-process shell) - (get-buffer-process (py-shell nil nil shell 'noswitch nil)))) - (beg (save-excursion (skip-chars-backward "a-zA-Z0-9_.") (point))) - (end (point)) - (word (buffer-substring-no-properties beg end)) - (imports (py-find-imports))) - (cond ((string= word "") - (tab-to-tab-stop)) - ((string-match "[iI][pP]ython" shell) - (ipython-complete)) - ((string-match "[pP]ython3[^[:alpha:]]*$" shell) - (python-shell-completion--do-completion-at-point proc (buffer-substring-no-properties beg end) word)) - (imports - (py-python-script-complete shell imports beg end word)) - (t (py-shell-complete-intern word beg end shell imports)))))) - -(defun py-shell-complete-intern (word &optional beg end shell imports) - (let (result) - (if imports - (setq result (py-shell-execute-string-now (format (concat imports " -def print_completions(namespace, text, prefix=''): - for name in namespace: - if name.startswith(text): - print(prefix + name) - -def complete(text): - import __builtin__ - import __main__ - if '.' in text: - terms = text.split('.') - try: - if hasattr(__main__, terms[0]): - obj = getattr(__main__, terms[0]) - else: - obj = getattr(__builtin__, terms[0]) - for term in terms[1:-1]: - obj = getattr(obj, term) - print_completions(dir(obj), terms[-1], text[:text.rfind('.') + 1]) - except AttributeError: - pass - else: - import keyword - print_completions(keyword.kwlist, text) - print_completions(dir(__builtin__), text) - print_completions(dir(__main__), text) -complete('%s')") word) shell)) - (setq result (py-shell-execute-string-now (format " -def print_completions(namespace, text, prefix=''): - for name in namespace: - if name.startswith(text): - print(prefix + name) - -def complete(text): - import __builtin__ - import __main__ - if '.' in text: - terms = text.split('.') - try: - if hasattr(__main__, terms[0]): - obj = getattr(__main__, terms[0]) - else: - obj = getattr(__builtin__, terms[0]) - for term in terms[1:-1]: - obj = getattr(obj, term) - print_completions(dir(obj), terms[-1], text[:text.rfind('.') + 1]) - except AttributeError: - pass - else: - import keyword - print_completions(keyword.kwlist, text) - print_completions(dir(__builtin__), text) - print_completions(dir(__main__), text) -complete('%s')" word) shell (when (comint-check-proc (current-buffer)) (current-buffer))))) - (if (or (eq result nil)(string= "" result)) - (message "Can't complete") - (setq result (replace-regexp-in-string comint-prompt-regexp "" result)) - (let ((comint-completion-addsuffix nil) - (completions - (sort - (delete-dups (if (split-string "\n" "\n") - (split-string result "\n" t) ; XEmacs - (split-string result "\n"))) - #'string<))) - (if (string= (car completions) word) - (tab-to-tab-stop) - (delete-region beg end) - (insert (car completions)))) - ;; list-typ return required by `completion-at-point' - (point)))) - -;;; IPython Shell Complete - -;; see also -;; http://lists.gnu.org/archive/html/bug-gnu-emacs/2008-01/msg00076.html - -(defun ipython-complete (&optional done completion-command-string beg end word) - "Complete the python symbol before point. - -If no completion available, insert a TAB. -Returns the completed symbol, a string, if successful, nil otherwise. " - - (interactive "*") - (let* (py-split-windows-on-execute-p - py-switch-buffers-on-execute-p - (beg (or beg (progn (save-excursion (skip-chars-backward "a-z0-9A-Z_." (point-at-bol)) - (point))))) - (end (or end (point))) - (pattern (or word (buffer-substring-no-properties beg end))) - (sep ";") - (pyshellname "ipython") - (processlist (process-list)) - done - (process - (if ipython-complete-use-separate-shell-p - (unless (and (buffer-live-p "*IPython-Complete*") - (comint-check-proc (process-name (get-buffer-process "*IPython-Complete*")))) - (get-buffer-process (py-shell nil nil pyshellname 'noswitch nil "*IPython-Complete*"))) - (progn - (while (and processlist (not done)) - (when (and - (string= pyshellname (process-name (car processlist))) - (processp (car processlist)) - (setq done (car processlist)))) - (setq processlist (cdr processlist))) - done))) - (python-process (or process - (get-buffer-process (py-shell nil nil (if (string-match "[iI][pP]ython[^[:alpha:]]*$" pyshellname) pyshellname "ipython") 'noswitch nil)))) - (comint-output-filter-functions - (delq 'py-comint-output-filter-function comint-output-filter-functions)) - (comint-output-filter-functions - (append comint-output-filter-functions - '(ansi-color-filter-apply - (lambda (string) - (setq ugly-return (concat ugly-return string)) - (delete-region comint-last-output-start - (process-mark (get-buffer-process (current-buffer)))))))) - - (ccs (or completion-command-string (py-set-ipython-completion-command-string - (process-name python-process)))) - completion completions completion-table ugly-return) - (if (string= pattern "") - (tab-to-tab-stop) - (process-send-string python-process (format ccs pattern)) - (accept-process-output python-process 5) - (setq completions - (split-string (substring ugly-return 0 (position ?\n ugly-return)) sep)) - (setq completion-table (loop for str in completions - collect (list str nil))) - (setq completion (try-completion pattern completion-table)) - (cond ((eq completion t) - (tab-to-tab-stop)) - ((null completion) - ;; if an (I)Python shell didn't run - ;; before, first completion are not delivered - ;; (if done (ipython-complete done) - (message "Can't find completion for \"%s\"" pattern) - (ding) - nil) - ((not (string= pattern completion)) - (delete-region beg end) - (insert completion) - nil) - (t - (when py-verbose-p (message "Making completion list...")) - (with-output-to-temp-buffer "*Python Completions*" - (display-completion-list (all-completions pattern completion-table))) - nil))))) - -(defun ipython-complete-py-shell-name (&optional done) - "Complete the python symbol before point. - -If no completion available, insert a TAB. -Returns the completed symbol, a string, if successful, nil otherwise. - -Bug: if no IPython-shell is running, fails first time due to header returned, which messes up the result. Please repeat once then. " - (interactive "*") - (let* (py-split-windows-on-execute-p - py-switch-buffers-on-execute-p - (beg (progn (save-excursion (skip-chars-backward "a-z0-9A-Z_." (point-at-bol)) - (point)))) - (end (point)) - (pattern (buffer-substring-no-properties beg end)) - (sep ";") - (py-process (or (get-buffer-process (current-buffer)) - (get-buffer-process (py-shell)) - (get-buffer-process (py-shell nil nil "ipython" 'noswitch nil)))) - - (comint-output-filter-functions - (delq 'py-comint-output-filter-function comint-output-filter-functions)) - (comint-output-filter-functions - (append comint-output-filter-functions - '(ansi-color-filter-apply - (lambda (string) - (setq ugly-return (concat ugly-return string)) - (delete-region comint-last-output-start - (process-mark (get-buffer-process (current-buffer)))))))) - completion completions completion-table ugly-return) - (if (string= pattern "") - (tab-to-tab-stop) - (process-send-string py-process - (format (py-set-ipython-completion-command-string (downcase (process-name py-process))) pattern)) - (accept-process-output py-process) - (setq completions - (split-string (substring ugly-return 0 (position ?\n ugly-return)) sep)) - (setq completion-table (loop for str in completions - collect (list str nil))) - (setq completion (try-completion pattern completion-table)) - (cond ((eq completion t)) - ((null completion) - ;; if an (I)Python shell didn't run - ;; before, first completion are not delivered - ;; (if done (ipython-complete done) - (message "Can't find completion for \"%s\"" pattern) - (ding)) - ((not (string= pattern completion)) - (delete-region beg end) - (insert completion)) - (t - (message "Making completion list...") - (with-output-to-temp-buffer "*Python Completions*" - (display-completion-list (all-completions pattern completion-table))) - (message "Making completion list...%s" "done")))) - completion)) - -;;; pep8 -(defun py-pep8-run (command) - "*Run pep8, check formatting (default on the file currently visited). -" - (interactive - (let ((default - (if (buffer-file-name) - (format "%s %s %s" py-pep8-command - (mapconcat 'identity py-pep8-command-args " ") - (buffer-file-name)) - (format "%s %s" py-pep8-command - (mapconcat 'identity py-pep8-command-args " ")))) - (last (when py-pep8-history - (let* ((lastcmd (car py-pep8-history)) - (cmd (cdr (reverse (split-string lastcmd)))) - (newcmd (reverse (cons (buffer-file-name) cmd)))) - (mapconcat 'identity newcmd " "))))) - - (list - (if (fboundp 'read-shell-command) - (read-shell-command "Run pep8 like this: " - (if last - last - default) - 'py-pep8-history) - (read-string "Run pep8 like this: " - (if last - last - default) - 'py-pep8-history))))) - (save-some-buffers (not py-ask-about-save) nil) - (if (fboundp 'compilation-start) - ;; Emacs. - (compilation-start command) - ;; XEmacs. - (when (featurep 'xemacs) - (compile-internal command "No more errors")))) - -(defun py-pep8-help () - "Display pep8 command line help messages. " - (interactive) - (set-buffer (get-buffer-create "*pep8-Help*")) - (erase-buffer) - (shell-command "pep8 --help" "*pep8-Help*")) - -;;; Pylint -(defalias 'pylint 'py-pylint-run) -(defun py-pylint-run (command) - "*Run pylint (default on the file currently visited). - -For help see M-x pylint-help resp. M-x pylint-long-help. -Home-page: http://www.logilab.org/project/pylint " - (interactive - (let ((default - (if (buffer-file-name) - (format "%s %s %s" py-pylint-command - (mapconcat 'identity py-pylint-command-args " ") - (buffer-file-name)) - (format "%s %s" py-pylint-command - (mapconcat 'identity py-pylint-command-args " ")))) - (last (when py-pylint-history - (let* ((lastcmd (car py-pylint-history)) - (cmd (cdr (reverse (split-string lastcmd)))) - (newcmd (reverse (cons (buffer-file-name) cmd)))) - (mapconcat 'identity newcmd " "))))) - - (list - (if (fboundp 'read-shell-command) - (read-shell-command "Run pylint like this: " - (if last - last - default) - 'py-pylint-history) - (read-string "Run pylint like this: " - (if last - last - default) - 'py-pylint-history))))) - (save-some-buffers (not py-ask-about-save) nil) - (if (fboundp 'compilation-start) - ;; Emacs. - (compilation-start command) - ;; XEmacs. - (when (featurep 'xemacs) - (compile-internal command "No more errors")))) - -(defalias 'pylint-help 'py-pylint-help) -(defun py-pylint-help () - "Display Pylint command line help messages. - -Let's have this until more Emacs-like help is prepared " - (interactive) - (set-buffer (get-buffer-create "*Pylint-Help*")) - (erase-buffer) - (shell-command "pylint --long-help" "*Pylint-Help*")) - -(defalias 'pylint-doku 'py-pylint-doku) -(defun py-pylint-doku () - "Display Pylint Documentation. - -Calls `pylint --full-documentation'" - (interactive) - (set-buffer (get-buffer-create "*Pylint-Documentation*")) - (erase-buffer) - (shell-command "pylint --full-documentation" "*Pylint-Documentation*")) - -;;; Pyflakes -(defalias 'pyflakes 'py-pyflakes-run) -(defun py-pyflakes-run (command) - "*Run pyflakes (default on the file currently visited). - -For help see M-x pyflakes-help resp. M-x pyflakes-long-help. -Home-page: http://www.logilab.org/project/pyflakes " - (interactive - (let ((default - (if (buffer-file-name) - (format "%s %s %s" py-pyflakes-command - (mapconcat 'identity py-pyflakes-command-args " ") - (buffer-file-name)) - (format "%s %s" py-pyflakes-command - (mapconcat 'identity py-pyflakes-command-args " ")))) - (last (when py-pyflakes-history - (let* ((lastcmd (car py-pyflakes-history)) - (cmd (cdr (reverse (split-string lastcmd)))) - (newcmd (reverse (cons (buffer-file-name) cmd)))) - (mapconcat 'identity newcmd " "))))) - - (list - (if (fboundp 'read-shell-command) - (read-shell-command "Run pyflakes like this: " - (if last - last - default) - 'py-pyflakes-history) - (read-string "Run pyflakes like this: " - (if last - last - default) - 'py-pyflakes-history))))) - (save-some-buffers (not py-ask-about-save) nil) - (if (fboundp 'compilation-start) - ;; Emacs. - (compilation-start command) - ;; XEmacs. - (when (featurep 'xemacs) - (compile-internal command "No more errors")))) - -(defalias 'pyflakes-help 'py-pyflakes-help) -(defun py-pyflakes-help () - "Display Pyflakes command line help messages. - -Let's have this until more Emacs-like help is prepared " - (interactive) - ;; (set-buffer (get-buffer-create "*Pyflakes-Help*")) - ;; (erase-buffer) - (with-help-window "*Pyflakes-Help*" - (with-current-buffer standard-output - (insert " pyflakes [file-or-directory ...] - - Pyflakes is a simple program which checks Python - source files for errors. It is similar to - PyChecker in scope, but differs in that it does - not execute the modules to check them. This is - both safer and faster, although it does not - perform as many checks. Unlike PyLint, Pyflakes - checks only for logical errors in programs; it - does not perform any checks on style. - - All commandline arguments are checked, which - have to be either regular files or directories. - If a directory is given, every .py file within - will be checked. - - When no commandline arguments are given, data - will be read from standard input. - - The exit status is 0 when no warnings or errors - are found. When errors are found the exit status - is 2. When warnings (but no errors) are found - the exit status is 1. - -Extracted from http://manpages.ubuntu.com/manpages/natty/man1/pyflakes.1.html -")))) - -;;; Pyflakes-pep8 -(defalias 'pyflakespep8 'py-pyflakespep8-run) -(defun py-pyflakespep8-run (command) - "*Run pyflakespep8, check formatting (default on the file currently visited). -" - (interactive - (let ((default - (if (buffer-file-name) - (format "%s %s %s" py-pyflakespep8-command - (mapconcat 'identity py-pyflakespep8-command-args " ") - (buffer-file-name)) - (format "%s %s" py-pyflakespep8-command - (mapconcat 'identity py-pyflakespep8-command-args " ")))) - (last (when py-pyflakespep8-history - (let* ((lastcmd (car py-pyflakespep8-history)) - (cmd (cdr (reverse (split-string lastcmd)))) - (newcmd (reverse (cons (buffer-file-name) cmd)))) - (mapconcat 'identity newcmd " "))))) - - (list - (if (fboundp 'read-shell-command) - (read-shell-command "Run pyflakespep8 like this: " - (if last - last - default) - 'py-pyflakespep8-history) - (read-string "Run pyflakespep8 like this: " - (if last - last - default) - 'py-pyflakespep8-history))))) - (save-some-buffers (not py-ask-about-save) nil) - (if (fboundp 'compilation-start) - ;; Emacs. - (compilation-start command) - ;; XEmacs. - (when (featurep 'xemacs) - (compile-internal command "No more errors")))) - -(defun py-pyflakespep8-help () - "Display pyflakespep8 command line help messages. " - (interactive) - (set-buffer (get-buffer-create "*pyflakespep8-Help*")) - (erase-buffer) - (shell-command "pyflakespep8 --help" "*pyflakespep8-Help*")) - -;;; Pychecker -(defun py-pychecker-run (command) - "*Run pychecker (default on the file currently visited)." - (interactive - (let ((default - (if (buffer-file-name) - (format "%s %s %s" py-pychecker-command - (mapconcat 'identity py-pychecker-command-args " ") - (buffer-file-name)) - (format "%s %s" py-pychecker-command - (mapconcat 'identity py-pychecker-command-args " ")))) - (last (when py-pychecker-history - (let* ((lastcmd (car py-pychecker-history)) - (cmd (cdr (reverse (split-string lastcmd)))) - (newcmd (reverse (cons (buffer-file-name) cmd)))) - (mapconcat 'identity newcmd " "))))) - - (list - (if (fboundp 'read-shell-command) - (read-shell-command "Run pychecker like this: " - (if last - last - default) - 'py-pychecker-history) - (read-string "Run pychecker like this: " - (if last - last - default) - 'py-pychecker-history))))) - (save-some-buffers (not py-ask-about-save) nil) - (if (fboundp 'compilation-start) - ;; Emacs. - (compilation-start command) - ;; XEmacs. - (when (featurep 'xemacs) - (compile-internal command "No more errors")))) - -;;; python-mode skeletons -;; Derived from python.el, where it's instrumented as abbrev -;; Original code authored by Dave Love AFAIK - -(define-skeleton py-else - "Auxiliary skeleton." - nil - (unless (eq ?y (read-char "Add `else' clause? (y for yes or RET for no) ")) - (signal 'quit t)) - < "else:" \n) - -(define-skeleton py-if - "If condition " - "if " "if " str ":" \n - _ \n - ("other condition, %s: " - < "elif " str ":" \n - > _ \n nil) - '(py-else) | ^) - -(define-skeleton py-else - "Auxiliary skeleton." - nil - (unless (eq ?y (read-char "Add `else' clause? (y for yes or RET for no) ")) - (signal 'quit t)) - "else:" \n - > _ \n) - -(define-skeleton py-while - "Condition: " - "while " "while " str ":" \n - > -1 _ \n - '(py-else) | ^) - -(define-skeleton py-for - "Target, %s: " - "for " "for " str " in " (skeleton-read "Expression, %s: ") ":" \n - > -1 _ \n - '(py-else) | ^) - -(define-skeleton py-try/except - "Py-try/except skeleton " - "try:" "try:" \n - > -1 _ \n - ("Exception, %s: " - < "except " str '(python-target) ":" \n - > _ \n nil) - < "except:" \n - > _ \n - '(py-else) | ^) - -(define-skeleton py-target - "Auxiliary skeleton." - "Target, %s: " ", " str | -2) - -(define-skeleton py-try/finally - "Py-try/finally skeleton " - "try:" \n - > -1 _ \n - < "finally:" \n - > _ \n) - -(define-skeleton py-def - "Name: " - "def " str " (" ("Parameter, %s: " (unless (equal ?\( (char-before)) ", ") - str) "):" \n - "\"\"\"" - "\"\"\"" \n ; Fixme: extra space inserted -- why?). - > _ \n) - -(define-skeleton py-class - "Name: " - "class " str " (" ("Inheritance, %s: " - (unless (equal ?\( (char-before)) ", ") - str) - & ")" | -2 ; close list or remove opening - ":" \n - "\"\"\"" - "\"\"\"" \n - > _ \n) - -;;; Virtualenv --- Switching virtual python enviroments seamlessly -;; Thanks Gabriele Lanaro and all working on that -;; Url: http://github.com/gabrielelanaro/emacs-starter-kit -;; The installation is fairly easy, you have the load option, put this -;; in your .emacs: - -;; (load-file "/path/to/virtualenv.el") -;; -;; Otherwise you can do it with the load path: - -;; (add-to-list 'load-path "Path/to/virtualenv.el/containing/directory/" -;; (require 'virtualenv) - -;; The usage is very intuitive, to activate a virtualenv use - -;; M-x virtualenv-activate - -;; It will prompt you for the virtual environment path. -;; If you want to deactivate a virtual environment, use: - -;; M-x virtualenv-deactivate - -(defvar virtualenv-workon-home nil) - -(if (getenv "WORKON_HOME") - (setq virtualenv-workon-home (getenv "WORKON_HOME")) - (setq virtualenv-workon-home "~/.virtualenvs")) - -(defvar virtualenv-name nil) -(setq virtualenv-name nil) - -;;TODO: Move to a generic UTILITY or TOOL package -(defun virtualenv-filter (predicate sequence) - "Apply to each element of SEQUENCE the PREDICATE, if FUNCTION - returns non-nil append the element to the return value of - virtualenv-filter: a list" - (let ((retlist '())) - (dolist (element sequence) - (when (funcall predicate element) - (push element retlist))) - (nreverse retlist))) - -(defun virtualenv-append-path (dir var) - "Append DIR to a path-like varibale VAR, for example: - (virtualenv-append-path /usr/bin:/bin /home/test/bin) -> /home/test/bin:/usr/bin:/bin" - (concat (expand-file-name dir) - path-separator - var)) - -(defun virtualenv-add-to-path (dir) - "Add the specified path element to the Emacs PATH" - (setenv "PATH" - (virtualenv-append-path dir - (getenv "PATH")))) - -(defun virtualenv-current () - "barfs the current activated virtualenv" - (interactive) - (message virtualenv-name)) - -(defun virtualenv-activate (dir) - "Activate the virtualenv located in DIR" - (interactive "DVirtualenv Directory: ") - - ;; Eventually deactivate previous virtualenv - (when virtualenv-name - (virtualenv-deactivate)) - - ;; Storing old variables - (setq virtualenv-old-path (getenv "PATH")) - (setq virtualenv-old-exec-path exec-path) - - (setenv "VIRTUAL_ENV" dir) - (virtualenv-add-to-path (concat dir "bin")) - (add-to-list 'exec-path (concat dir "bin")) - - (setq virtualenv-name dir) - - (message (concat "Virtualenv '" virtualenv-name "' activated."))) - -(defun virtualenv-deactivate () - "Deactivate the current virtual enviroment" - (interactive) - - ;; Restoring old variables - (setenv "PATH" virtualenv-old-path) - (setq exec-path virtualenv-old-exec-path) - - (message (concat "Virtualenv '" virtualenv-name "' deactivated.")) - - (setq virtualenv-name nil)) - -(defun virtualenvp (dir) - "Check if a directory is a virtualenv" - (file-exists-p (concat dir "/bin/activate"))) - -(defun virtualenv-workon-complete () - "return available completions for virtualenv-workon" - (let - ;;Varlist - ((filelist (directory-files virtualenv-workon-home t))) - ;; Get only the basename from the list of the virtual environments - ;; paths - (mapcar 'file-name-nondirectory - ;; Filter the directories and then the virtual environments - (virtualenv-filter 'virtualenvp - (virtualenv-filter 'file-directory-p filelist))))) - -(defun virtualenv-workon (name) - "Issue a virtualenvwrapper-like virtualenv-workon command" - (interactive (list (completing-read "Virtualenv: " (virtualenv-workon-complete)))) - (virtualenv-activate (concat (getenv "WORKON_HOME") "/" name))) - -(defun py-toggle-local-default-use () - (interactive) - "Toggle boolean value of `py-use-local-default'. - -Returns `py-use-local-default' - -See also `py-install-local-shells' -Installing named virualenv shells is the preffered way, -as it leaves your system default unchanged." - (setq py-use-local-default (not py-use-local-default)) - (when (interactive-p) (message "py-use-local-default set to %s" py-use-local-default)) - py-use-local-default) - -;;; Extended executes -;; created by `write-extended-execute-forms' -(defun py-execute-prepare (form &optional shell dedicated switch) - "Used by python-extended-executes ." - (save-excursion - (let ((beg (prog1 - (or (funcall (intern-soft (concat "py-beginning-of-" form "-p"))) - - (funcall (intern-soft (concat "py-beginning-of-" form))) - (push-mark)))) - (end (funcall (intern-soft (concat "py-end-of-" form))))) - (py-execute-base beg end shell dedicated switch)))) - -(defun py-execute-statement-python () - "Send statement at point to Python interpreter. " - (interactive) - (py-execute-prepare "statement" "python" nil nil)) - -(defun py-execute-statement-python-switch () - "Send statement at point to Python interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "statement" "python" nil 'switch)) - -(defun py-execute-statement-python-noswitch () - "Send statement at point to Python interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "statement" "python" nil 'noswitch)) - -(defun py-execute-statement-python-dedicated () - "Send statement at point to Python unique interpreter. " - (interactive) - (py-execute-prepare "statement" "python" t nil)) - -(defun py-execute-statement-python-dedicated-switch () - "Send statement at point to Python unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "statement" "python" t 'switch)) - -(defun py-execute-statement-ipython () - "Send statement at point to IPython interpreter. " - (interactive) - (py-execute-prepare "statement" "ipython" nil nil)) - -(defun py-execute-statement-ipython-switch () - "Send statement at point to IPython interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "statement" "ipython" nil 'switch)) - -(defun py-execute-statement-ipython-noswitch () - "Send statement at point to IPython interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "statement" "ipython" nil 'noswitch)) - -(defun py-execute-statement-ipython-dedicated () - "Send statement at point to IPython unique interpreter. " - (interactive) - (py-execute-prepare "statement" "ipython" t nil)) - -(defun py-execute-statement-ipython-dedicated-switch () - "Send statement at point to IPython unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "statement" "ipython" t 'switch)) - -(defun py-execute-statement-python3 () - "Send statement at point to Python3 interpreter. " - (interactive) - (py-execute-prepare "statement" "python3" nil nil)) - -(defun py-execute-statement-python3-switch () - "Send statement at point to Python3 interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "statement" "python3" nil 'switch)) - -(defun py-execute-statement-python3-noswitch () - "Send statement at point to Python3 interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "statement" "python3" nil 'noswitch)) - -(defun py-execute-statement-python3-dedicated () - "Send statement at point to Python3 unique interpreter. " - (interactive) - (py-execute-prepare "statement" "python3" t nil)) - -(defun py-execute-statement-python3-dedicated-switch () - "Send statement at point to Python3 unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "statement" "python3" t 'switch)) - -(defun py-execute-statement-python2 () - "Send statement at point to Python2 interpreter. " - (interactive) - (py-execute-prepare "statement" "python2" nil nil)) - -(defun py-execute-statement-python2-switch () - "Send statement at point to Python2 interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "statement" "python2" nil 'switch)) - -(defun py-execute-statement-python2-noswitch () - "Send statement at point to Python2 interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "statement" "python2" nil 'noswitch)) - -(defun py-execute-statement-python2-dedicated () - "Send statement at point to Python2 unique interpreter. " - (interactive) - (py-execute-prepare "statement" "python2" t nil)) - -(defun py-execute-statement-python2-dedicated-switch () - "Send statement at point to Python2 unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "statement" "python2" t 'switch)) - -(defun py-execute-statement-python2.7 () - "Send statement at point to Python2.7 interpreter. " - (interactive) - (py-execute-prepare "statement" "python2.7" nil nil)) - -(defun py-execute-statement-python2.7-switch () - "Send statement at point to Python2.7 interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "statement" "python2.7" nil 'switch)) - -(defun py-execute-statement-python2.7-noswitch () - "Send statement at point to Python2.7 interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "statement" "python2.7" nil 'noswitch)) - -(defun py-execute-statement-python2.7-dedicated () - "Send statement at point to Python2.7 unique interpreter. " - (interactive) - (py-execute-prepare "statement" "python2.7" t nil)) - -(defun py-execute-statement-python2.7-dedicated-switch () - "Send statement at point to Python2.7 unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "statement" "python2.7" t 'switch)) - -(defun py-execute-statement-jython () - "Send statement at point to Jython interpreter. " - (interactive) - (py-execute-prepare "statement" "jython" nil nil)) - -(defun py-execute-statement-jython-switch () - "Send statement at point to Jython interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "statement" "jython" nil 'switch)) - -(defun py-execute-statement-jython-noswitch () - "Send statement at point to Jython interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "statement" "jython" nil 'noswitch)) - -(defun py-execute-statement-jython-dedicated () - "Send statement at point to Jython unique interpreter. " - (interactive) - (py-execute-prepare "statement" "jython" t nil)) - -(defun py-execute-statement-jython-dedicated-switch () - "Send statement at point to Jython unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "statement" "jython" t 'switch)) - -(defun py-execute-statement-python3.2 () - "Send statement at point to Python3.2 interpreter. " - (interactive) - (py-execute-prepare "statement" "python3.2" nil nil)) - -(defun py-execute-statement-python3.2-switch () - "Send statement at point to Python3.2 interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "statement" "python3.2" nil 'switch)) - -(defun py-execute-statement-python3.2-noswitch () - "Send statement at point to Python3.2 interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "statement" "python3.2" nil 'noswitch)) - -(defun py-execute-statement-python3.2-dedicated () - "Send statement at point to Python3.2 unique interpreter. " - (interactive) - (py-execute-prepare "statement" "python3.2" t nil)) - -(defun py-execute-statement-python3.2-dedicated-switch () - "Send statement at point to Python3.2 unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "statement" "python3.2" t 'switch)) - -(defun py-execute-block-python () - "Send block at point to Python interpreter. " - (interactive) - (py-execute-prepare "block" "python" nil nil)) - -(defun py-execute-block-python-switch () - "Send block at point to Python interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "block" "python" nil 'switch)) - -(defun py-execute-block-python-noswitch () - "Send block at point to Python interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "block" "python" nil 'noswitch)) - -(defun py-execute-block-python-dedicated () - "Send block at point to Python unique interpreter. " - (interactive) - (py-execute-prepare "block" "python" t nil)) - -(defun py-execute-block-python-dedicated-switch () - "Send block at point to Python unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "block" "python" t 'switch)) - -(defun py-execute-block-ipython () - "Send block at point to IPython interpreter. " - (interactive) - (py-execute-prepare "block" "ipython" nil nil)) - -(defun py-execute-block-ipython-switch () - "Send block at point to IPython interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "block" "ipython" nil 'switch)) - -(defun py-execute-block-ipython-noswitch () - "Send block at point to IPython interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "block" "ipython" nil 'noswitch)) - -(defun py-execute-block-ipython-dedicated () - "Send block at point to IPython unique interpreter. " - (interactive) - (py-execute-prepare "block" "ipython" t nil)) - -(defun py-execute-block-ipython-dedicated-switch () - "Send block at point to IPython unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "block" "ipython" t 'switch)) - -(defun py-execute-block-python3 () - "Send block at point to Python3 interpreter. " - (interactive) - (py-execute-prepare "block" "python3" nil nil)) - -(defun py-execute-block-python3-switch () - "Send block at point to Python3 interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "block" "python3" nil 'switch)) - -(defun py-execute-block-python3-noswitch () - "Send block at point to Python3 interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "block" "python3" nil 'noswitch)) - -(defun py-execute-block-python3-dedicated () - "Send block at point to Python3 unique interpreter. " - (interactive) - (py-execute-prepare "block" "python3" t nil)) - -(defun py-execute-block-python3-dedicated-switch () - "Send block at point to Python3 unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "block" "python3" t 'switch)) - -(defun py-execute-block-python2 () - "Send block at point to Python2 interpreter. " - (interactive) - (py-execute-prepare "block" "python2" nil nil)) - -(defun py-execute-block-python2-switch () - "Send block at point to Python2 interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "block" "python2" nil 'switch)) - -(defun py-execute-block-python2-noswitch () - "Send block at point to Python2 interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "block" "python2" nil 'noswitch)) - -(defun py-execute-block-python2-dedicated () - "Send block at point to Python2 unique interpreter. " - (interactive) - (py-execute-prepare "block" "python2" t nil)) - -(defun py-execute-block-python2-dedicated-switch () - "Send block at point to Python2 unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "block" "python2" t 'switch)) - -(defun py-execute-block-python2.7 () - "Send block at point to Python2.7 interpreter. " - (interactive) - (py-execute-prepare "block" "python2.7" nil nil)) - -(defun py-execute-block-python2.7-switch () - "Send block at point to Python2.7 interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "block" "python2.7" nil 'switch)) - -(defun py-execute-block-python2.7-noswitch () - "Send block at point to Python2.7 interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "block" "python2.7" nil 'noswitch)) - -(defun py-execute-block-python2.7-dedicated () - "Send block at point to Python2.7 unique interpreter. " - (interactive) - (py-execute-prepare "block" "python2.7" t nil)) - -(defun py-execute-block-python2.7-dedicated-switch () - "Send block at point to Python2.7 unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "block" "python2.7" t 'switch)) - -(defun py-execute-block-jython () - "Send block at point to Jython interpreter. " - (interactive) - (py-execute-prepare "block" "jython" nil nil)) - -(defun py-execute-block-jython-switch () - "Send block at point to Jython interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "block" "jython" nil 'switch)) - -(defun py-execute-block-jython-noswitch () - "Send block at point to Jython interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "block" "jython" nil 'noswitch)) - -(defun py-execute-block-jython-dedicated () - "Send block at point to Jython unique interpreter. " - (interactive) - (py-execute-prepare "block" "jython" t nil)) - -(defun py-execute-block-jython-dedicated-switch () - "Send block at point to Jython unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "block" "jython" t 'switch)) - -(defun py-execute-block-python3.2 () - "Send block at point to Python3.2 interpreter. " - (interactive) - (py-execute-prepare "block" "python3.2" nil nil)) - -(defun py-execute-block-python3.2-switch () - "Send block at point to Python3.2 interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "block" "python3.2" nil 'switch)) - -(defun py-execute-block-python3.2-noswitch () - "Send block at point to Python3.2 interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "block" "python3.2" nil 'noswitch)) - -(defun py-execute-block-python3.2-dedicated () - "Send block at point to Python3.2 unique interpreter. " - (interactive) - (py-execute-prepare "block" "python3.2" t nil)) - -(defun py-execute-block-python3.2-dedicated-switch () - "Send block at point to Python3.2 unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "block" "python3.2" t 'switch)) - -(defun py-execute-clause-python () - "Send clause at point to Python interpreter. " - (interactive) - (py-execute-prepare "clause" "python" nil nil)) - -(defun py-execute-clause-python-switch () - "Send clause at point to Python interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "clause" "python" nil 'switch)) - -(defun py-execute-clause-python-noswitch () - "Send clause at point to Python interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "clause" "python" nil 'noswitch)) - -(defun py-execute-clause-python-dedicated () - "Send clause at point to Python unique interpreter. " - (interactive) - (py-execute-prepare "clause" "python" t nil)) - -(defun py-execute-clause-python-dedicated-switch () - "Send clause at point to Python unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "clause" "python" t 'switch)) - -(defun py-execute-clause-ipython () - "Send clause at point to IPython interpreter. " - (interactive) - (py-execute-prepare "clause" "ipython" nil nil)) - -(defun py-execute-clause-ipython-switch () - "Send clause at point to IPython interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "clause" "ipython" nil 'switch)) - -(defun py-execute-clause-ipython-noswitch () - "Send clause at point to IPython interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "clause" "ipython" nil 'noswitch)) - -(defun py-execute-clause-ipython-dedicated () - "Send clause at point to IPython unique interpreter. " - (interactive) - (py-execute-prepare "clause" "ipython" t nil)) - -(defun py-execute-clause-ipython-dedicated-switch () - "Send clause at point to IPython unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "clause" "ipython" t 'switch)) - -(defun py-execute-clause-python3 () - "Send clause at point to Python3 interpreter. " - (interactive) - (py-execute-prepare "clause" "python3" nil nil)) - -(defun py-execute-clause-python3-switch () - "Send clause at point to Python3 interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "clause" "python3" nil 'switch)) - -(defun py-execute-clause-python3-noswitch () - "Send clause at point to Python3 interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "clause" "python3" nil 'noswitch)) - -(defun py-execute-clause-python3-dedicated () - "Send clause at point to Python3 unique interpreter. " - (interactive) - (py-execute-prepare "clause" "python3" t nil)) - -(defun py-execute-clause-python3-dedicated-switch () - "Send clause at point to Python3 unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "clause" "python3" t 'switch)) - -(defun py-execute-clause-python2 () - "Send clause at point to Python2 interpreter. " - (interactive) - (py-execute-prepare "clause" "python2" nil nil)) - -(defun py-execute-clause-python2-switch () - "Send clause at point to Python2 interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "clause" "python2" nil 'switch)) - -(defun py-execute-clause-python2-noswitch () - "Send clause at point to Python2 interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "clause" "python2" nil 'noswitch)) - -(defun py-execute-clause-python2-dedicated () - "Send clause at point to Python2 unique interpreter. " - (interactive) - (py-execute-prepare "clause" "python2" t nil)) - -(defun py-execute-clause-python2-dedicated-switch () - "Send clause at point to Python2 unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "clause" "python2" t 'switch)) - -(defun py-execute-clause-python2.7 () - "Send clause at point to Python2.7 interpreter. " - (interactive) - (py-execute-prepare "clause" "python2.7" nil nil)) - -(defun py-execute-clause-python2.7-switch () - "Send clause at point to Python2.7 interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "clause" "python2.7" nil 'switch)) - -(defun py-execute-clause-python2.7-noswitch () - "Send clause at point to Python2.7 interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "clause" "python2.7" nil 'noswitch)) - -(defun py-execute-clause-python2.7-dedicated () - "Send clause at point to Python2.7 unique interpreter. " - (interactive) - (py-execute-prepare "clause" "python2.7" t nil)) - -(defun py-execute-clause-python2.7-dedicated-switch () - "Send clause at point to Python2.7 unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "clause" "python2.7" t 'switch)) - -(defun py-execute-clause-jython () - "Send clause at point to Jython interpreter. " - (interactive) - (py-execute-prepare "clause" "jython" nil nil)) - -(defun py-execute-clause-jython-switch () - "Send clause at point to Jython interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "clause" "jython" nil 'switch)) - -(defun py-execute-clause-jython-noswitch () - "Send clause at point to Jython interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "clause" "jython" nil 'noswitch)) - -(defun py-execute-clause-jython-dedicated () - "Send clause at point to Jython unique interpreter. " - (interactive) - (py-execute-prepare "clause" "jython" t nil)) - -(defun py-execute-clause-jython-dedicated-switch () - "Send clause at point to Jython unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "clause" "jython" t 'switch)) - -(defun py-execute-clause-python3.2 () - "Send clause at point to Python3.2 interpreter. " - (interactive) - (py-execute-prepare "clause" "python3.2" nil nil)) - -(defun py-execute-clause-python3.2-switch () - "Send clause at point to Python3.2 interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "clause" "python3.2" nil 'switch)) - -(defun py-execute-clause-python3.2-noswitch () - "Send clause at point to Python3.2 interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "clause" "python3.2" nil 'noswitch)) - -(defun py-execute-clause-python3.2-dedicated () - "Send clause at point to Python3.2 unique interpreter. " - (interactive) - (py-execute-prepare "clause" "python3.2" t nil)) - -(defun py-execute-clause-python3.2-dedicated-switch () - "Send clause at point to Python3.2 unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "clause" "python3.2" t 'switch)) - -(defun py-execute-block-or-clause-python () - "Send block-or-clause at point to Python interpreter. " - (interactive) - (py-execute-prepare "block-or-clause" "python" nil nil)) - -(defun py-execute-block-or-clause-python-switch () - "Send block-or-clause at point to Python interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "block-or-clause" "python" nil 'switch)) - -(defun py-execute-block-or-clause-python-noswitch () - "Send block-or-clause at point to Python interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "block-or-clause" "python" nil 'noswitch)) - -(defun py-execute-block-or-clause-python-dedicated () - "Send block-or-clause at point to Python unique interpreter. " - (interactive) - (py-execute-prepare "block-or-clause" "python" t nil)) - -(defun py-execute-block-or-clause-python-dedicated-switch () - "Send block-or-clause at point to Python unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "block-or-clause" "python" t 'switch)) - -(defun py-execute-block-or-clause-ipython () - "Send block-or-clause at point to IPython interpreter. " - (interactive) - (py-execute-prepare "block-or-clause" "ipython" nil nil)) - -(defun py-execute-block-or-clause-ipython-switch () - "Send block-or-clause at point to IPython interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "block-or-clause" "ipython" nil 'switch)) - -(defun py-execute-block-or-clause-ipython-noswitch () - "Send block-or-clause at point to IPython interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "block-or-clause" "ipython" nil 'noswitch)) - -(defun py-execute-block-or-clause-ipython-dedicated () - "Send block-or-clause at point to IPython unique interpreter. " - (interactive) - (py-execute-prepare "block-or-clause" "ipython" t nil)) - -(defun py-execute-block-or-clause-ipython-dedicated-switch () - "Send block-or-clause at point to IPython unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "block-or-clause" "ipython" t 'switch)) - -(defun py-execute-block-or-clause-python3 () - "Send block-or-clause at point to Python3 interpreter. " - (interactive) - (py-execute-prepare "block-or-clause" "python3" nil nil)) - -(defun py-execute-block-or-clause-python3-switch () - "Send block-or-clause at point to Python3 interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "block-or-clause" "python3" nil 'switch)) - -(defun py-execute-block-or-clause-python3-noswitch () - "Send block-or-clause at point to Python3 interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "block-or-clause" "python3" nil 'noswitch)) - -(defun py-execute-block-or-clause-python3-dedicated () - "Send block-or-clause at point to Python3 unique interpreter. " - (interactive) - (py-execute-prepare "block-or-clause" "python3" t nil)) - -(defun py-execute-block-or-clause-python3-dedicated-switch () - "Send block-or-clause at point to Python3 unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "block-or-clause" "python3" t 'switch)) - -(defun py-execute-block-or-clause-python2 () - "Send block-or-clause at point to Python2 interpreter. " - (interactive) - (py-execute-prepare "block-or-clause" "python2" nil nil)) - -(defun py-execute-block-or-clause-python2-switch () - "Send block-or-clause at point to Python2 interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "block-or-clause" "python2" nil 'switch)) - -(defun py-execute-block-or-clause-python2-noswitch () - "Send block-or-clause at point to Python2 interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "block-or-clause" "python2" nil 'noswitch)) - -(defun py-execute-block-or-clause-python2-dedicated () - "Send block-or-clause at point to Python2 unique interpreter. " - (interactive) - (py-execute-prepare "block-or-clause" "python2" t nil)) - -(defun py-execute-block-or-clause-python2-dedicated-switch () - "Send block-or-clause at point to Python2 unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "block-or-clause" "python2" t 'switch)) - -(defun py-execute-block-or-clause-python2.7 () - "Send block-or-clause at point to Python2.7 interpreter. " - (interactive) - (py-execute-prepare "block-or-clause" "python2.7" nil nil)) - -(defun py-execute-block-or-clause-python2.7-switch () - "Send block-or-clause at point to Python2.7 interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "block-or-clause" "python2.7" nil 'switch)) - -(defun py-execute-block-or-clause-python2.7-noswitch () - "Send block-or-clause at point to Python2.7 interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "block-or-clause" "python2.7" nil 'noswitch)) - -(defun py-execute-block-or-clause-python2.7-dedicated () - "Send block-or-clause at point to Python2.7 unique interpreter. " - (interactive) - (py-execute-prepare "block-or-clause" "python2.7" t nil)) - -(defun py-execute-block-or-clause-python2.7-dedicated-switch () - "Send block-or-clause at point to Python2.7 unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "block-or-clause" "python2.7" t 'switch)) - -(defun py-execute-block-or-clause-jython () - "Send block-or-clause at point to Jython interpreter. " - (interactive) - (py-execute-prepare "block-or-clause" "jython" nil nil)) - -(defun py-execute-block-or-clause-jython-switch () - "Send block-or-clause at point to Jython interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "block-or-clause" "jython" nil 'switch)) - -(defun py-execute-block-or-clause-jython-noswitch () - "Send block-or-clause at point to Jython interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "block-or-clause" "jython" nil 'noswitch)) - -(defun py-execute-block-or-clause-jython-dedicated () - "Send block-or-clause at point to Jython unique interpreter. " - (interactive) - (py-execute-prepare "block-or-clause" "jython" t nil)) - -(defun py-execute-block-or-clause-jython-dedicated-switch () - "Send block-or-clause at point to Jython unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "block-or-clause" "jython" t 'switch)) - -(defun py-execute-block-or-clause-python3.2 () - "Send block-or-clause at point to Python3.2 interpreter. " - (interactive) - (py-execute-prepare "block-or-clause" "python3.2" nil nil)) - -(defun py-execute-block-or-clause-python3.2-switch () - "Send block-or-clause at point to Python3.2 interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "block-or-clause" "python3.2" nil 'switch)) - -(defun py-execute-block-or-clause-python3.2-noswitch () - "Send block-or-clause at point to Python3.2 interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "block-or-clause" "python3.2" nil 'noswitch)) - -(defun py-execute-block-or-clause-python3.2-dedicated () - "Send block-or-clause at point to Python3.2 unique interpreter. " - (interactive) - (py-execute-prepare "block-or-clause" "python3.2" t nil)) - -(defun py-execute-block-or-clause-python3.2-dedicated-switch () - "Send block-or-clause at point to Python3.2 unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "block-or-clause" "python3.2" t 'switch)) - -(defun py-execute-def-python () - "Send def at point to Python interpreter. " - (interactive) - (py-execute-prepare "def" "python" nil nil)) - -(defun py-execute-def-python-switch () - "Send def at point to Python interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "def" "python" nil 'switch)) - -(defun py-execute-def-python-noswitch () - "Send def at point to Python interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "def" "python" nil 'noswitch)) - -(defun py-execute-def-python-dedicated () - "Send def at point to Python unique interpreter. " - (interactive) - (py-execute-prepare "def" "python" t nil)) - -(defun py-execute-def-python-dedicated-switch () - "Send def at point to Python unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "def" "python" t 'switch)) - -(defun py-execute-def-ipython () - "Send def at point to IPython interpreter. " - (interactive) - (py-execute-prepare "def" "ipython" nil nil)) - -(defun py-execute-def-ipython-switch () - "Send def at point to IPython interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "def" "ipython" nil 'switch)) - -(defun py-execute-def-ipython-noswitch () - "Send def at point to IPython interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "def" "ipython" nil 'noswitch)) - -(defun py-execute-def-ipython-dedicated () - "Send def at point to IPython unique interpreter. " - (interactive) - (py-execute-prepare "def" "ipython" t nil)) - -(defun py-execute-def-ipython-dedicated-switch () - "Send def at point to IPython unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "def" "ipython" t 'switch)) - -(defun py-execute-def-python3 () - "Send def at point to Python3 interpreter. " - (interactive) - (py-execute-prepare "def" "python3" nil nil)) - -(defun py-execute-def-python3-switch () - "Send def at point to Python3 interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "def" "python3" nil 'switch)) - -(defun py-execute-def-python3-noswitch () - "Send def at point to Python3 interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "def" "python3" nil 'noswitch)) - -(defun py-execute-def-python3-dedicated () - "Send def at point to Python3 unique interpreter. " - (interactive) - (py-execute-prepare "def" "python3" t nil)) - -(defun py-execute-def-python3-dedicated-switch () - "Send def at point to Python3 unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "def" "python3" t 'switch)) - -(defun py-execute-def-python2 () - "Send def at point to Python2 interpreter. " - (interactive) - (py-execute-prepare "def" "python2" nil nil)) - -(defun py-execute-def-python2-switch () - "Send def at point to Python2 interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "def" "python2" nil 'switch)) - -(defun py-execute-def-python2-noswitch () - "Send def at point to Python2 interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "def" "python2" nil 'noswitch)) - -(defun py-execute-def-python2-dedicated () - "Send def at point to Python2 unique interpreter. " - (interactive) - (py-execute-prepare "def" "python2" t nil)) - -(defun py-execute-def-python2-dedicated-switch () - "Send def at point to Python2 unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "def" "python2" t 'switch)) - -(defun py-execute-def-python2.7 () - "Send def at point to Python2.7 interpreter. " - (interactive) - (py-execute-prepare "def" "python2.7" nil nil)) - -(defun py-execute-def-python2.7-switch () - "Send def at point to Python2.7 interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "def" "python2.7" nil 'switch)) - -(defun py-execute-def-python2.7-noswitch () - "Send def at point to Python2.7 interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "def" "python2.7" nil 'noswitch)) - -(defun py-execute-def-python2.7-dedicated () - "Send def at point to Python2.7 unique interpreter. " - (interactive) - (py-execute-prepare "def" "python2.7" t nil)) - -(defun py-execute-def-python2.7-dedicated-switch () - "Send def at point to Python2.7 unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "def" "python2.7" t 'switch)) - -(defun py-execute-def-jython () - "Send def at point to Jython interpreter. " - (interactive) - (py-execute-prepare "def" "jython" nil nil)) - -(defun py-execute-def-jython-switch () - "Send def at point to Jython interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "def" "jython" nil 'switch)) - -(defun py-execute-def-jython-noswitch () - "Send def at point to Jython interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "def" "jython" nil 'noswitch)) - -(defun py-execute-def-jython-dedicated () - "Send def at point to Jython unique interpreter. " - (interactive) - (py-execute-prepare "def" "jython" t nil)) - -(defun py-execute-def-jython-dedicated-switch () - "Send def at point to Jython unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "def" "jython" t 'switch)) - -(defun py-execute-def-python3.2 () - "Send def at point to Python3.2 interpreter. " - (interactive) - (py-execute-prepare "def" "python3.2" nil nil)) - -(defun py-execute-def-python3.2-switch () - "Send def at point to Python3.2 interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "def" "python3.2" nil 'switch)) - -(defun py-execute-def-python3.2-noswitch () - "Send def at point to Python3.2 interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "def" "python3.2" nil 'noswitch)) - -(defun py-execute-def-python3.2-dedicated () - "Send def at point to Python3.2 unique interpreter. " - (interactive) - (py-execute-prepare "def" "python3.2" t nil)) - -(defun py-execute-def-python3.2-dedicated-switch () - "Send def at point to Python3.2 unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "def" "python3.2" t 'switch)) - -(defun py-execute-class-python () - "Send class at point to Python interpreter. " - (interactive) - (py-execute-prepare "class" "python" nil nil)) - -(defun py-execute-class-python-switch () - "Send class at point to Python interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "class" "python" nil 'switch)) - -(defun py-execute-class-python-noswitch () - "Send class at point to Python interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "class" "python" nil 'noswitch)) - -(defun py-execute-class-python-dedicated () - "Send class at point to Python unique interpreter. " - (interactive) - (py-execute-prepare "class" "python" t nil)) - -(defun py-execute-class-python-dedicated-switch () - "Send class at point to Python unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "class" "python" t 'switch)) - -(defun py-execute-class-ipython () - "Send class at point to IPython interpreter. " - (interactive) - (py-execute-prepare "class" "ipython" nil nil)) - -(defun py-execute-class-ipython-switch () - "Send class at point to IPython interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "class" "ipython" nil 'switch)) - -(defun py-execute-class-ipython-noswitch () - "Send class at point to IPython interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "class" "ipython" nil 'noswitch)) - -(defun py-execute-class-ipython-dedicated () - "Send class at point to IPython unique interpreter. " - (interactive) - (py-execute-prepare "class" "ipython" t nil)) - -(defun py-execute-class-ipython-dedicated-switch () - "Send class at point to IPython unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "class" "ipython" t 'switch)) - -(defun py-execute-class-python3 () - "Send class at point to Python3 interpreter. " - (interactive) - (py-execute-prepare "class" "python3" nil nil)) - -(defun py-execute-class-python3-switch () - "Send class at point to Python3 interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "class" "python3" nil 'switch)) - -(defun py-execute-class-python3-noswitch () - "Send class at point to Python3 interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "class" "python3" nil 'noswitch)) - -(defun py-execute-class-python3-dedicated () - "Send class at point to Python3 unique interpreter. " - (interactive) - (py-execute-prepare "class" "python3" t nil)) - -(defun py-execute-class-python3-dedicated-switch () - "Send class at point to Python3 unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "class" "python3" t 'switch)) - -(defun py-execute-class-python2 () - "Send class at point to Python2 interpreter. " - (interactive) - (py-execute-prepare "class" "python2" nil nil)) - -(defun py-execute-class-python2-switch () - "Send class at point to Python2 interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "class" "python2" nil 'switch)) - -(defun py-execute-class-python2-noswitch () - "Send class at point to Python2 interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "class" "python2" nil 'noswitch)) - -(defun py-execute-class-python2-dedicated () - "Send class at point to Python2 unique interpreter. " - (interactive) - (py-execute-prepare "class" "python2" t nil)) - -(defun py-execute-class-python2-dedicated-switch () - "Send class at point to Python2 unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "class" "python2" t 'switch)) - -(defun py-execute-class-python2.7 () - "Send class at point to Python2.7 interpreter. " - (interactive) - (py-execute-prepare "class" "python2.7" nil nil)) - -(defun py-execute-class-python2.7-switch () - "Send class at point to Python2.7 interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "class" "python2.7" nil 'switch)) - -(defun py-execute-class-python2.7-noswitch () - "Send class at point to Python2.7 interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "class" "python2.7" nil 'noswitch)) - -(defun py-execute-class-python2.7-dedicated () - "Send class at point to Python2.7 unique interpreter. " - (interactive) - (py-execute-prepare "class" "python2.7" t nil)) - -(defun py-execute-class-python2.7-dedicated-switch () - "Send class at point to Python2.7 unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "class" "python2.7" t 'switch)) - -(defun py-execute-class-jython () - "Send class at point to Jython interpreter. " - (interactive) - (py-execute-prepare "class" "jython" nil nil)) - -(defun py-execute-class-jython-switch () - "Send class at point to Jython interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "class" "jython" nil 'switch)) - -(defun py-execute-class-jython-noswitch () - "Send class at point to Jython interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "class" "jython" nil 'noswitch)) - -(defun py-execute-class-jython-dedicated () - "Send class at point to Jython unique interpreter. " - (interactive) - (py-execute-prepare "class" "jython" t nil)) - -(defun py-execute-class-jython-dedicated-switch () - "Send class at point to Jython unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "class" "jython" t 'switch)) - -(defun py-execute-class-python3.2 () - "Send class at point to Python3.2 interpreter. " - (interactive) - (py-execute-prepare "class" "python3.2" nil nil)) - -(defun py-execute-class-python3.2-switch () - "Send class at point to Python3.2 interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "class" "python3.2" nil 'switch)) - -(defun py-execute-class-python3.2-noswitch () - "Send class at point to Python3.2 interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "class" "python3.2" nil 'noswitch)) - -(defun py-execute-class-python3.2-dedicated () - "Send class at point to Python3.2 unique interpreter. " - (interactive) - (py-execute-prepare "class" "python3.2" t nil)) - -(defun py-execute-class-python3.2-dedicated-switch () - "Send class at point to Python3.2 unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "class" "python3.2" t 'switch)) - -(defun py-execute-region-python (beg end) - "Send region at point to Python interpreter. " - (interactive "r") - (py-execute-base beg end "python" nil nil)) - -(defun py-execute-region-python-switch (beg end) - "Send region at point to Python interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive "r") - (py-execute-base beg end "python" nil 'switch)) - -(defun py-execute-region-python-noswitch (beg end) - "Send region at point to Python interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive "r") - (py-execute-base beg end "python" nil 'noswitch)) - -(defun py-execute-region-python-dedicated (beg end) - "Send region at point to Python unique interpreter. " - (interactive "r") - (py-execute-base beg end "python" t nil)) - -(defun py-execute-region-python-dedicated-switch (beg end) - "Send region at point to Python unique interpreter and switch to result. " - (interactive "r") - (py-execute-base beg end "python" t 'switch)) - -(defun py-execute-region-ipython (beg end) - "Send region at point to IPython interpreter. " - (interactive "r") - (py-execute-base beg end "ipython" nil nil)) - -(defun py-execute-region-ipython-switch (beg end) - "Send region at point to IPython interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive "r") - (py-execute-base beg end "ipython" nil 'switch)) - -(defun py-execute-region-ipython-noswitch (beg end) - "Send region at point to IPython interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive "r") - (py-execute-base beg end "ipython" nil 'noswitch)) - -(defun py-execute-region-ipython-dedicated (beg end) - "Send region at point to IPython unique interpreter. " - (interactive "r") - (py-execute-base beg end "ipython" t nil)) - -(defun py-execute-region-ipython-dedicated-switch (beg end) - "Send region at point to IPython unique interpreter and switch to result. " - (interactive "r") - (py-execute-base beg end "ipython" t 'switch)) - -(defun py-execute-region-python3 (beg end) - "Send region at point to Python3 interpreter. " - (interactive "r") - (py-execute-base beg end "python3" nil nil)) - -(defun py-execute-region-python3-switch (beg end) - "Send region at point to Python3 interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive "r") - (py-execute-base beg end "python3" nil 'switch)) - -(defun py-execute-region-python3-noswitch (beg end) - "Send region at point to Python3 interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive "r") - (py-execute-base beg end "python3" nil 'noswitch)) - -(defun py-execute-region-python3-dedicated (beg end) - "Send region at point to Python3 unique interpreter. " - (interactive "r") - (py-execute-base beg end "python3" t nil)) - -(defun py-execute-region-python3-dedicated-switch (beg end) - "Send region at point to Python3 unique interpreter and switch to result. " - (interactive "r") - (py-execute-base beg end "python3" t 'switch)) - -(defun py-execute-region-python2 (beg end) - "Send region at point to Python2 interpreter. " - (interactive "r") - (py-execute-base beg end "python2" nil nil)) - -(defun py-execute-region-python2-switch (beg end) - "Send region at point to Python2 interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive "r") - (py-execute-base beg end "python2" nil 'switch)) - -(defun py-execute-region-python2-noswitch (beg end) - "Send region at point to Python2 interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive "r") - (py-execute-base beg end "python2" nil 'noswitch)) - -(defun py-execute-region-python2-dedicated (beg end) - "Send region at point to Python2 unique interpreter. " - (interactive "r") - (py-execute-base beg end "python2" t nil)) - -(defun py-execute-region-python2-dedicated-switch (beg end) - "Send region at point to Python2 unique interpreter and switch to result. " - (interactive "r") - (py-execute-base beg end "python2" t 'switch)) - -(defun py-execute-region-python2.7 (beg end) - "Send region at point to Python2.7 interpreter. " - (interactive "r") - (py-execute-base beg end "python2.7" nil nil)) - -(defun py-execute-region-python2.7-switch (beg end) - "Send region at point to Python2.7 interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive "r") - (py-execute-base beg end "python2.7" nil 'switch)) - -(defun py-execute-region-python2.7-noswitch (beg end) - "Send region at point to Python2.7 interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive "r") - (py-execute-base beg end "python2.7" nil 'noswitch)) - -(defun py-execute-region-python2.7-dedicated (beg end) - "Send region at point to Python2.7 unique interpreter. " - (interactive "r") - (py-execute-base beg end "python2.7" t nil)) - -(defun py-execute-region-python2.7-dedicated-switch (beg end) - "Send region at point to Python2.7 unique interpreter and switch to result. " - (interactive "r") - (py-execute-base beg end "python2.7" t 'switch)) - -(defun py-execute-region-jython (beg end) - "Send region at point to Jython interpreter. " - (interactive "r") - (py-execute-base beg end "jython" nil nil)) - -(defun py-execute-region-jython-switch (beg end) - "Send region at point to Jython interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive "r") - (py-execute-base beg end "jython" nil 'switch)) - -(defun py-execute-region-jython-noswitch (beg end) - "Send region at point to Jython interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive "r") - (py-execute-base beg end "jython" nil 'noswitch)) - -(defun py-execute-region-jython-dedicated (beg end) - "Send region at point to Jython unique interpreter. " - (interactive "r") - (py-execute-base beg end "jython" t nil)) - -(defun py-execute-region-jython-dedicated-switch (beg end) - "Send region at point to Jython unique interpreter and switch to result. " - (interactive "r") - (py-execute-base beg end "jython" t 'switch)) - -(defun py-execute-region-python3.2 (beg end) - "Send region at point to Python3.2 interpreter. " - (interactive "r") - (py-execute-base beg end "python3.2" nil nil)) - -(defun py-execute-region-python3.2-switch (beg end) - "Send region at point to Python3.2 interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive "r") - (py-execute-base beg end "python3.2" nil 'switch)) - -(defun py-execute-region-python3.2-noswitch (beg end) - "Send region at point to Python3.2 interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive "r") - (py-execute-base beg end "python3.2" nil 'noswitch)) - -(defun py-execute-region-python3.2-dedicated (beg end) - "Send region at point to Python3.2 unique interpreter. " - (interactive "r") - (py-execute-base beg end "python3.2" t nil)) - -(defun py-execute-region-python3.2-dedicated-switch (beg end) - "Send region at point to Python3.2 unique interpreter and switch to result. " - (interactive "r") - (py-execute-base beg end "python3.2" t 'switch)) - -(defun py-execute-buffer-python () - "Send buffer at point to Python interpreter. " - (interactive) - (save-excursion - (let ((wholebuf t) - (py-master-file (or py-master-file (py-fetch-py-master-file))) - beg end) - (when py-master-file - (let* ((filename (expand-file-name py-master-file)) - (buffer (or (get-file-buffer filename) - (find-file-noselect filename)))) - (set-buffer buffer))) - (setq beg (point-min)) - (setq end (point-max)) - (py-execute-region beg end "python" nil nil)))) - -(defun py-execute-buffer-python-switch () - "Send buffer at point to Python interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (save-excursion - (let ((wholebuf t) - (py-master-file (or py-master-file (py-fetch-py-master-file))) - beg end) - (when py-master-file - (let* ((filename (expand-file-name py-master-file)) - (buffer (or (get-file-buffer filename) - (find-file-noselect filename)))) - (set-buffer buffer))) - (setq beg (point-min)) - (setq end (point-max)) - (py-execute-region beg end "python" nil 'switch)))) - -(defun py-execute-buffer-python-noswitch () - "Send buffer at point to Python interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (save-excursion - (let ((wholebuf t) - (py-master-file (or py-master-file (py-fetch-py-master-file))) - beg end) - (when py-master-file - (let* ((filename (expand-file-name py-master-file)) - (buffer (or (get-file-buffer filename) - (find-file-noselect filename)))) - (set-buffer buffer))) - (setq beg (point-min)) - (setq end (point-max)) - (py-execute-region beg end "python" nil 'noswitch)))) - -(defun py-execute-buffer-python-dedicated () - "Send buffer at point to Python unique interpreter. " - (interactive) - (save-excursion - (let ((wholebuf t) - (py-master-file (or py-master-file (py-fetch-py-master-file))) - beg end) - (when py-master-file - (let* ((filename (expand-file-name py-master-file)) - (buffer (or (get-file-buffer filename) - (find-file-noselect filename)))) - (set-buffer buffer))) - (setq beg (point-min)) - (setq end (point-max)) - (py-execute-region beg end "python" t nil)))) - -(defun py-execute-buffer-python-dedicated-switch () - "Send buffer at point to Python unique interpreter and switch to result. " - (interactive) - (save-excursion - (let ((wholebuf t) - (py-master-file (or py-master-file (py-fetch-py-master-file))) - beg end) - (when py-master-file - (let* ((filename (expand-file-name py-master-file)) - (buffer (or (get-file-buffer filename) - (find-file-noselect filename)))) - (set-buffer buffer))) - (setq beg (point-min)) - (setq end (point-max)) - (py-execute-region beg end "python" t 'switch)))) - -(defun py-execute-buffer-ipython () - "Send buffer at point to IPython interpreter. " - (interactive) - (save-excursion - (let ((wholebuf t) - (py-master-file (or py-master-file (py-fetch-py-master-file))) - beg end) - (when py-master-file - (let* ((filename (expand-file-name py-master-file)) - (buffer (or (get-file-buffer filename) - (find-file-noselect filename)))) - (set-buffer buffer))) - (setq beg (point-min)) - (setq end (point-max)) - (py-execute-region beg end "ipython" nil nil)))) - -(defun py-execute-buffer-ipython-switch () - "Send buffer at point to IPython interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (save-excursion - (let ((wholebuf t) - (py-master-file (or py-master-file (py-fetch-py-master-file))) - beg end) - (when py-master-file - (let* ((filename (expand-file-name py-master-file)) - (buffer (or (get-file-buffer filename) - (find-file-noselect filename)))) - (set-buffer buffer))) - (setq beg (point-min)) - (setq end (point-max)) - (py-execute-region beg end "ipython" nil 'switch)))) - -(defun py-execute-buffer-ipython-noswitch () - "Send buffer at point to IPython interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (save-excursion - (let ((wholebuf t) - (py-master-file (or py-master-file (py-fetch-py-master-file))) - beg end) - (when py-master-file - (let* ((filename (expand-file-name py-master-file)) - (buffer (or (get-file-buffer filename) - (find-file-noselect filename)))) - (set-buffer buffer))) - (setq beg (point-min)) - (setq end (point-max)) - (py-execute-region beg end "ipython" nil 'noswitch)))) - -(defun py-execute-buffer-ipython-dedicated () - "Send buffer at point to IPython unique interpreter. " - (interactive) - (save-excursion - (let ((wholebuf t) - (py-master-file (or py-master-file (py-fetch-py-master-file))) - beg end) - (when py-master-file - (let* ((filename (expand-file-name py-master-file)) - (buffer (or (get-file-buffer filename) - (find-file-noselect filename)))) - (set-buffer buffer))) - (setq beg (point-min)) - (setq end (point-max)) - (py-execute-region beg end "ipython" t nil)))) - -(defun py-execute-buffer-ipython-dedicated-switch () - "Send buffer at point to IPython unique interpreter and switch to result. " - (interactive) - (save-excursion - (let ((wholebuf t) - (py-master-file (or py-master-file (py-fetch-py-master-file))) - beg end) - (when py-master-file - (let* ((filename (expand-file-name py-master-file)) - (buffer (or (get-file-buffer filename) - (find-file-noselect filename)))) - (set-buffer buffer))) - (setq beg (point-min)) - (setq end (point-max)) - (py-execute-region beg end "ipython" t 'switch)))) - -(defun py-execute-buffer-python3 () - "Send buffer at point to Python3 interpreter. " - (interactive) - (save-excursion - (let ((wholebuf t) - (py-master-file (or py-master-file (py-fetch-py-master-file))) - beg end) - (when py-master-file - (let* ((filename (expand-file-name py-master-file)) - (buffer (or (get-file-buffer filename) - (find-file-noselect filename)))) - (set-buffer buffer))) - (setq beg (point-min)) - (setq end (point-max)) - (py-execute-region beg end "python3" nil nil)))) - -(defun py-execute-buffer-python3-switch () - "Send buffer at point to Python3 interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (save-excursion - (let ((wholebuf t) - (py-master-file (or py-master-file (py-fetch-py-master-file))) - beg end) - (when py-master-file - (let* ((filename (expand-file-name py-master-file)) - (buffer (or (get-file-buffer filename) - (find-file-noselect filename)))) - (set-buffer buffer))) - (setq beg (point-min)) - (setq end (point-max)) - (py-execute-region beg end "python3" nil 'switch)))) - -(defun py-execute-buffer-python3-noswitch () - "Send buffer at point to Python3 interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (save-excursion - (let ((wholebuf t) - (py-master-file (or py-master-file (py-fetch-py-master-file))) - beg end) - (when py-master-file - (let* ((filename (expand-file-name py-master-file)) - (buffer (or (get-file-buffer filename) - (find-file-noselect filename)))) - (set-buffer buffer))) - (setq beg (point-min)) - (setq end (point-max)) - (py-execute-region beg end "python3" nil 'noswitch)))) - -(defun py-execute-buffer-python3-dedicated () - "Send buffer at point to Python3 unique interpreter. " - (interactive) - (save-excursion - (let ((wholebuf t) - (py-master-file (or py-master-file (py-fetch-py-master-file))) - beg end) - (when py-master-file - (let* ((filename (expand-file-name py-master-file)) - (buffer (or (get-file-buffer filename) - (find-file-noselect filename)))) - (set-buffer buffer))) - (setq beg (point-min)) - (setq end (point-max)) - (py-execute-region beg end "python3" t nil)))) - -(defun py-execute-buffer-python3-dedicated-switch () - "Send buffer at point to Python3 unique interpreter and switch to result. " - (interactive) - (save-excursion - (let ((wholebuf t) - (py-master-file (or py-master-file (py-fetch-py-master-file))) - beg end) - (when py-master-file - (let* ((filename (expand-file-name py-master-file)) - (buffer (or (get-file-buffer filename) - (find-file-noselect filename)))) - (set-buffer buffer))) - (setq beg (point-min)) - (setq end (point-max)) - (py-execute-region beg end "python3" t 'switch)))) - -(defun py-execute-buffer-python2 () - "Send buffer at point to Python2 interpreter. " - (interactive) - (save-excursion - (let ((wholebuf t) - (py-master-file (or py-master-file (py-fetch-py-master-file))) - beg end) - (when py-master-file - (let* ((filename (expand-file-name py-master-file)) - (buffer (or (get-file-buffer filename) - (find-file-noselect filename)))) - (set-buffer buffer))) - (setq beg (point-min)) - (setq end (point-max)) - (py-execute-region beg end "python2" nil nil)))) - -(defun py-execute-buffer-python2-switch () - "Send buffer at point to Python2 interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (save-excursion - (let ((wholebuf t) - (py-master-file (or py-master-file (py-fetch-py-master-file))) - beg end) - (when py-master-file - (let* ((filename (expand-file-name py-master-file)) - (buffer (or (get-file-buffer filename) - (find-file-noselect filename)))) - (set-buffer buffer))) - (setq beg (point-min)) - (setq end (point-max)) - (py-execute-region beg end "python2" nil 'switch)))) - -(defun py-execute-buffer-python2-noswitch () - "Send buffer at point to Python2 interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (save-excursion - (let ((wholebuf t) - (py-master-file (or py-master-file (py-fetch-py-master-file))) - beg end) - (when py-master-file - (let* ((filename (expand-file-name py-master-file)) - (buffer (or (get-file-buffer filename) - (find-file-noselect filename)))) - (set-buffer buffer))) - (setq beg (point-min)) - (setq end (point-max)) - (py-execute-region beg end "python2" nil 'noswitch)))) - -(defun py-execute-buffer-python2-dedicated () - "Send buffer at point to Python2 unique interpreter. " - (interactive) - (save-excursion - (let ((wholebuf t) - (py-master-file (or py-master-file (py-fetch-py-master-file))) - beg end) - (when py-master-file - (let* ((filename (expand-file-name py-master-file)) - (buffer (or (get-file-buffer filename) - (find-file-noselect filename)))) - (set-buffer buffer))) - (setq beg (point-min)) - (setq end (point-max)) - (py-execute-region beg end "python2" t nil)))) - -(defun py-execute-buffer-python2-dedicated-switch () - "Send buffer at point to Python2 unique interpreter and switch to result. " - (interactive) - (save-excursion - (let ((wholebuf t) - (py-master-file (or py-master-file (py-fetch-py-master-file))) - beg end) - (when py-master-file - (let* ((filename (expand-file-name py-master-file)) - (buffer (or (get-file-buffer filename) - (find-file-noselect filename)))) - (set-buffer buffer))) - (setq beg (point-min)) - (setq end (point-max)) - (py-execute-region beg end "python2" t 'switch)))) - -(defun py-execute-buffer-python2.7 () - "Send buffer at point to Python2.7 interpreter. " - (interactive) - (save-excursion - (let ((wholebuf t) - (py-master-file (or py-master-file (py-fetch-py-master-file))) - beg end) - (when py-master-file - (let* ((filename (expand-file-name py-master-file)) - (buffer (or (get-file-buffer filename) - (find-file-noselect filename)))) - (set-buffer buffer))) - (setq beg (point-min)) - (setq end (point-max)) - (py-execute-region beg end "python2.7" nil nil)))) - -(defun py-execute-buffer-python2.7-switch () - "Send buffer at point to Python2.7 interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (save-excursion - (let ((wholebuf t) - (py-master-file (or py-master-file (py-fetch-py-master-file))) - beg end) - (when py-master-file - (let* ((filename (expand-file-name py-master-file)) - (buffer (or (get-file-buffer filename) - (find-file-noselect filename)))) - (set-buffer buffer))) - (setq beg (point-min)) - (setq end (point-max)) - (py-execute-region beg end "python2.7" nil 'switch)))) - -(defun py-execute-buffer-python2.7-noswitch () - "Send buffer at point to Python2.7 interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (save-excursion - (let ((wholebuf t) - (py-master-file (or py-master-file (py-fetch-py-master-file))) - beg end) - (when py-master-file - (let* ((filename (expand-file-name py-master-file)) - (buffer (or (get-file-buffer filename) - (find-file-noselect filename)))) - (set-buffer buffer))) - (setq beg (point-min)) - (setq end (point-max)) - (py-execute-region beg end "python2.7" nil 'noswitch)))) - -(defun py-execute-buffer-python2.7-dedicated () - "Send buffer at point to Python2.7 unique interpreter. " - (interactive) - (save-excursion - (let ((wholebuf t) - (py-master-file (or py-master-file (py-fetch-py-master-file))) - beg end) - (when py-master-file - (let* ((filename (expand-file-name py-master-file)) - (buffer (or (get-file-buffer filename) - (find-file-noselect filename)))) - (set-buffer buffer))) - (setq beg (point-min)) - (setq end (point-max)) - (py-execute-region beg end "python2.7" t nil)))) - -(defun py-execute-buffer-python2.7-dedicated-switch () - "Send buffer at point to Python2.7 unique interpreter and switch to result. " - (interactive) - (save-excursion - (let ((wholebuf t) - (py-master-file (or py-master-file (py-fetch-py-master-file))) - beg end) - (when py-master-file - (let* ((filename (expand-file-name py-master-file)) - (buffer (or (get-file-buffer filename) - (find-file-noselect filename)))) - (set-buffer buffer))) - (setq beg (point-min)) - (setq end (point-max)) - (py-execute-region beg end "python2.7" t 'switch)))) - -(defun py-execute-buffer-jython () - "Send buffer at point to Jython interpreter. " - (interactive) - (save-excursion - (let ((wholebuf t) - (py-master-file (or py-master-file (py-fetch-py-master-file))) - beg end) - (when py-master-file - (let* ((filename (expand-file-name py-master-file)) - (buffer (or (get-file-buffer filename) - (find-file-noselect filename)))) - (set-buffer buffer))) - (setq beg (point-min)) - (setq end (point-max)) - (py-execute-region beg end "jython" nil nil)))) - -(defun py-execute-buffer-jython-switch () - "Send buffer at point to Jython interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (save-excursion - (let ((wholebuf t) - (py-master-file (or py-master-file (py-fetch-py-master-file))) - beg end) - (when py-master-file - (let* ((filename (expand-file-name py-master-file)) - (buffer (or (get-file-buffer filename) - (find-file-noselect filename)))) - (set-buffer buffer))) - (setq beg (point-min)) - (setq end (point-max)) - (py-execute-region beg end "jython" nil 'switch)))) - -(defun py-execute-buffer-jython-noswitch () - "Send buffer at point to Jython interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (save-excursion - (let ((wholebuf t) - (py-master-file (or py-master-file (py-fetch-py-master-file))) - beg end) - (when py-master-file - (let* ((filename (expand-file-name py-master-file)) - (buffer (or (get-file-buffer filename) - (find-file-noselect filename)))) - (set-buffer buffer))) - (setq beg (point-min)) - (setq end (point-max)) - (py-execute-region beg end "jython" nil 'noswitch)))) - -(defun py-execute-buffer-jython-dedicated () - "Send buffer at point to Jython unique interpreter. " - (interactive) - (save-excursion - (let ((wholebuf t) - (py-master-file (or py-master-file (py-fetch-py-master-file))) - beg end) - (when py-master-file - (let* ((filename (expand-file-name py-master-file)) - (buffer (or (get-file-buffer filename) - (find-file-noselect filename)))) - (set-buffer buffer))) - (setq beg (point-min)) - (setq end (point-max)) - (py-execute-region beg end "jython" t nil)))) - -(defun py-execute-buffer-jython-dedicated-switch () - "Send buffer at point to Jython unique interpreter and switch to result. " - (interactive) - (save-excursion - (let ((wholebuf t) - (py-master-file (or py-master-file (py-fetch-py-master-file))) - beg end) - (when py-master-file - (let* ((filename (expand-file-name py-master-file)) - (buffer (or (get-file-buffer filename) - (find-file-noselect filename)))) - (set-buffer buffer))) - (setq beg (point-min)) - (setq end (point-max)) - (py-execute-region beg end "jython" t 'switch)))) - -(defun py-execute-buffer-python3.2 () - "Send buffer at point to Python3.2 interpreter. " - (interactive) - (save-excursion - (let ((wholebuf t) - (py-master-file (or py-master-file (py-fetch-py-master-file))) - beg end) - (when py-master-file - (let* ((filename (expand-file-name py-master-file)) - (buffer (or (get-file-buffer filename) - (find-file-noselect filename)))) - (set-buffer buffer))) - (setq beg (point-min)) - (setq end (point-max)) - (py-execute-region beg end "python3.2" nil nil)))) - -(defun py-execute-buffer-python3.2-switch () - "Send buffer at point to Python3.2 interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (save-excursion - (let ((wholebuf t) - (py-master-file (or py-master-file (py-fetch-py-master-file))) - beg end) - (when py-master-file - (let* ((filename (expand-file-name py-master-file)) - (buffer (or (get-file-buffer filename) - (find-file-noselect filename)))) - (set-buffer buffer))) - (setq beg (point-min)) - (setq end (point-max)) - (py-execute-region beg end "python3.2" nil 'switch)))) - -(defun py-execute-buffer-python3.2-noswitch () - "Send buffer at point to Python3.2 interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (save-excursion - (let ((wholebuf t) - (py-master-file (or py-master-file (py-fetch-py-master-file))) - beg end) - (when py-master-file - (let* ((filename (expand-file-name py-master-file)) - (buffer (or (get-file-buffer filename) - (find-file-noselect filename)))) - (set-buffer buffer))) - (setq beg (point-min)) - (setq end (point-max)) - (py-execute-region beg end "python3.2" nil 'noswitch)))) - -(defun py-execute-buffer-python3.2-dedicated () - "Send buffer at point to Python3.2 unique interpreter. " - (interactive) - (save-excursion - (let ((wholebuf t) - (py-master-file (or py-master-file (py-fetch-py-master-file))) - beg end) - (when py-master-file - (let* ((filename (expand-file-name py-master-file)) - (buffer (or (get-file-buffer filename) - (find-file-noselect filename)))) - (set-buffer buffer))) - (setq beg (point-min)) - (setq end (point-max)) - (py-execute-region beg end "python3.2" t nil)))) - -(defun py-execute-buffer-python3.2-dedicated-switch () - "Send buffer at point to Python3.2 unique interpreter and switch to result. " - (interactive) - (save-excursion - (let ((wholebuf t) - (py-master-file (or py-master-file (py-fetch-py-master-file))) - beg end) - (when py-master-file - (let* ((filename (expand-file-name py-master-file)) - (buffer (or (get-file-buffer filename) - (find-file-noselect filename)))) - (set-buffer buffer))) - (setq beg (point-min)) - (setq end (point-max)) - (py-execute-region beg end "python3.2" t 'switch)))) - -(defun py-execute-expression-python () - "Send expression at point to Python interpreter. " - (interactive) - (py-execute-prepare "expression" "python" nil nil)) - -(defun py-execute-expression-python-switch () - "Send expression at point to Python interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "expression" "python" nil 'switch)) - -(defun py-execute-expression-python-noswitch () - "Send expression at point to Python interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "expression" "python" nil 'noswitch)) - -(defun py-execute-expression-python-dedicated () - "Send expression at point to Python unique interpreter. " - (interactive) - (py-execute-prepare "expression" "python" t nil)) - -(defun py-execute-expression-python-dedicated-switch () - "Send expression at point to Python unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "expression" "python" t 'switch)) - -(defun py-execute-expression-ipython () - "Send expression at point to IPython interpreter. " - (interactive) - (py-execute-prepare "expression" "ipython" nil nil)) - -(defun py-execute-expression-ipython-switch () - "Send expression at point to IPython interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "expression" "ipython" nil 'switch)) - -(defun py-execute-expression-ipython-noswitch () - "Send expression at point to IPython interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "expression" "ipython" nil 'noswitch)) - -(defun py-execute-expression-ipython-dedicated () - "Send expression at point to IPython unique interpreter. " - (interactive) - (py-execute-prepare "expression" "ipython" t nil)) - -(defun py-execute-expression-ipython-dedicated-switch () - "Send expression at point to IPython unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "expression" "ipython" t 'switch)) - -(defun py-execute-expression-python3 () - "Send expression at point to Python3 interpreter. " - (interactive) - (py-execute-prepare "expression" "python3" nil nil)) - -(defun py-execute-expression-python3-switch () - "Send expression at point to Python3 interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "expression" "python3" nil 'switch)) - -(defun py-execute-expression-python3-noswitch () - "Send expression at point to Python3 interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "expression" "python3" nil 'noswitch)) - -(defun py-execute-expression-python3-dedicated () - "Send expression at point to Python3 unique interpreter. " - (interactive) - (py-execute-prepare "expression" "python3" t nil)) - -(defun py-execute-expression-python3-dedicated-switch () - "Send expression at point to Python3 unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "expression" "python3" t 'switch)) - -(defun py-execute-expression-python2 () - "Send expression at point to Python2 interpreter. " - (interactive) - (py-execute-prepare "expression" "python2" nil nil)) - -(defun py-execute-expression-python2-switch () - "Send expression at point to Python2 interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "expression" "python2" nil 'switch)) - -(defun py-execute-expression-python2-noswitch () - "Send expression at point to Python2 interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "expression" "python2" nil 'noswitch)) - -(defun py-execute-expression-python2-dedicated () - "Send expression at point to Python2 unique interpreter. " - (interactive) - (py-execute-prepare "expression" "python2" t nil)) - -(defun py-execute-expression-python2-dedicated-switch () - "Send expression at point to Python2 unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "expression" "python2" t 'switch)) - -(defun py-execute-expression-python2.7 () - "Send expression at point to Python2.7 interpreter. " - (interactive) - (py-execute-prepare "expression" "python2.7" nil nil)) - -(defun py-execute-expression-python2.7-switch () - "Send expression at point to Python2.7 interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "expression" "python2.7" nil 'switch)) - -(defun py-execute-expression-python2.7-noswitch () - "Send expression at point to Python2.7 interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "expression" "python2.7" nil 'noswitch)) - -(defun py-execute-expression-python2.7-dedicated () - "Send expression at point to Python2.7 unique interpreter. " - (interactive) - (py-execute-prepare "expression" "python2.7" t nil)) - -(defun py-execute-expression-python2.7-dedicated-switch () - "Send expression at point to Python2.7 unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "expression" "python2.7" t 'switch)) - -(defun py-execute-expression-jython () - "Send expression at point to Jython interpreter. " - (interactive) - (py-execute-prepare "expression" "jython" nil nil)) - -(defun py-execute-expression-jython-switch () - "Send expression at point to Jython interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "expression" "jython" nil 'switch)) - -(defun py-execute-expression-jython-noswitch () - "Send expression at point to Jython interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "expression" "jython" nil 'noswitch)) - -(defun py-execute-expression-jython-dedicated () - "Send expression at point to Jython unique interpreter. " - (interactive) - (py-execute-prepare "expression" "jython" t nil)) - -(defun py-execute-expression-jython-dedicated-switch () - "Send expression at point to Jython unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "expression" "jython" t 'switch)) - -(defun py-execute-expression-python3.2 () - "Send expression at point to Python3.2 interpreter. " - (interactive) - (py-execute-prepare "expression" "python3.2" nil nil)) - -(defun py-execute-expression-python3.2-switch () - "Send expression at point to Python3.2 interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "expression" "python3.2" nil 'switch)) - -(defun py-execute-expression-python3.2-noswitch () - "Send expression at point to Python3.2 interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "expression" "python3.2" nil 'noswitch)) - -(defun py-execute-expression-python3.2-dedicated () - "Send expression at point to Python3.2 unique interpreter. " - (interactive) - (py-execute-prepare "expression" "python3.2" t nil)) - -(defun py-execute-expression-python3.2-dedicated-switch () - "Send expression at point to Python3.2 unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "expression" "python3.2" t 'switch)) - -(defun py-execute-partial-expression-python () - "Send partial-expression at point to Python interpreter. " - (interactive) - (py-execute-prepare "partial-expression" "python" nil nil)) - -(defun py-execute-partial-expression-python-switch () - "Send partial-expression at point to Python interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "partial-expression" "python" nil 'switch)) - -(defun py-execute-partial-expression-python-noswitch () - "Send partial-expression at point to Python interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "partial-expression" "python" nil 'noswitch)) - -(defun py-execute-partial-expression-python-dedicated () - "Send partial-expression at point to Python unique interpreter. " - (interactive) - (py-execute-prepare "partial-expression" "python" t nil)) - -(defun py-execute-partial-expression-python-dedicated-switch () - "Send partial-expression at point to Python unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "partial-expression" "python" t 'switch)) - -(defun py-execute-partial-expression-ipython () - "Send partial-expression at point to IPython interpreter. " - (interactive) - (py-execute-prepare "partial-expression" "ipython" nil nil)) - -(defun py-execute-partial-expression-ipython-switch () - "Send partial-expression at point to IPython interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "partial-expression" "ipython" nil 'switch)) - -(defun py-execute-partial-expression-ipython-noswitch () - "Send partial-expression at point to IPython interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "partial-expression" "ipython" nil 'noswitch)) - -(defun py-execute-partial-expression-ipython-dedicated () - "Send partial-expression at point to IPython unique interpreter. " - (interactive) - (py-execute-prepare "partial-expression" "ipython" t nil)) - -(defun py-execute-partial-expression-ipython-dedicated-switch () - "Send partial-expression at point to IPython unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "partial-expression" "ipython" t 'switch)) - -(defun py-execute-partial-expression-python3 () - "Send partial-expression at point to Python3 interpreter. " - (interactive) - (py-execute-prepare "partial-expression" "python3" nil nil)) - -(defun py-execute-partial-expression-python3-switch () - "Send partial-expression at point to Python3 interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "partial-expression" "python3" nil 'switch)) - -(defun py-execute-partial-expression-python3-noswitch () - "Send partial-expression at point to Python3 interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "partial-expression" "python3" nil 'noswitch)) - -(defun py-execute-partial-expression-python3-dedicated () - "Send partial-expression at point to Python3 unique interpreter. " - (interactive) - (py-execute-prepare "partial-expression" "python3" t nil)) - -(defun py-execute-partial-expression-python3-dedicated-switch () - "Send partial-expression at point to Python3 unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "partial-expression" "python3" t 'switch)) - -(defun py-execute-partial-expression-python2 () - "Send partial-expression at point to Python2 interpreter. " - (interactive) - (py-execute-prepare "partial-expression" "python2" nil nil)) - -(defun py-execute-partial-expression-python2-switch () - "Send partial-expression at point to Python2 interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "partial-expression" "python2" nil 'switch)) - -(defun py-execute-partial-expression-python2-noswitch () - "Send partial-expression at point to Python2 interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "partial-expression" "python2" nil 'noswitch)) - -(defun py-execute-partial-expression-python2-dedicated () - "Send partial-expression at point to Python2 unique interpreter. " - (interactive) - (py-execute-prepare "partial-expression" "python2" t nil)) - -(defun py-execute-partial-expression-python2-dedicated-switch () - "Send partial-expression at point to Python2 unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "partial-expression" "python2" t 'switch)) - -(defun py-execute-partial-expression-python2.7 () - "Send partial-expression at point to Python2.7 interpreter. " - (interactive) - (py-execute-prepare "partial-expression" "python2.7" nil nil)) - -(defun py-execute-partial-expression-python2.7-switch () - "Send partial-expression at point to Python2.7 interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "partial-expression" "python2.7" nil 'switch)) - -(defun py-execute-partial-expression-python2.7-noswitch () - "Send partial-expression at point to Python2.7 interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "partial-expression" "python2.7" nil 'noswitch)) - -(defun py-execute-partial-expression-python2.7-dedicated () - "Send partial-expression at point to Python2.7 unique interpreter. " - (interactive) - (py-execute-prepare "partial-expression" "python2.7" t nil)) - -(defun py-execute-partial-expression-python2.7-dedicated-switch () - "Send partial-expression at point to Python2.7 unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "partial-expression" "python2.7" t 'switch)) - -(defun py-execute-partial-expression-jython () - "Send partial-expression at point to Jython interpreter. " - (interactive) - (py-execute-prepare "partial-expression" "jython" nil nil)) - -(defun py-execute-partial-expression-jython-switch () - "Send partial-expression at point to Jython interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "partial-expression" "jython" nil 'switch)) - -(defun py-execute-partial-expression-jython-noswitch () - "Send partial-expression at point to Jython interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "partial-expression" "jython" nil 'noswitch)) - -(defun py-execute-partial-expression-jython-dedicated () - "Send partial-expression at point to Jython unique interpreter. " - (interactive) - (py-execute-prepare "partial-expression" "jython" t nil)) - -(defun py-execute-partial-expression-jython-dedicated-switch () - "Send partial-expression at point to Jython unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "partial-expression" "jython" t 'switch)) - -(defun py-execute-partial-expression-python3.2 () - "Send partial-expression at point to Python3.2 interpreter. " - (interactive) - (py-execute-prepare "partial-expression" "python3.2" nil nil)) - -(defun py-execute-partial-expression-python3.2-switch () - "Send partial-expression at point to Python3.2 interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "partial-expression" "python3.2" nil 'switch)) - -(defun py-execute-partial-expression-python3.2-noswitch () - "Send partial-expression at point to Python3.2 interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "partial-expression" "python3.2" nil 'noswitch)) - -(defun py-execute-partial-expression-python3.2-dedicated () - "Send partial-expression at point to Python3.2 unique interpreter. " - (interactive) - (py-execute-prepare "partial-expression" "python3.2" t nil)) - -(defun py-execute-partial-expression-python3.2-dedicated-switch () - "Send partial-expression at point to Python3.2 unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "partial-expression" "python3.2" t 'switch)) - -(defun py-execute-line-python () - "Send line at point to Python interpreter. " - (interactive) - (py-execute-prepare "line" "python" nil nil)) - -(defun py-execute-line-python-switch () - "Send line at point to Python interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "line" "python" nil 'switch)) - -(defun py-execute-line-python-noswitch () - "Send line at point to Python interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "line" "python" nil 'noswitch)) - -(defun py-execute-line-python-dedicated () - "Send line at point to Python unique interpreter. " - (interactive) - (py-execute-prepare "line" "python" t nil)) - -(defun py-execute-line-python-dedicated-switch () - "Send line at point to Python unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "line" "python" t 'switch)) - -(defun py-execute-line-ipython () - "Send line at point to IPython interpreter. " - (interactive) - (py-execute-prepare "line" "ipython" nil nil)) - -(defun py-execute-line-ipython-switch () - "Send line at point to IPython interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "line" "ipython" nil 'switch)) - -(defun py-execute-line-ipython-noswitch () - "Send line at point to IPython interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "line" "ipython" nil 'noswitch)) - -(defun py-execute-line-ipython-dedicated () - "Send line at point to IPython unique interpreter. " - (interactive) - (py-execute-prepare "line" "ipython" t nil)) - -(defun py-execute-line-ipython-dedicated-switch () - "Send line at point to IPython unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "line" "ipython" t 'switch)) - -(defun py-execute-line-python3 () - "Send line at point to Python3 interpreter. " - (interactive) - (py-execute-prepare "line" "python3" nil nil)) - -(defun py-execute-line-python3-switch () - "Send line at point to Python3 interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "line" "python3" nil 'switch)) - -(defun py-execute-line-python3-noswitch () - "Send line at point to Python3 interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "line" "python3" nil 'noswitch)) - -(defun py-execute-line-python3-dedicated () - "Send line at point to Python3 unique interpreter. " - (interactive) - (py-execute-prepare "line" "python3" t nil)) - -(defun py-execute-line-python3-dedicated-switch () - "Send line at point to Python3 unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "line" "python3" t 'switch)) - -(defun py-execute-line-python2 () - "Send line at point to Python2 interpreter. " - (interactive) - (py-execute-prepare "line" "python2" nil nil)) - -(defun py-execute-line-python2-switch () - "Send line at point to Python2 interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "line" "python2" nil 'switch)) - -(defun py-execute-line-python2-noswitch () - "Send line at point to Python2 interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "line" "python2" nil 'noswitch)) - -(defun py-execute-line-python2-dedicated () - "Send line at point to Python2 unique interpreter. " - (interactive) - (py-execute-prepare "line" "python2" t nil)) - -(defun py-execute-line-python2-dedicated-switch () - "Send line at point to Python2 unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "line" "python2" t 'switch)) - -(defun py-execute-line-python2.7 () - "Send line at point to Python2.7 interpreter. " - (interactive) - (py-execute-prepare "line" "python2.7" nil nil)) - -(defun py-execute-line-python2.7-switch () - "Send line at point to Python2.7 interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "line" "python2.7" nil 'switch)) - -(defun py-execute-line-python2.7-noswitch () - "Send line at point to Python2.7 interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "line" "python2.7" nil 'noswitch)) - -(defun py-execute-line-python2.7-dedicated () - "Send line at point to Python2.7 unique interpreter. " - (interactive) - (py-execute-prepare "line" "python2.7" t nil)) - -(defun py-execute-line-python2.7-dedicated-switch () - "Send line at point to Python2.7 unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "line" "python2.7" t 'switch)) - -(defun py-execute-line-jython () - "Send line at point to Jython interpreter. " - (interactive) - (py-execute-prepare "line" "jython" nil nil)) - -(defun py-execute-line-jython-switch () - "Send line at point to Jython interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "line" "jython" nil 'switch)) - -(defun py-execute-line-jython-noswitch () - "Send line at point to Jython interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "line" "jython" nil 'noswitch)) - -(defun py-execute-line-jython-dedicated () - "Send line at point to Jython unique interpreter. " - (interactive) - (py-execute-prepare "line" "jython" t nil)) - -(defun py-execute-line-jython-dedicated-switch () - "Send line at point to Jython unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "line" "jython" t 'switch)) - -(defun py-execute-line-python3.2 () - "Send line at point to Python3.2 interpreter. " - (interactive) - (py-execute-prepare "line" "python3.2" nil nil)) - -(defun py-execute-line-python3.2-switch () - "Send line at point to Python3.2 interpreter. - -Switch to output buffer. Ignores `py-shell-switch-buffers-on-execute-p'. " - (interactive) - (py-execute-prepare "line" "python3.2" nil 'switch)) - -(defun py-execute-line-python3.2-noswitch () - "Send line at point to Python3.2 interpreter. - -Keep current buffer. Ignores `py-shell-switch-buffers-on-execute-p' " - (interactive) - (py-execute-prepare "line" "python3.2" nil 'noswitch)) - -(defun py-execute-line-python3.2-dedicated () - "Send line at point to Python3.2 unique interpreter. " - (interactive) - (py-execute-prepare "line" "python3.2" t nil)) - -(defun py-execute-line-python3.2-dedicated-switch () - "Send line at point to Python3.2 unique interpreter and switch to result. " - (interactive) - (py-execute-prepare "line" "python3.2" t 'switch)) - -;;; Column-marker - highlight columns -;; merged from column-marker.el, -;; Created: Tue Nov 22 10:26:03 2005 -;; Last-Updated: Fri Jan 22 11:28:48 2010 (-0800) By: dradams -;; original Author: Rick Bielawski <rbielaws@i1.net> - -(defface column-marker-1 '((t (:background "gray"))) - "Face used for a column marker. Usually a background color." - :group 'faces) - -(defvar column-marker-1-face 'column-marker-1 - "Face used for a column marker. Usually a background color. -Changing this directly affects only new markers.") - -(defface column-marker-2 '((t (:background "cyan3"))) - "Face used for a column marker. Usually a background color." - :group 'faces) - -(defvar column-marker-2-face 'column-marker-2 - "Face used for a column marker. Usually a background color. -Changing this directly affects only new markers." ) - -(defface column-marker-3 '((t (:background "orchid3"))) - "Face used for a column marker. Usually a background color." - :group 'faces) - -(defvar column-marker-3-face 'column-marker-3 - "Face used for a column marker. Usually a background color. -Changing this directly affects only new markers." ) - -(defvar column-marker-vars () - "List of all internal column-marker variables") -(make-variable-buffer-local 'column-marker-vars) ; Buffer local in all buffers. - -(defmacro column-marker-create (var &optional face) - "Define a column marker named VAR. -FACE is the face to use. If nil, then face `column-marker-1' is used." - (setq face (or face 'column-marker-1)) - `(progn - ;; define context variable ,VAR so marker can be removed if desired - (defvar ,var () - "Buffer local. Used internally to store column marker spec.") - ;; context must be buffer local since font-lock is - (make-variable-buffer-local ',var) - ;; Define wrapper function named ,VAR to call `column-marker-internal' - (defun ,var (arg) - ,(concat "Highlight column with face `" (symbol-name face) - "'.\nWith no prefix argument, highlight current column.\n" - "With non-negative numeric prefix arg, highlight that column number.\n" - "With plain `C-u' (no number), turn off this column marker.\n" - "With `C-u C-u' or negative prefix arg, turn off all column-marker highlighting.") - (interactive "P") - (unless (memq ',var column-marker-vars) (push ',var column-marker-vars)) - (cond ((null arg) ; Default: highlight current column. - (column-marker-internal ',var (1+ (current-column)) ,face)) - ((consp arg) - (if (= 4 (car arg)) - (column-marker-internal ',var nil) ; `C-u': Remove this column highlighting. - (dolist (var column-marker-vars) - (column-marker-internal var nil)))) ; `C-u C-u': Remove all column highlighting. - ((and (integerp arg) (>= arg 0)) ; `C-u 70': Highlight that column. - (column-marker-internal ',var (1+ (prefix-numeric-value arg)) ,face)) - (t ; `C-u -40': Remove all column highlighting. - (dolist (var column-marker-vars) - (column-marker-internal var nil))))))) - -(defun column-marker-find (col) - "Defines a function to locate a character in column COL. -Returns the function symbol, named `column-marker-move-to-COL'." - (let ((fn-symb (intern (format "column-marker-move-to-%d" col)))) - (fset `,fn-symb - `(lambda (end) - (let ((start (point))) - (when (> end (point-max)) (setq end (point-max))) - - ;; Try to keep `move-to-column' from going backward, though it still can. - (unless (< (current-column) ,col) (forward-line 1)) - - ;; Again, don't go backward. Try to move to correct column. - (when (< (current-column) ,col) (move-to-column ,col)) - - ;; If not at target column, try to move to it. - (while (and (< (current-column) ,col) (< (point) end) - (= 0 (+ (forward-line 1) (current-column)))) ; Should be bol. - (move-to-column ,col)) - - ;; If at target column, not past end, and not prior to start, - ;; then set match data and return t. Otherwise go to start - ;; and return nil. - (if (and (= ,col (current-column)) (<= (point) end) (> (point) start)) - (progn (set-match-data (list (1- (point)) (point))) - t) ; Return t. - (goto-char start) - nil)))) ; Return nil. - fn-symb)) - -(defun column-marker-internal (sym col &optional face) - "SYM is the symbol for holding the column marker context. -COL is the column in which a marker should be set. -Supplying nil or 0 for COL turns off the marker. -FACE is the face to use. If nil, then face `column-marker-1' is used." - (setq face (or face 'column-marker-1)) - (when (symbol-value sym) ; Remove any previously set column marker - (font-lock-remove-keywords nil (symbol-value sym)) - (set sym nil)) - (when (or (listp col) (< col 0)) (setq col nil)) ; Allow nonsense stuff to turn off the marker - (when col ; Generate a new column marker - (set sym `((,(column-marker-find col) (0 ',face prepend t)))) - (font-lock-add-keywords nil (symbol-value sym) t)) - (font-lock-fontify-buffer)) - -;; If you need more markers you can create your own similarly. -;; All markers can be in use at once, and each is buffer-local, -;; so there is no good reason to define more unless you need more -;; markers in a single buffer. -(column-marker-create column-marker-1 column-marker-1-face) -(column-marker-create column-marker-2 column-marker-2-face) -(column-marker-create column-marker-3 column-marker-3-face) - -;; (autoload 'column-marker-1 "column-marker" "Highlight a column." t) - -(defalias 'ipython-send-and-indent 'py-execute-line-ipython) -(defalias 'py-execute-region-in-shell 'py-execute-region) -(defalias 'py-shell-command-on-region 'py-execute-region-region) -(defalias 'py-send-region-ipython 'py-execute-region-ipython) -(defalias 'py-ipython-shell-command-on-region 'py-execute-region-ipython) -(provide 'python-mode) -;;; python-mode.el ends here